Browse Source

销售小程序授权登录(预功能)(未测试)

caoliqin 1 month ago
parent
commit
402e5a85ff

+ 123 - 0
fs-company-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java

@@ -0,0 +1,123 @@
+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 com.fs.app.param.LoginMaWxParam;
+import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.IpUtil;
+import com.fs.company.domain.CompanyDept;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyDeptService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.core.security.SecurityUtils;
+import com.fs.store.service.IFsUserService;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+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.Objects;
+
+@Api("微信小程序相关接口")
+@RestController
+@RequestMapping(value = "/app/wx/miniapp")
+public class WxCompanyUserController extends AppBaseController {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private WxMaProperties maProperties;
+
+    @Autowired
+    JwtUtils jwtUtils;
+
+    @Autowired
+    private ICompanyUserService companyUserService;
+
+    @Autowired
+    private ICompanyDeptService companyDeptService;
+
+    @ApiOperation("授权登录")
+    @PostMapping("/login")
+    public R login(@RequestBody LoginMaWxParam param) {
+        if (StringUtils.isBlank(param.getCode())) {
+            return R.error("code不存在");
+        }
+        //获取第二个小程序配置,序号从0开始
+        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(1).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());
+            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            CompanyUser companyUser = companyUserService.getCompanyUserByOpenId(session.getOpenid());
+            String ip = IpUtil.getRequestIp();
+            if (companyUser == null) {
+                //查询用户手机号是否存在,如果存在则更新
+//                FsUser checkPhone = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
+                CompanyUser checkPhone = companyUserService.getCompanyUserByPhone(phoneNoInfo.getPhoneNumber());
+                if (checkPhone != null) {
+                    if (checkPhone.getMaOpenId() == null) {
+                        companyUser = checkPhone;
+                        companyUser.setMaOpenId(session.getOpenid());
+                        companyUser.setUserId(companyUser.getUserId());
+                        companyUser.setUpdateTime(new DateTime());
+                        companyUser.setLoginIp(ip);
+                        companyUserService.updateUser(companyUser);
+                    } else {
+                        throw new CustomException("此手机号用户已存在");
+                    }
+                } else {
+                    //新增
+                    companyUser = new CompanyUser();
+                    companyUser.setUserName(param.getPhoneNumber());
+                    companyUser.setNickName(param.getNickName());
+                    companyUser.setPhonenumber(param.getPhoneNumber());
+                    companyUser.setSex(userInfo != null ? userInfo.getGender() : "0");
+                    companyUser.setPassword(SecurityUtils.encryptPassword(companyUser.getPassword()));
+                    companyUser.setCreateTime(new Date());
+                    companyUser.setCompanyId(param.getCompanyId());
+                    companyUser.setParentId(param.getParentId());
+                    companyUser.setMaOpenId(session.getOpenid());
+
+                    //部门信息
+                    CompanyDept dept = companyDeptService.getDefaultCompanyDeptByCompanyId(param.getCompanyId());
+                    if (Objects.nonNull(dept)) {
+                        companyUser.setDeptId(dept.getDeptId());
+                    }
+                    companyUserService.insertUser(companyUser);
+                }
+            } else {
+                CompanyUser companyUserMp = new CompanyUser();
+                companyUserMp.setPhonenumber(phoneNoInfo.getPhoneNumber());
+                companyUserMp.setUserId(companyUser.getUserId());
+                companyUserMp.setUpdateTime(new DateTime());
+                companyUserMp.setLoginIp(ip);
+                companyUserService.updateUser(companyUser);
+            }
+            String token = jwtUtils.generateToken(companyUser.getUserId());
+            return R.ok("登录成功").put("token", token).put("companyUser", companyUser);
+        } catch (WxErrorException e) {
+            this.logger.error(e.getMessage(), e);
+            return R.error("授权失败," + e.getMessage());
+        }
+    }
+
+
+}

+ 34 - 0
fs-company-app/src/main/java/com/fs/app/param/LoginMaWxParam.java

@@ -0,0 +1,34 @@
+package com.fs.app.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class LoginMaWxParam implements Serializable {
+
+    @NotBlank(message = "code参数缺失")
+    @ApiModelProperty(value = "小程序登陆code")
+    private String code;
+
+    @ApiModelProperty(value = "小程序完整用户信息的加密数据")
+    private String encryptedData;
+
+    @ApiModelProperty(value = "小程序加密算法的初始向量")
+    private String iv;
+
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @ApiModelProperty(value = "电话号码")
+    private String phoneNumber;
+
+    @ApiModelProperty(value = "昵称")
+    private String nickName;
+
+    @ApiModelProperty(value = "上级销售id")
+    private Long parentId;
+
+}

+ 23 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -127,9 +127,15 @@ public class CompanyUser extends BaseEntity
 
     private Integer qwStatus;
 
+    /** 用户上级id */
+    private Long parentId;
+
     /** 是否审核 */
     private Integer isAudit;
 
+    /** 微信小程序OPENID(如果有小程序授权) */
+    private String  maOpenId;
+
     public Integer getIsAudit() {
         return isAudit;
     }
@@ -451,4 +457,21 @@ public class CompanyUser extends BaseEntity
     public void setStatusText(String statusText) {
         this.statusText = statusText;
     }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getMaOpenId() {
+        return maOpenId;
+    }
+
+    public void setMaOpenId(String maOpenId) {
+        this.maOpenId = maOpenId;
+    }
+
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -269,4 +269,11 @@ public interface CompanyUserMapper
 
     @Select("select domain from company_user where user_id = #{userId}")
     String selectDomainByUserId(Long userId);
+
+    @Select("select * from company_user where ma_open_id = #{maOpenId}")
+    CompanyUser getCompanyUserByOpenId(String openId);
+
+    @Select("select * from company_user where phonenumber = #{phoneNumber}")
+    CompanyUser getCompanyUserByPhone(String phoneNumber);
+
 }

+ 14 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -160,4 +160,18 @@ public interface ICompanyUserService {
     List<CitysAreaVO> getCitysAreaList();
 
     R updateCompanyUserAreaList(CompanyUserAreaParam param);
+
+    /**
+     * 根据openid获取销售
+     * @param openId 微信小程序标识
+     * @return
+     */
+    CompanyUser getCompanyUserByOpenId(String openId);
+
+    /**
+     * 根据电话获取销售信息
+     * @param phoneNumber 用户电话
+     * @return
+     */
+    CompanyUser getCompanyUserByPhone(String phoneNumber);
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -434,6 +434,16 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         }
     }
 
+    @Override
+    public CompanyUser getCompanyUserByOpenId(String openId) {
+        return companyUserMapper.getCompanyUserByOpenId(openId);
+    }
+
+    @Override
+    public CompanyUser getCompanyUserByPhone(String phoneNumber) {
+        return companyUserMapper.getCompanyUserByPhone(phoneNumber);
+    }
+
     /**
      * 批量审核用户
      * @param userIds 用户ID集合

+ 7 - 0
fs-service-system/src/main/resources/application-config.yml

@@ -63,6 +63,13 @@ wx:
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
 
+#  云联融智优选小程序,暂时使用
+      - appid: wxd70f99287830cb51   #云联融智优选(暂时用于测试销售app)
+        secret: 6e2684b3d48e6363018d4eedb8dae3e5
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey:
+        msgDataFormat: JSON
+
   pay:
     appId: wx11a2ce7c2bbc4521 #微信公众号或者小程序等的appid
     mchId: 1703311381 #微信支付商户号