|
@@ -1,43 +1,40 @@
|
|
|
package com.fs.app.controller;
|
|
|
|
|
|
+import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
|
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
|
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
|
|
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
-import cn.hutool.core.util.StrUtil;
|
|
|
import com.fs.app.annotation.Login;
|
|
|
import com.fs.app.utils.JwtUtils;
|
|
|
import com.fs.common.core.domain.R;
|
|
|
-import com.fs.common.core.redis.RedisCache;
|
|
|
import com.fs.common.exception.CustomException;
|
|
|
-import com.fs.common.utils.OrderUtils;
|
|
|
-import com.fs.store.param.LoginMpWxParam;
|
|
|
import com.fs.common.utils.IpUtil;
|
|
|
-import com.fs.wx.miniapp.config.WxMaConfiguration;
|
|
|
-import com.fs.wx.miniapp.config.WxMaProperties;
|
|
|
+import com.fs.common.utils.OrderUtils;
|
|
|
import com.fs.store.domain.FsUser;
|
|
|
+import com.fs.store.param.LoginMpWxParam;
|
|
|
import com.fs.store.param.LoginWxParam;
|
|
|
import com.fs.store.service.IFsUserService;
|
|
|
-import com.fs.wx.mp.config.WxMpConfiguration;
|
|
|
+import com.fs.wx.miniapp.config.WxMaConfiguration;
|
|
|
+import com.fs.wx.miniapp.config.WxMaProperties;
|
|
|
import com.fs.wx.mp.config.WxMpProperties;
|
|
|
import io.swagger.annotations.Api;
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
|
import lombok.Synchronized;
|
|
|
import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
|
|
|
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
|
|
|
+import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
import me.chanjar.weixin.mp.api.WxMpService;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.springframework.web.bind.annotation.*;
|
|
|
-
|
|
|
-import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
|
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
|
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
|
|
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
|
|
|
-import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
import java.util.Date;
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
|
* 微信小程序用户接口
|
|
@@ -66,103 +63,187 @@ public class WxUserController extends AppBaseController{
|
|
|
*/
|
|
|
@ApiOperation("登录")
|
|
|
@PostMapping("/login")
|
|
|
- public R login( @RequestBody LoginMpWxParam param) {
|
|
|
+ public R login(@RequestBody LoginMpWxParam param) {
|
|
|
if (StringUtils.isBlank(param.getCode())) {
|
|
|
return R.error("code不存在");
|
|
|
}
|
|
|
+
|
|
|
final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
|
|
|
try {
|
|
|
+ // 获取微信会话信息
|
|
|
WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
|
|
|
- this.logger.info(session.getSessionKey());
|
|
|
- this.logger.info(session.getOpenid());
|
|
|
- // 解密
|
|
|
- WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
|
|
|
- FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
|
|
|
+ logger.info("获取微信会话信息成功 - openid: {}, sessionKey: {}", session.getOpenid(), session.getSessionKey());
|
|
|
+
|
|
|
+ // 获取手机号信息
|
|
|
+ WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(
|
|
|
+ session.getSessionKey(),
|
|
|
+ param.getEncryptedData(),
|
|
|
+ param.getIv()
|
|
|
+ );
|
|
|
+ logger.info("获取手机号信息成功 - phone: {}", phoneNoInfo.getPhoneNumber());
|
|
|
+
|
|
|
+ // 获取用户IP
|
|
|
String ip = IpUtil.getRequestIp();
|
|
|
- if(user==null){
|
|
|
- //查询手机号是否存在,如果存在,更新
|
|
|
- FsUser checkPhone=userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
|
|
|
- if(checkPhone!=null){
|
|
|
- if(checkPhone.getMaOpenId()==null){
|
|
|
- user=checkPhone;
|
|
|
- FsUser userMap=new FsUser();
|
|
|
- userMap.setMaOpenId(session.getOpenid());
|
|
|
- userMap.setUserId(checkPhone.getUserId());
|
|
|
- userMap.setUpdateTime(new DateTime());
|
|
|
- userMap.setLastIp(ip);
|
|
|
- userService.updateFsUser(userMap);
|
|
|
- }
|
|
|
- else{
|
|
|
- throw new CustomException("此手机号已存在");
|
|
|
- }
|
|
|
- }
|
|
|
- else{
|
|
|
- //写入
|
|
|
- user=new FsUser();
|
|
|
- if(StringUtils.isNotEmpty(param.getUserCode())){
|
|
|
- FsUser tuiUser=userService.selectFsUserByUserCode(param.getUserCode());
|
|
|
- if(tuiUser!=null){
|
|
|
- user.setIsPromoter(1);
|
|
|
- user.setSpreadUserId(tuiUser.getUserId());
|
|
|
- }
|
|
|
- }
|
|
|
- user.setUserCode(OrderUtils.genUserCode());
|
|
|
- user.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
- user.setUsername(phoneNoInfo.getPhoneNumber());
|
|
|
- user.setNickname("微信用户");
|
|
|
- user.setStatus(1);
|
|
|
- user.setMaOpenId(session.getOpenid());
|
|
|
- user.setLastIp(ip);
|
|
|
- user.setIsWeixinAuth(0);
|
|
|
- user.setCreateTime(new Date());
|
|
|
- userService.insertFsUser(user);
|
|
|
- }
|
|
|
- }
|
|
|
- else{
|
|
|
- FsUser userMap=new FsUser();
|
|
|
- userMap.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
- userMap.setUserId(user.getUserId());
|
|
|
- userMap.setUpdateTime(new DateTime());
|
|
|
- userMap.setLastIp(ip);
|
|
|
- userService.updateFsUser(userMap);
|
|
|
- }
|
|
|
- String token = jwtUtils.generateToken(user.getUserId());
|
|
|
- return R.ok("登录成功").put("token",token).put("user", user);
|
|
|
+
|
|
|
+ // 查找或创建用户
|
|
|
+ FsUser user = findOrCreateUser(session, phoneNoInfo, ip, param.getUserCode());
|
|
|
+
|
|
|
+ // 生成token
|
|
|
+ String token = jwtUtils.generateToken(user.getUserId());
|
|
|
+
|
|
|
+ // 记录登录日志
|
|
|
+ logger.info("用户登录成功 - userId: {}, phone: {}", user.getUserId(), user.getPhone());
|
|
|
+
|
|
|
+ return R.ok("登录成功")
|
|
|
+ .put("token", token)
|
|
|
+ .put("user", user);
|
|
|
+
|
|
|
} catch (WxErrorException e) {
|
|
|
- //this.logger.error(e.getMessage(), e);
|
|
|
- return R.error("授权失败,"+e.getMessage());
|
|
|
+ logger.error("微信授权失败: {}", e.getMessage(), e);
|
|
|
+ return R.error("授权失败: " + e.getMessage());
|
|
|
+ } catch (CustomException e) {
|
|
|
+ logger.error("业务处理异常: {}", e.getMessage(), e);
|
|
|
+ return R.error(e.getMessage());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("系统异常: {}", e.getMessage(), e);
|
|
|
+ return R.error("系统异常,请稍后重试");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查找或创建用户
|
|
|
+ */
|
|
|
+ private FsUser findOrCreateUser(WxMaJscode2SessionResult session,
|
|
|
+ WxMaPhoneNumberInfo phoneNoInfo,
|
|
|
+ String ip,
|
|
|
+ String userCode) {
|
|
|
+ // 优先通过unionid查找用户
|
|
|
+ FsUser user = null;
|
|
|
+ if (session.getUnionid() != null) {
|
|
|
+ user = userService.selectFsUserByUnionid(session.getUnionid());
|
|
|
+ if (user == null) {
|
|
|
+ user = userService.selectFsUserByMaOpenId(session.getOpenid());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ user = userService.selectFsUserByMaOpenId(session.getOpenid());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (user == null) {
|
|
|
+ // 检查手机号是否已存在
|
|
|
+ FsUser checkPhone = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
|
|
|
+ if (checkPhone != null) {
|
|
|
+ if (checkPhone.getMaOpenId() == null) {
|
|
|
+ // 更新已存在用户的信息
|
|
|
+ user = updateExistingUser(checkPhone, session, ip);
|
|
|
+ } else {
|
|
|
+ throw new CustomException("此手机号已被其他微信账号绑定");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 创建新用户
|
|
|
+ user = createNewUser(session, phoneNoInfo, ip, userCode);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 更新用户信息
|
|
|
+ updateUserInfo(user, phoneNoInfo, ip);
|
|
|
+ }
|
|
|
+
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新已存在用户的信息
|
|
|
+ */
|
|
|
+ private FsUser updateExistingUser(FsUser existingUser, WxMaJscode2SessionResult session, String ip) {
|
|
|
+ FsUser userMap = new FsUser();
|
|
|
+ userMap.setMaOpenId(session.getOpenid());
|
|
|
+ userMap.setUserId(existingUser.getUserId());
|
|
|
+ userMap.setUpdateTime(new DateTime());
|
|
|
+ userMap.setLastIp(ip);
|
|
|
+ if (session.getUnionid() != null) {
|
|
|
+ userMap.setUnionId(session.getUnionid());
|
|
|
+ }
|
|
|
+ userService.updateFsUser(userMap);
|
|
|
+ return existingUser;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建新用户
|
|
|
+ */
|
|
|
+ private FsUser createNewUser(WxMaJscode2SessionResult session,
|
|
|
+ WxMaPhoneNumberInfo phoneNoInfo,
|
|
|
+ String ip,
|
|
|
+ String userCode) {
|
|
|
+ FsUser user = new FsUser();
|
|
|
+
|
|
|
+ // 处理推荐关系
|
|
|
+ if (StringUtils.isNotEmpty(userCode)) {
|
|
|
+ FsUser tuiUser = userService.selectFsUserByUserCode(userCode);
|
|
|
+ if (tuiUser != null) {
|
|
|
+ user.setIsPromoter(1);
|
|
|
+ user.setSpreadUserId(tuiUser.getUserId());
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ // 设置用户基本信息
|
|
|
+ user.setUserCode(OrderUtils.genUserCode());
|
|
|
+ user.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
+ user.setUsername(phoneNoInfo.getPhoneNumber());
|
|
|
+ user.setNickname("微信用户");
|
|
|
+ user.setStatus(1);
|
|
|
+ user.setMaOpenId(session.getOpenid());
|
|
|
+ user.setLastIp(ip);
|
|
|
+ user.setIsWeixinAuth(0);
|
|
|
+ user.setCreateTime(new Date());
|
|
|
+
|
|
|
+ if (session.getUnionid() != null) {
|
|
|
+ user.setUnionId(session.getUnionid());
|
|
|
+ }
|
|
|
+
|
|
|
+ userService.insertFsUser(user);
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新用户信息
|
|
|
+ */
|
|
|
+ private void updateUserInfo(FsUser user, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
|
|
|
+ FsUser userMap = new FsUser();
|
|
|
+ userMap.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
+ userMap.setUserId(user.getUserId());
|
|
|
+ userMap.setUpdateTime(new DateTime());
|
|
|
+ userMap.setLastIp(ip);
|
|
|
+ userService.updateFsUser(userMap);
|
|
|
}
|
|
|
|
|
|
-// /**
|
|
|
-// * <pre>
|
|
|
-// * 获取微信用户信息
|
|
|
-// * </pre>
|
|
|
-// */
|
|
|
-// @Login
|
|
|
-// @ApiOperation("获取微信小程序用户信息")
|
|
|
-// @PostMapping("/getWeixinInfo")
|
|
|
-// public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
|
|
|
-// final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
|
|
|
-// try {
|
|
|
-// WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
|
|
|
-// // 用户信息校验
|
|
|
-// if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
|
|
|
-// return R.error("user check failed");
|
|
|
-// }
|
|
|
-// // 解密用户信息
|
|
|
-// WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
|
|
|
-// FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
|
|
|
-// user.setNickname(userInfo.getNickName());
|
|
|
-// user.setAvatar(userInfo.getAvatarUrl());
|
|
|
-// user.setIsWeixinAuth(1);
|
|
|
-// userService.updateFsUser(user);
|
|
|
-// return R.ok();
|
|
|
-// } catch (WxErrorException e) {
|
|
|
-// e.printStackTrace();
|
|
|
-// }
|
|
|
-// return R.ok("授权成功");
|
|
|
-// }
|
|
|
+ /**
|
|
|
+ * <pre>
|
|
|
+ * 获取微信用户信息
|
|
|
+ * </pre>
|
|
|
+ */
|
|
|
+ @Login
|
|
|
+ @ApiOperation("获取微信小程序用户信息")
|
|
|
+ @PostMapping("/getWeixinInfo")
|
|
|
+ public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
|
|
|
+ final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
|
|
|
+ try {
|
|
|
+ WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
|
|
|
+ // 用户信息校验
|
|
|
+ if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
|
|
|
+ return R.error("user check failed");
|
|
|
+ }
|
|
|
+ // 解密用户信息
|
|
|
+ WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
|
|
|
+ FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
|
|
|
+ user.setNickname(userInfo.getNickName());
|
|
|
+ user.setAvatar(userInfo.getAvatarUrl());
|
|
|
+ user.setIsWeixinAuth(1);
|
|
|
+ userService.updateFsUser(user);
|
|
|
+ return R.ok();
|
|
|
+ } catch (WxErrorException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return R.ok("授权成功");
|
|
|
+ }
|
|
|
|
|
|
@ApiOperation("小程序登录")
|
|
|
@PostMapping("/loginByMiniApp")
|