|
@@ -5,7 +5,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
|
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
|
import cn.hutool.core.date.DateTime;
|
|
import cn.hutool.core.date.DateTime;
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSON;
|
|
-import com.fs.course.utils.JwtUtils;
|
|
|
|
|
|
+
|
|
import com.fs.common.core.domain.R;
|
|
import com.fs.common.core.domain.R;
|
|
import com.fs.common.core.redis.RedisCache;
|
|
import com.fs.common.core.redis.RedisCache;
|
|
import com.fs.common.param.LoginMaWxParam;
|
|
import com.fs.common.param.LoginMaWxParam;
|
|
@@ -18,9 +18,12 @@ import com.fs.company.service.ICompanyService;
|
|
import com.fs.company.service.ICompanyUserService;
|
|
import com.fs.company.service.ICompanyUserService;
|
|
import com.fs.core.config.WxMaConfiguration;
|
|
import com.fs.core.config.WxMaConfiguration;
|
|
import com.fs.course.config.CourseMaConfig;
|
|
import com.fs.course.config.CourseMaConfig;
|
|
|
|
+import com.fs.course.utils.JwtUtils;
|
|
import com.fs.his.domain.FsUser;
|
|
import com.fs.his.domain.FsUser;
|
|
|
|
+import com.fs.his.enums.FsUserOperationEnum;
|
|
import com.fs.his.service.IFsUserService;
|
|
import com.fs.his.service.IFsUserService;
|
|
|
|
|
|
|
|
+import com.fs.his.service.IFsUserWxService;
|
|
import com.fs.system.domain.SysConfig;
|
|
import com.fs.system.domain.SysConfig;
|
|
import com.fs.system.mapper.SysConfigMapper;
|
|
import com.fs.system.mapper.SysConfigMapper;
|
|
import com.fs.wx.miniapp.config.WxMaProperties;
|
|
import com.fs.wx.miniapp.config.WxMaProperties;
|
|
@@ -39,7 +42,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import com.fs.his.domain.FsUserWx;
|
|
|
|
|
|
@Api("微信小程序相关接口")
|
|
@Api("微信小程序相关接口")
|
|
@RestController
|
|
@RestController
|
|
@@ -72,105 +78,197 @@ public class WxCompanyUserController extends AppBaseController {
|
|
@Autowired
|
|
@Autowired
|
|
private SysConfigMapper sysConfigMapper;
|
|
private SysConfigMapper sysConfigMapper;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private IFsUserWxService fsUserWxService;
|
|
|
|
+
|
|
@ApiOperation("小程序-授权登录")
|
|
@ApiOperation("小程序-授权登录")
|
|
@PostMapping("/loginByMa")
|
|
@PostMapping("/loginByMa")
|
|
|
|
+// @UserOperationLog(operationType = FsUserOperationEnum.MINLOGIN)
|
|
public R login(@RequestBody LoginMaWxParam param) {
|
|
public R login(@RequestBody LoginMaWxParam param) {
|
|
log.info("=====================进入小程序授权登录, 入参: {}", param);
|
|
log.info("=====================进入小程序授权登录, 入参: {}", param);
|
|
if (StringUtils.isBlank(param.getCode())) {
|
|
if (StringUtils.isBlank(param.getCode())) {
|
|
return R.error("code不存在");
|
|
return R.error("code不存在");
|
|
}
|
|
}
|
|
- SysConfig sysConfig3 = sysConfigMapper.selectConfigByConfigKey("courseMa.config");
|
|
|
|
- List<CourseMaConfig> courseMaConfigs = JSON.parseArray(sysConfig3.getConfigValue(), CourseMaConfig.class);
|
|
|
|
- if (courseMaConfigs.isEmpty()){
|
|
|
|
- return R.error("小程序配置为空");
|
|
|
|
|
|
+
|
|
|
|
+ Company company = companyService.selectCompanyById(param.getCompanyId());
|
|
|
|
+ if (company.getCourseMiniAppId() == null) {
|
|
|
|
+ return R.error("小程序参数错误!");
|
|
}
|
|
}
|
|
- CourseMaConfig courseMaConfig = courseMaConfigs.get(0);
|
|
|
|
- //获取第二个小程序配置,序号从0开始
|
|
|
|
- final WxMaService wxService = WxMaConfiguration.getMaService(courseMaConfig.getAppid());
|
|
|
|
|
|
+
|
|
|
|
+ final WxMaService wxService = WxMaConfiguration.getMaService(company.getCourseMiniAppId());
|
|
try {
|
|
try {
|
|
WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
|
|
WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
|
|
this.logger.info(session.getSessionKey());
|
|
this.logger.info(session.getSessionKey());
|
|
this.logger.info(session.getOpenid());
|
|
this.logger.info(session.getOpenid());
|
|
this.logger.info(session.getUnionid());
|
|
this.logger.info(session.getUnionid());
|
|
- // 解密
|
|
|
|
- WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
|
|
|
|
- FsUser user = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
-
|
|
|
|
- // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
|
|
|
|
- Company company = null;
|
|
|
|
- if(param.getCompanyId() != null){
|
|
|
|
- company = companyService.selectCompanyById(param.getCompanyId());
|
|
|
|
- }
|
|
|
|
|
|
|
|
- // 根据销售后台设置的 是否需要单独注册会员 来判断是否需要设置销售的值
|
|
|
|
- CompanyUser companyUser = null;
|
|
|
|
- if(param.getCompanyUserId() != null){
|
|
|
|
- companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
|
|
|
|
|
|
+ // 手机号信息
|
|
|
|
+ WxMaPhoneNumberInfo phoneNoInfo = null;
|
|
|
|
+ if (param.getAuthType()==1){
|
|
|
|
+ phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ FsUser user = getUserByAuthType(param, wxService, session, phoneNoInfo);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // 2. 获取销售信息
|
|
|
|
+ CompanyUser companyUser = getCompanyUser(param);
|
|
|
|
+
|
|
|
|
+ // 3. 处理用户注册或更新
|
|
String ip = IpUtil.getRequestIp();
|
|
String ip = IpUtil.getRequestIp();
|
|
- if (user == null) {
|
|
|
|
- if(StringUtils.isNotEmpty(session.getUnionid())){
|
|
|
|
- user = userService.selectFsUserByUnionId(session.getUnionid());
|
|
|
|
- } else {
|
|
|
|
- user = userService.selectFsUserByCourseMaOpenId(session.getOpenid());
|
|
|
|
- }
|
|
|
|
- if (user != null) {
|
|
|
|
- //修改
|
|
|
|
- FsUser userMap = new FsUser();
|
|
|
|
- userMap.setUserId(user.getUserId());
|
|
|
|
- userMap.setCourseMaOpenId(session.getOpenid());
|
|
|
|
- userMap.setUnionId(session.getUnionid());
|
|
|
|
- userMap.setUpdateTime(new DateTime());
|
|
|
|
- userMap.setNickName(param.getNickname() != null ? param.getNickname() : "微信用户");
|
|
|
|
- userMap.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
|
|
|
|
- userMap.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
- // 逻辑调整:如果会员已经绑定了销售,直接提示,不让注册-2025年6月16日14点53分
|
|
|
|
- if (user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())){
|
|
|
|
- return R.error(406, "该用户已成为其他销售会员");
|
|
|
|
- }
|
|
|
|
- if(companyUser != null && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1){
|
|
|
|
- user.setCompanyId(param.getCompanyId());
|
|
|
|
- user.setCompanyUserId(param.getCompanyUserId());
|
|
|
|
- }
|
|
|
|
- userService.updateFsUser(userMap);
|
|
|
|
- } else {
|
|
|
|
- //新增
|
|
|
|
- user = new FsUser();
|
|
|
|
- user.setNickName(param.getNickname() != null ? param.getNickname() : "微信用户");
|
|
|
|
- user.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
|
|
|
|
- user.setStatus((company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1);
|
|
|
|
- user.setCourseMaOpenId(session.getOpenid());
|
|
|
|
- user.setUnionId(session.getUnionid());
|
|
|
|
- user.setCreateTime(new Date());
|
|
|
|
- user.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
- if(companyUser != null && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1){
|
|
|
|
- user.setCompanyId(param.getCompanyId());
|
|
|
|
- user.setCompanyUserId(param.getCompanyUserId());
|
|
|
|
- }
|
|
|
|
- userService.insertFsUser(user);
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- FsUser userMap = new FsUser();
|
|
|
|
- userMap.setUserId(user.getUserId());
|
|
|
|
- userMap.setUpdateTime(new DateTime());
|
|
|
|
- userMap.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
- userMap.setLastIp(ip);
|
|
|
|
- if (StringUtils.isNotEmpty(session.getUnionid())) {
|
|
|
|
- userMap.setUnionId(session.getUnionid());
|
|
|
|
- }
|
|
|
|
- userService.updateFsUser(userMap);
|
|
|
|
- }
|
|
|
|
|
|
+ user = handleUserRegisterOrUpdate(user, param, session, phoneNoInfo, company, companyUser, ip);
|
|
|
|
+
|
|
|
|
+ // 4. 处理用户与小程序的绑定
|
|
|
|
+ handleFsUserWx(user, param, company, session);
|
|
|
|
+
|
|
log.info("保存成功的用户信息user: {}, 用户id: {}", user, user.getUserId());
|
|
log.info("保存成功的用户信息user: {}, 用户id: {}", user, user.getUserId());
|
|
String token = jwtUtils.generateToken(user.getUserId());
|
|
String token = jwtUtils.generateToken(user.getUserId());
|
|
// 返回一个写死的数据到前端
|
|
// 返回一个写死的数据到前端
|
|
- return R.ok("登录成功").put("token", token).put("phoneNumber", phoneNoInfo.getPhoneNumber()).put("nickName", "微信用户").put("user", user);
|
|
|
|
|
|
+ return R.ok("登录成功").put("token", token).put("user", user);
|
|
} catch (WxErrorException e) {
|
|
} catch (WxErrorException e) {
|
|
this.logger.error(e.getMessage(), e);
|
|
this.logger.error(e.getMessage(), e);
|
|
return R.error("授权失败," + e.getMessage());
|
|
return R.error("授权失败," + e.getMessage());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 根据authType获取用户信息
|
|
|
|
+ */
|
|
|
|
+ private FsUser getUserByAuthType(LoginMaWxParam param, WxMaService wxService, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo) throws WxErrorException {
|
|
|
|
+ FsUser user = null;
|
|
|
|
+ if (param.getAuthType() == 1) {
|
|
|
|
+ user = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
+ } else {
|
|
|
|
+ // unionid判定唯一
|
|
|
|
+ if (StringUtils.isNotEmpty(session.getUnionid())) {
|
|
|
|
+ user = userService.selectFsUserByUnionId(session.getUnionid());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return user;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取销售信息
|
|
|
|
+ */
|
|
|
|
+ private CompanyUser getCompanyUser(LoginMaWxParam param) {
|
|
|
|
+ if (param.getCompanyUserId() != null) {
|
|
|
|
+ return companyUserService.selectCompanyUserById(param.getCompanyUserId());
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 处理用户注册或更新
|
|
|
|
+ */
|
|
|
|
+ private FsUser handleUserRegisterOrUpdate(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser, String ip) {
|
|
|
|
+ if (user == null) {
|
|
|
|
+ user = userService.selectFsUserByCourseMaOpenId(session.getOpenid());
|
|
|
|
+ if (user != null) {
|
|
|
|
+ // 修改
|
|
|
|
+ return updateUser(user, param, session, phoneNoInfo, company, companyUser);
|
|
|
|
+ } else {
|
|
|
|
+ // 新增
|
|
|
|
+ return createUser(param, session, phoneNoInfo, company, companyUser);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // 已存在用户,更新信息
|
|
|
|
+ updateUserInfo(user, param, session, phoneNoInfo, ip);
|
|
|
|
+ return user;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 新增用户
|
|
|
|
+ */
|
|
|
|
+ private FsUser createUser(LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser) {
|
|
|
|
+ FsUser user = new FsUser();
|
|
|
|
+ user.setNickName(param.getNickname() != null ? param.getNickname() : "微信用户");
|
|
|
|
+ user.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
|
|
|
|
+ user.setStatus((company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1);
|
|
|
|
+ // user.setCourseMaOpenId(session.getOpenid());
|
|
|
|
+ user.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
|
|
|
|
+ user.setCreateTime(new Date());
|
|
|
|
+ if (param.getAuthType() == 1 && phoneNoInfo != null) {
|
|
|
|
+ user.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
+ }
|
|
|
|
+ if (companyUser != null && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1) {
|
|
|
|
+ user.setCompanyId(param.getCompanyId());
|
|
|
|
+ user.setCompanyUserId(param.getCompanyUserId());
|
|
|
|
+ }
|
|
|
|
+ userService.insertFsUser(user);
|
|
|
|
+ return user;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改用户
|
|
|
|
+ */
|
|
|
|
+ private FsUser updateUser(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser) {
|
|
|
|
+ FsUser userMap = new FsUser();
|
|
|
|
+ userMap.setUserId(user.getUserId());
|
|
|
|
+ // userMap.setCourseMaOpenId(session.getOpenid());
|
|
|
|
+ userMap.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
|
|
|
|
+ userMap.setUpdateTime(new DateTime());
|
|
|
|
+ userMap.setNickName(param.getNickname() != null ? param.getNickname() : user.getNickName());
|
|
|
|
+ userMap.setAvatar(param.getAvatar() != null ? param.getAvatar() : user.getAvatar());
|
|
|
|
+ if (param.getAuthType() == 1 && phoneNoInfo != null) {
|
|
|
|
+ userMap.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
+ }
|
|
|
|
+ // 逻辑调整:如果会员已经绑定了销售,直接提示,不让注册-2025年6月16日14点53分
|
|
|
|
+ if (user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())) {
|
|
|
|
+ throw new RuntimeException("该用户已成为其他销售会员");
|
|
|
|
+ }
|
|
|
|
+ if (companyUser != null && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1) {
|
|
|
|
+ userMap.setCompanyId(param.getCompanyId());
|
|
|
|
+ userMap.setCompanyUserId(param.getCompanyUserId());
|
|
|
|
+ }
|
|
|
|
+ userService.updateFsUser(userMap);
|
|
|
|
+ return userMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 更新已存在用户信息
|
|
|
|
+ */
|
|
|
|
+ private void updateUserInfo(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
|
|
|
|
+ FsUser userMap = new FsUser();
|
|
|
|
+ userMap.setUserId(user.getUserId());
|
|
|
|
+ userMap.setUpdateTime(new DateTime());
|
|
|
|
+ if (param.getAuthType() == 1 && phoneNoInfo != null) {
|
|
|
|
+ user.setPhone(phoneNoInfo.getPhoneNumber());
|
|
|
|
+ }
|
|
|
|
+ userMap.setLastIp(ip);
|
|
|
|
+ if (StringUtils.isNotEmpty(session.getUnionid())) {
|
|
|
|
+ userMap.setUnionId(session.getUnionid());
|
|
|
|
+ }
|
|
|
|
+ userService.updateFsUser(userMap);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 处理用户与小程序的绑定
|
|
|
|
+ */
|
|
|
|
+ private void handleFsUserWx(FsUser user, LoginMaWxParam param, Company company, WxMaJscode2SessionResult session) {
|
|
|
|
+ if (user == null) return;
|
|
|
|
+ FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(company.getCourseMiniAppId(), user.getUserId(), 1);
|
|
|
|
+ if (fsUserWx == null) {
|
|
|
|
+ fsUserWx = new FsUserWx();
|
|
|
|
+ fsUserWx.setType(1);
|
|
|
|
+ fsUserWx.setFsUserId(user.getUserId());
|
|
|
|
+ fsUserWx.setCompanyId(param.getCompanyId());
|
|
|
|
+ fsUserWx.setAppId(company.getCourseMiniAppId());
|
|
|
|
+ fsUserWx.setOpenId(session.getOpenid());
|
|
|
|
+ fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
|
|
|
|
+ fsUserWx.setCreateTime(new Date());
|
|
|
|
+ fsUserWxService.save(fsUserWx);
|
|
|
|
+ } else {
|
|
|
|
+ fsUserWx.setFsUserId(user.getUserId());
|
|
|
|
+ fsUserWx.setCompanyId(param.getCompanyId());
|
|
|
|
+ fsUserWx.setAppId(company.getCourseMiniAppId());
|
|
|
|
+ fsUserWx.setOpenId(session.getOpenid());
|
|
|
|
+ fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
|
|
|
|
+ fsUserWx.setUpdateTime(new Date());
|
|
|
|
+ fsUserWxService.updateById(fsUserWx);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// @Login(isMiniLogin = true)
|
|
// @Login(isMiniLogin = true)
|
|
// @ApiOperation("获取销售通过小程序登录后的用户信息")
|
|
// @ApiOperation("获取销售通过小程序登录后的用户信息")
|
|
// @GetMapping("/getMaUser")
|
|
// @GetMapping("/getMaUser")
|