package com.ylx.web.controller.massage; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ylx.common.annotation.Log; import com.ylx.common.constant.Constants; import com.ylx.common.core.controller.BaseController; import com.ylx.common.core.domain.R; import com.ylx.common.core.domain.model.WxLoginUser; import com.ylx.common.enums.BusinessType; import com.ylx.common.utils.MessageUtils; import com.ylx.common.utils.StringUtils; import com.ylx.framework.manager.AsyncManager; import com.ylx.framework.manager.factory.AsyncFactory; import com.ylx.framework.web.service.WxTokenService; import com.ylx.massage.domain.CouponReceive; import com.ylx.massage.domain.TWxUser; import com.ylx.massage.service.CouponReceiveService; import com.ylx.massage.service.TWxUserService; import com.ylx.massage.utils.WeChatUtil; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Map; /** * @author b16mt */ @Slf4j @Controller @Api(tags = {"微信公众号sq"}) @RequestMapping("/sq") public class WeSqController extends BaseController { private final static String ACCESS_TOKEN = "access_token"; private final static String REFRESH_TOKEN = "refresh_token"; private final static String OPEN_ID = "openid"; @Resource private WeChatUtil weChatUtil; @Resource private TWxUserService wxUserService; @Resource(name = "commonAsyncExecutor") private ThreadPoolTaskExecutor threadPoolTaskExecutor; @Autowired private CouponReceiveService couponReceiveService; @Resource private WxTokenService wxTokenService; /** * 获取token和userInfo * * @param code 微信授权码 * @return 访问令牌 */ @GetMapping("/getAccessToken") @Log(title = "公众号网页登录", businessType = BusinessType.OTHER) public R getAccessToken(@RequestParam String code) { // 发送get请求获取 AccessToken Map result = weChatUtil.getAccessToken(code); String accessToken = result.get(ACCESS_TOKEN).toString(); String refreshToken = result.get(REFRESH_TOKEN).toString(); String openid = result.get(OPEN_ID).toString(); // 如果用户是第一次进行微信公众号授权 // 进行这一步时用户应点击了同意授权按钮 String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid); // 解析JSON数据 JSONObject jsonObject = new JSONObject(userInfoJsom); log.info("公众号网页登录,{}",jsonObject); // 将用户信息保存到数据库中 LambdaQueryWrapper objectLambdaQueryWrapper = new LambdaQueryWrapper<>(); objectLambdaQueryWrapper.eq(TWxUser::getcOpenid, openid); TWxUser user = wxUserService.getOne(objectLambdaQueryWrapper); if (user == null || StringUtils.isEmpty(user.getcNickName())) { if(user == null){ user = new TWxUser(); user.setcOpenid(openid); TWxUser finalUser = user; //异步 添加新人优惠卷 // threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1"))); } user.setcOpenid(openid); user.setcNickName(jsonObject.get("nickname").toString()); user.setcIcon(jsonObject.get("headimgurl").toString()); user.setcSessionKey(refreshToken); // user.setcPhone(phoneNumber); wxUserService.saveOrUpdate(user); user.setId(user.getId()); } WxLoginUser wxUser = new WxLoginUser(); BeanUtils.copyProperties(user, wxUser); // 生成并返回令牌 String token = wxTokenService.createToken(wxUser); if (token == null || token.isEmpty()) { return R.fail("生成令牌失败"); } wxUser.setToken(token); // 返回用户信息 // 记录登录信息 AsyncManager.me().execute(AsyncFactory.recordLogininfor(wxUser.getCOpenid(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); return R.ok(wxUser); } }