Przeglądaj źródła

机构注册part3

chao 4 lat temu
rodzic
commit
c838a644f0
23 zmienionych plików z 628 dodań i 148 usunięć
  1. 6 1
      pom.xml
  2. 2 2
      src/main/java/com/caimei365/user/components/RedisService.java
  3. 197 0
      src/main/java/com/caimei365/user/components/WeChatService.java
  4. 3 1
      src/main/java/com/caimei365/user/controller/ClubApi.java
  5. 13 0
      src/main/java/com/caimei365/user/controller/LoginApi.java
  6. 0 38
      src/main/java/com/caimei365/user/controller/WeChatApi.java
  7. 49 10
      src/main/java/com/caimei365/user/mapper/BaseUserDao.java
  8. 6 1
      src/main/java/com/caimei365/user/mapper/RegisterUserDao.java
  9. 8 1
      src/main/java/com/caimei365/user/model/BaseUser.java
  10. 22 0
      src/main/java/com/caimei365/user/model/OperationPo.java
  11. 0 3
      src/main/java/com/caimei365/user/model/UserPo.java
  12. 2 1
      src/main/java/com/caimei365/user/service/ClubService.java
  13. 12 0
      src/main/java/com/caimei365/user/service/LoginService.java
  14. 0 23
      src/main/java/com/caimei365/user/service/WeChatService.java
  15. 29 16
      src/main/java/com/caimei365/user/service/impl/ClubServiceImpl.java
  16. 82 1
      src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java
  17. 1 1
      src/main/java/com/caimei365/user/service/impl/UserServiceImpl.java
  18. 0 40
      src/main/java/com/caimei365/user/service/impl/WeChatServiceImpl.java
  19. 104 0
      src/main/java/com/caimei365/user/utils/RequestUtil.java
  20. 14 1
      src/main/resources/application.yml
  21. 73 7
      src/main/resources/mapper/BaseUserMapper.xml
  22. 4 0
      src/main/resources/mapper/RegisterUserMapper.xml
  23. 1 1
      src/test/java/com/caimei365/user/ReactiveRedisTest.java

+ 6 - 1
pom.xml

@@ -95,7 +95,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
-
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.75</version>
+        </dependency>
 
 
 

+ 2 - 2
src/main/java/com/caimei365/user/service/RedisService.java → src/main/java/com/caimei365/user/components/RedisService.java

@@ -1,4 +1,4 @@
-package com.caimei365.user.service;
+package com.caimei365.user.components;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -13,7 +13,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 /**
- * Description
+ * Redis 服务工具类
  *
  * @author : Charles
  * @date : 2021/3/4

+ 197 - 0
src/main/java/com/caimei365/user/components/WeChatService.java

@@ -0,0 +1,197 @@
+package com.caimei365.user.components;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.user.model.JsonModel;
+import com.caimei365.user.utils.RequestUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.AlgorithmParameters;
+import java.security.Security;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信 服务工具类
+ *
+ * @author : Charles
+ * @date : 2021/3/9
+ */
+@Slf4j
+@Component
+public class WeChatService {
+    private String redirectUri;
+    private String appId;
+    private String appSecret;
+    private String miniAppId;
+    private String miniAppSecret;
+    private String crmAppId;
+    private String crmAppSecret;
+
+    @Value("${wx.redirect_uri}")
+    public void setRedirectUri(String redirectUri) {
+        redirectUri = redirectUri;
+    }
+
+    @Value("${wx.app-id}")
+    public void setAppId(String appId) {
+        appId = appId;
+    }
+
+    @Value("${wx.app-secret}")
+    public void setAppSecret(String appSecret) {
+        appSecret = appSecret;
+    }
+
+    @Value("${wx.mini-app-id}")
+    public void setMiniAppId(String miniAppId) {
+        miniAppId = miniAppId;
+    }
+
+    @Value("${wx.mini-app-secret}")
+    public void setMiniAppSecret(String miniAppSecret) {
+        miniAppSecret = miniAppSecret;
+    }
+
+    @Value("${wx.crm-app-id}")
+    public void setCrmAppId(String crmAppId) {
+        crmAppId = crmAppId;
+    }
+
+    @Value("${wx.crm-app-secret}")
+    public void setCrmAppSecret(String crmAppSecret) {
+        crmAppSecret = crmAppSecret;
+    }
+
+    public String getRedirectUri() {
+        return redirectUri;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public String getMiniAppId() {
+        return miniAppId;
+    }
+
+    public String getMiniAppSecret() {
+        return miniAppSecret;
+    }
+
+    public String getCrmAppId() {
+        return crmAppId;
+    }
+
+    public String getCrmAppSecret() {
+        return crmAppSecret;
+    }
+
+    static {
+        // BouncyCastle是一个开源的加解密解决方案
+        Security.addProvider(new BouncyCastleProvider());
+    }
+    /**
+     * AES解密
+     *
+     * @param data           密文,被加密的数据
+     * @param key            秘钥
+     * @param iv             偏移量
+     * @param encodingFormat 解密后的结果需要进行的编码
+     * @return 解密结果
+     */
+    public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
+        // 被加密的数据
+        byte[] dataByte = Base64.decodeBase64(data);
+        // 加密秘钥
+        byte[] keyByte = Base64.decodeBase64(key);
+        // 偏移量
+        byte[] ivByte = Base64.decodeBase64(iv);
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
+            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
+            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
+            parameters.init(new IvParameterSpec(ivByte));
+            // 初始化
+            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
+            byte[] resultByte = cipher.doFinal(dataByte);
+            if (null != resultByte && resultByte.length > 0) {
+                return new String(resultByte, encodingFormat);
+            }
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 小程序微信授权登录,获取openid
+     *
+     * @param code              微信凭证
+     * @param serverWebExchange ServerWebExchange
+     * @return HashMap
+     */
+    public JsonModel<Map<String, Object>> getAppletsInfo(String code, ServerWebExchange serverWebExchange) {
+        log.info("Start get SessionKey");
+        Map<String, Object> returnMap = new HashMap<>(4);
+        // 获取当前微信小程序的环境
+        ServerHttpRequest request = serverWebExchange.getRequest();
+        HttpHeaders headers = request.getHeaders();
+        String referer = headers.getFirst("Referer");
+        log.info("referer-is----:" + referer);
+        returnMap.put("referer", referer);
+        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
+        Map<String, String> requestUrlParam = new HashMap<String, String>(4);
+        // 小程序appId
+        requestUrlParam.put("appId", miniAppId);
+        log.info("appId: ---" + miniAppId);
+        // 小程序appSecret
+        requestUrlParam.put("appSecret", miniAppSecret);
+        // 小程序端返回的code
+        requestUrlParam.put("code", code);
+        // 默认参数
+        requestUrlParam.put("grantType", "authorization_code");
+        // 发送post请求读取调用微信接口获取openid用户唯一标识
+        String infos;
+        try {
+            infos = RequestUtil.sendPost(requestUrl, requestUrlParam);
+        } catch (Exception e) {
+            return JsonModel.error("服务器内部异常", returnMap);
+        }
+        // 解析相应内容(转换成json对象)
+        JSONObject jsonObject = JSON.parseObject(infos);
+        String openId = jsonObject.getString("openid");
+        String unionId = jsonObject.getString("unionid");
+        String sessionKey = jsonObject.getString("session_key");
+        String errCode = jsonObject.getString("errcode");
+        String errMsg = jsonObject.getString("errmsg");
+        log.info("openId----->" + openId +", unionId------>" + unionId);
+        returnMap.put("openId", openId);
+        returnMap.put("unionId", unionId);
+        returnMap.put("sessionKey", sessionKey);
+        boolean errFlag = StringUtils.isNotEmpty(errCode) && ("-1".equals(errCode) || "40029".equals(errCode) || "45011".equals(errCode));
+        if (errFlag) {
+            return JsonModel.error(-1, errMsg, returnMap);
+        }
+        return JsonModel.success(returnMap);
+    }
+
+
+
+}

+ 3 - 1
src/main/java/com/caimei365/user/controller/ClubApi.java

@@ -36,6 +36,7 @@ public class ClubApi {
      * @param passWordConfirm   用户确认密码
      * @param smsCode           短信验证码(旧:activationCode)
      * @param isAgreed          是否同意勾选同意协议,1是,其他否
+     * @param unionId           微信unionId
      * @param nickName          微信昵称
      * @param avatarUrl         微信头像(旧:headimgurl)
      */
@@ -48,10 +49,11 @@ public class ClubApi {
                                         String passWordConfirm,
                                         String smsCode,
                                         Integer isAgreed,
+                                        String unionId,
                                         String nickName,
                                         String avatarUrl,
                                         ServerWebExchange serverWebExchange) {
-        return clubService.register(source, userName, bindMobile, password, passWordConfirm, smsCode, isAgreed, nickName, avatarUrl, serverWebExchange);
+        return clubService.register(source, userName, bindMobile, password, passWordConfirm, smsCode, isAgreed, unionId, nickName, avatarUrl, serverWebExchange);
     }
 
 }

+ 13 - 0
src/main/java/com/caimei365/user/controller/LoginApi.java

@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.ServerWebExchange;
 
 /**
  * 登录API
@@ -33,4 +34,16 @@ public class LoginApi {
         return loginService.passwordLogin(mobileOrEmail, password);
     }
 
+    /**
+     * 微信授权登录(小程序)
+     *
+     * @param code          微信授权code
+     * @param encryptedData 微信加密数据
+     * @param iv            加密算法的初始向量
+     * @param serverWebExchange ServerWebExchange
+     */
+    @PostMapping("/applets/auth")
+    public JsonModel<BaseUser> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange) {
+        return loginService.appletsAuthorization(code, encryptedData, iv, serverWebExchange);
+    }
 }

+ 0 - 38
src/main/java/com/caimei365/user/controller/WeChatApi.java

@@ -1,38 +0,0 @@
-package com.caimei365.user.controller;
-
-import com.caimei365.user.model.JsonModel;
-import com.caimei365.user.service.ClubService;
-import com.caimei365.user.service.WeChatService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.server.ServerWebExchange;
-
-/**
- * Description
- *
- * @author : Charles
- * @date : 2021/3/9
- */
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/user/wx")
-public class WeChatApi {
-
-    private final WeChatService weChatService;
-
-    /**
-     * 微信授权登录
-     *
-     * @param code          微信授权code
-     * @param encryptedData 微信加密数据
-     * @param iv            加密算法的初始向量
-     * @param serverWebExchange ServerWebExchange
-     */
-    @PostMapping("/authorization")
-    public JsonModel authorizationLogin(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange) {
-        return weChatService.authorizationLogin(code, encryptedData, iv, serverWebExchange);
-    }
-
-}

+ 49 - 10
src/main/java/com/caimei365/user/mapper/BaseUserDao.java

@@ -13,6 +13,20 @@ import org.apache.ibatis.annotations.Param;
  */
 @Mapper
 public interface BaseUserDao {
+    /**
+     * 根据手机号获取用户id
+     *
+     * @param bindMobile 手机号
+     * @return userId
+     */
+    Integer getUserIdByMobile(String bindMobile);
+    /**
+     * 根据手机号获取运营人员id
+     *
+     * @param bindMobile 手机号
+     * @return userId
+     */
+    Integer getOperationIdByMobile(String bindMobile);
     /**
      * 根据手机号获取用户
      *
@@ -35,21 +49,46 @@ public interface BaseUserDao {
      */
     OperationPo getOperationByMobile(@Param("mobile") String mobile);
 
+    /**
+     * 根据openId获取协销
+     * @param openId openId
+     * @return BaseUser
+     */
+    BaseUser getServiceProviderByOpenId(String openId);
 
     /**
-     * 根据手机号获取用户id
-     *
-     * @param bindMobile 手机号
-     * @return userId
+     * 根据用户ID更新协销unionId
+     * @param userId
+     * @param unionId
      */
-    Integer getUserIdByMobile(String bindMobile);
+    void updateServiceProviderUnionId(@Param("userId") Integer userId, @Param("unionId") String unionId);
+
     /**
-     * 根据手机号获取运营人员id
-     *
-     * @param bindMobile 手机号
-     * @return userId
+     * 根据unionId获取运营人员
+     * @param unionId unionId
+     * @return BaseUser
      */
-    Integer getOperationIdByMobile(String bindMobile);
+    BaseUser getOperationUserByUnionId(String unionId);
+    /**
+     * 根据用户ID更新运营人员openId
+     * @param userId
+     * @param openId
+     */
+    void updateOperationOpenId(@Param("userId") Integer userId, @Param("openId") String openId);
+    /**
+     * 根据用户ID更新运营人员unionId
+     * @param userId
+     * @param unionId
+     */
+    void updateOperationUnionId(@Param("userId") Integer userId, @Param("unionId") String unionId);
+    /**
+     * 根据openId获取运营人员
+     * @param openId
+     * @param source
+     * @return
+     */
+    BaseUser getOperationUserByOpenId(@Param("openId") String openId, @Param("source") String source);
+
     /**
      * 根据邮箱获取用户id
      *

+ 6 - 1
src/main/java/com/caimei365/user/mapper/RegisterUserDao.java

@@ -1,7 +1,6 @@
 package com.caimei365.user.mapper;
 
 import com.caimei365.user.model.ClubPo;
-import com.caimei365.user.model.ShopPo;
 import com.caimei365.user.model.UserPo;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -25,6 +24,12 @@ public interface RegisterUserDao {
      * @return
      */
     int insertClub(ClubPo club);
+    /**
+     * 保存运营人员(operation)
+     * @param operation
+     * @return
+     */
+    int insertOperation(OperationPo operation);
     /**
      * 根据用户ID更新机构ID
      *

+ 8 - 1
src/main/java/com/caimei365/user/model/BaseUser.java

@@ -64,5 +64,12 @@ public class BaseUser {
      * token
      */
     private String token;
-
+    /**
+     * 微信unionId
+     */
+    private String unionId;
+    /**
+     * 微信openId
+     */
+    private String openId;
 }

+ 22 - 0
src/main/java/com/caimei365/user/model/OperationPo.java

@@ -1,8 +1,11 @@
 package com.caimei365.user.model;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.Date;
+
 /**
  * Description
  *
@@ -40,4 +43,23 @@ public class OperationPo extends BaseUser {
      * 联系人,对应用户的userName
      */
     private String linkName;
+    /**
+     * 添加时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addTime;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+    /**
+     * 绑定时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date bindTime;
+    /**
+     * 用户状态,0 有效  其它无效
+     */
+    private Integer delFlag;
 }

+ 0 - 3
src/main/java/com/caimei365/user/model/UserPo.java

@@ -55,7 +55,4 @@ public class UserPo extends BaseUser {
      */
     private Integer serviceProviderStatus;
 
-
-
-
 }

+ 2 - 1
src/main/java/com/caimei365/user/service/ClubService.java

@@ -21,11 +21,12 @@ public interface ClubService {
      * @param passWordConfirm   用户确认密码
      * @param smsCode           短信验证码
      * @param isAgreed          是否同意勾选同意协议,1是,其他否
+     * @param unionId           微信unionId
      * @param nickName          微信昵称
      * @param avatarUrl         微信头像
      * @param serverWebExchange ServerWebExchange
      * @return BaseUser
      */
-    JsonModel<BaseUser> register(Integer source, String userName, String bindMobile, String password, String passWordConfirm, String smsCode, Integer isAgreed, String nickName, String avatarUrl, ServerWebExchange serverWebExchange);
+    JsonModel<BaseUser> register(Integer source, String userName, String bindMobile, String password, String passWordConfirm, String smsCode, Integer isAgreed, String unionId, String nickName, String avatarUrl, ServerWebExchange serverWebExchange);
 
 }

+ 12 - 0
src/main/java/com/caimei365/user/service/LoginService.java

@@ -2,6 +2,7 @@ package com.caimei365.user.service;
 
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
+import org.springframework.web.server.ServerWebExchange;
 
 /**
  * Description
@@ -19,4 +20,15 @@ public interface LoginService {
      * @return BaseUser
      */
     JsonModel<BaseUser> passwordLogin(String mobileOrEmail, String password);
+
+    /**
+     * 微信授权登录(小程序)
+     *
+     * @param code          微信授权code
+     * @param encryptedData 微信加密数据
+     * @param iv            加密算法的初始向量
+     * @param serverWebExchange ServerWebExchange
+     * @return BaseUser
+     */
+    JsonModel<BaseUser> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange);
 }

+ 0 - 23
src/main/java/com/caimei365/user/service/WeChatService.java

@@ -1,23 +0,0 @@
-package com.caimei365.user.service;
-
-import com.caimei365.user.model.JsonModel;
-import org.springframework.web.server.ServerWebExchange;
-
-/**
- * Description
- *
- * @author : Charles
- * @date : 2021/3/9
- */
-public interface WeChatService {
-
-    /**
-     * 微信授权登录
-     *
-     * @param code          微信授权code
-     * @param encryptedData 微信加密数据
-     * @param iv            加密算法的初始向量
-     * @param serverWebExchange ServerWebExchange
-     */
-    JsonModel authorizationLogin(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange);
-}

+ 29 - 16
src/main/java/com/caimei365/user/service/impl/ClubServiceImpl.java

@@ -4,7 +4,7 @@ import com.caimei365.user.mapper.BaseUserDao;
 import com.caimei365.user.mapper.RegisterUserDao;
 import com.caimei365.user.model.*;
 import com.caimei365.user.service.ClubService;
-import com.caimei365.user.service.RedisService;
+import com.caimei365.user.components.RedisService;
 import com.caimei365.user.utils.AliyunSmsUtil;
 import com.caimei365.user.utils.Md5Util;
 import com.caimei365.user.utils.RequestUtil;
@@ -17,6 +17,7 @@ import org.springframework.web.server.ServerWebExchange;
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Map;
 
 /**
  * Description
@@ -45,6 +46,7 @@ public class ClubServiceImpl implements ClubService {
      * @param passWordConfirm   用户确认密码
      * @param smsCode           短信验证码
      * @param isAgreed          是否同意勾选同意协议,1是,其他否
+     * @param unionId           微信unionId
      * @param nickName          微信昵称
      * @param avatarUrl         微信头像
      * @param serverWebExchange ServerWebExchange
@@ -52,7 +54,7 @@ public class ClubServiceImpl implements ClubService {
      */
     @Override
     @Transactional
-    public JsonModel<BaseUser> register(Integer source, String userName, String bindMobile, String password, String passWordConfirm, String smsCode, Integer isAgreed, String nickName, String avatarUrl, ServerWebExchange serverWebExchange) {
+    public JsonModel<BaseUser> register(Integer source, String userName, String bindMobile, String password, String passWordConfirm, String smsCode, Integer isAgreed, String unionId, String nickName, String avatarUrl, ServerWebExchange serverWebExchange) {
         // 打印IP
         String ip = RequestUtil.getIp(serverWebExchange);
         log.info("X-Forwarded-For:" + ip);
@@ -87,8 +89,9 @@ public class ClubServiceImpl implements ClubService {
          */
         UserPo user = new UserPo();
         // 设置日期时间格式
+        Date date = new Date();
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String current = dateFormat.format(new Date());
+        String current = dateFormat.format(date);
         // 注册时间
         user.setRegisterTime(current);
         // 注册IP
@@ -185,22 +188,32 @@ public class ClubServiceImpl implements ClubService {
             operation.setLinkName(userName);
             // 运营人员状态:1未绑定,2已绑定
             operation.setStatus(2);
-
-//            Map<String, String> wxInfo = (Map<String, String>) request.getSession().getAttribute("wxInfo");
-//            String openid = wxInfo.get("openid");
-//            String unionid = wxInfo.get("unionid");
-//            operation.setOpenid(openid);
-//            operation.setUnionId(unionid);
-//            operation.setBindTime(time);
-//            operation.setUpdateTime(time);
-//            operation.setAddTime(time);
-//            operation.setDelFlag("0");
-//            loginDao.saveOperationUser(operation);
-//            log.info("注册普通机构,默认绑定为机构运营人员");
+            // 微信unionId
+            operation.setUnionId(unionId);
+            Map<Object, Object> infoData = redisService.getEntries("wxInfo:" + unionId);
+            String openId = (String) infoData.get("openId");
+            // 微信openId
+            operation.setOpenId(openId);
+            // 添加时间
+            operation.setAddTime(date);
+            // 更新时间
+            operation.setUpdateTime(date);
+            // 绑定时间
+            operation.setBindTime(date);
+            // delFlag: 0 有效  其它无效
+            operation.setDelFlag(0);
+            /*
+                保存数据库 operation
+             */
+            int insertOperationFlag = registerUserDao.insertOperation(operation);
+            if (insertOperationFlag < 1) {
+                log.info(operation.getUserId() + " 插入数据库异常operation:" + operation.toString());
+                return JsonModel.error("插入数据库异常", null);
+            }
+            log.info("注册普通机构,默认绑定为机构运营人员");
         }
         //return model.success(clubVo);
 
-
         return null;
     }
 }

+ 82 - 1
src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java

@@ -1,16 +1,21 @@
 package com.caimei365.user.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.user.components.WeChatService;
 import com.caimei365.user.mapper.BaseUserDao;
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
 import com.caimei365.user.service.LoginService;
-import com.caimei365.user.service.RedisService;
+import com.caimei365.user.components.RedisService;
 import com.caimei365.user.utils.JwtUtil;
 import com.caimei365.user.utils.Md5Util;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.web.server.ServerWebExchange;
 
 import javax.annotation.Resource;
+import java.util.Map;
 
 /**
  * Description
@@ -25,6 +30,8 @@ public class LoginServiceImpl implements LoginService {
     @Resource
     private RedisService redisService;
     @Resource
+    private WeChatService weChatService;
+    @Resource
     private BaseUserDao baseUserDao;
 
     /**
@@ -86,4 +93,78 @@ public class LoginServiceImpl implements LoginService {
         }
         return JsonModel.success("登录成功", baseUser);
     }
+
+    /**
+     * 微信授权登录(小程序)
+     *
+     * @param code              微信授权code
+     * @param encryptedData     微信加密数据
+     * @param iv                加密算法的初始向量
+     * @param serverWebExchange ServerWebExchange
+     */
+    @Override
+    public JsonModel<BaseUser> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange) {
+        if (StringUtils.isBlank(code)) {
+            return JsonModel.error("没有获取到微信授权code", null);
+        }
+        // 小程序微信授权获取登录信息
+        JsonModel<Map<String, Object>> appletsInfo = weChatService.getAppletsInfo(code, serverWebExchange);
+        if (appletsInfo.getCode() == -1) {
+            return JsonModel.error(appletsInfo.getMsg(), null);
+        }
+        Map<String, Object> infoData = appletsInfo.getData();
+        String openId = (String) infoData.get("openId");
+        String unionId = (String) infoData.get("unionId");
+        String sessionKey = (String) infoData.get("sessionKey");
+        try {
+            if (StringUtils.isEmpty(unionId) || StringUtils.isBlank(unionId)) {
+                String result = WeChatService.decrypt(encryptedData, sessionKey, iv, "UTF-8");
+                log.info("解密数据>>>>>>" + result);
+                Map parseMap = JSONObject.parseObject(result, Map.class);
+                assert parseMap != null;
+                unionId = parseMap.get("unionId").toString();
+                infoData.put("unionId", unionId);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonModel.error("微信解密失败", null);
+        }
+        redisService.setMap("wxInfo:" + unionId, infoData);
+        log.info("通过wxInfo:unionId键保存到redis,返回unionId给前端>>>>>>>>" + unionId);
+        // 协销授权登录
+        BaseUser seller = baseUserDao.getServiceProviderByOpenId(openId);
+        if (null != seller) {
+            baseUserDao.updateServiceProviderUnionId(seller.getUserId(), unionId);
+            String token = JwtUtil.createToken(seller.getUserId());
+            seller.setToken(token);
+            seller.setUnionId(unionId);
+            seller.setOpenId(openId);
+            return JsonModel.success(seller);
+        }
+        // 运营人员授权登录
+        BaseUser operation = baseUserDao.getOperationUserByUnionId(unionId);
+        if (null == operation) {
+            operation = baseUserDao.getOperationUserByOpenId(openId, "mini");
+            if (null == operation){
+                operation = new BaseUser();
+                operation.setOpenId(openId);
+                operation.setUnionId(unionId);
+                return JsonModel.error("运营人员不存在,请登录", operation);
+            } else {
+                // 表示 openId存在, unionId不存在
+                baseUserDao.updateOperationUnionId(operation.getUserId(), unionId);
+            }
+        }
+        // 如果unionId存在, openId不存在
+        if (StringUtils.isEmpty(operation.getOpenId()) || StringUtils.isBlank(operation.getOpenId())) {
+            baseUserDao.updateOperationOpenId(operation.getUserId(), openId);
+        }
+        operation.setOpenId(openId);
+        operation.setUnionId(unionId);
+        // 返回登录校验结果
+        return logonVerify(operation);
+    }
+
+
+
 }

+ 1 - 1
src/main/java/com/caimei365/user/service/impl/UserServiceImpl.java

@@ -3,7 +3,7 @@ package com.caimei365.user.service.impl;
 import com.caimei365.user.mapper.BaseUserDao;
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
-import com.caimei365.user.service.RedisService;
+import com.caimei365.user.components.RedisService;
 import com.caimei365.user.service.UserService;
 import com.caimei365.user.utils.AliyunSmsUtil;
 import com.caimei365.user.utils.CodeUtil;

+ 0 - 40
src/main/java/com/caimei365/user/service/impl/WeChatServiceImpl.java

@@ -1,40 +0,0 @@
-package com.caimei365.user.service.impl;
-
-import com.caimei365.user.model.JsonModel;
-import com.caimei365.user.service.WeChatService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.stereotype.Service;
-import org.springframework.web.server.ServerWebExchange;
-
-/**
- * Description
- *
- * @author : Charles
- * @date : 2021/3/9
- */
-@Slf4j
-@Service
-public class WeChatServiceImpl implements WeChatService {
-
-    /**
-     * 微信授权登录
-     *
-     * @param code              微信授权code
-     * @param encryptedData     微信加密数据
-     * @param iv                加密算法的初始向量
-     * @param serverWebExchange ServerWebExchange
-     */
-    @Override
-    public JsonModel authorizationLogin(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange) {
-        ServerHttpRequest request = serverWebExchange.getRequest();
-
-
-
-
-
-
-
-        return null;
-    }
-}

+ 104 - 0
src/main/java/com/caimei365/user/utils/RequestUtil.java

@@ -4,6 +4,14 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.server.ServerWebExchange;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -44,4 +52,100 @@ public class RequestUtil {
         }
         return ip.replaceAll(":", ".");
     }
+
+    /**
+     * 向指定URL发送GET方法的请求
+     *
+     * @param url   发送请求的URL,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 远程资源的响应结果
+     */
+    public static String sendGet(String url) throws Exception {
+        StringBuilder result = new StringBuilder();
+        BufferedReader in = null;
+        try {
+
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            URLConnection connection = realUrl.openConnection();
+            // 设置通用的请求属性
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("Accept-Charset", "utf-8");
+            connection.setRequestProperty("contentType", "utf-8");
+            connection.setConnectTimeout(5000);
+            // 建立实际的连接
+            connection.connect();
+            // 获取所有响应头字段
+            Map<String, List<String>> map = connection.getHeaderFields();
+            // 定义 BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+        }
+        // 使用finally块来关闭输入流
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+        return result.toString();
+    }
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param paramMap 请求参数
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, Map<String, ?> paramMap) throws Exception{
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+
+        StringBuilder param = new StringBuilder();
+
+        for (String key : paramMap.keySet()) {
+            param.append(key).append("=").append(paramMap.get(key)).append("&");
+        }
+
+        try {
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            URLConnection conn = realUrl.openConnection();
+            // 设置通用的请求属性
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(conn.getOutputStream());
+            // 发送请求参数
+            out.print(param);
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+        }
+        //使用finally块来关闭输出流、输入流
+        finally{
+            if(out!=null){
+                out.close();
+            }
+            if(in!=null){
+                in.close();
+            }
+        }
+        return result.toString();
+    }
+
 }

+ 14 - 1
src/main/resources/application.yml

@@ -39,7 +39,20 @@ eureka:
       defaultZone: http://localhost:18000/eureka/
 
 
-#日志配置
+# 日志配置
 logging:
   level:
     root: info
+
+# 微信配置
+wx:
+  #pcwx信息
+  app-id: wx22be9ab1a6aa4715
+  app-secret: ebf8cfc4dbadae3431a8b0267c4fd09f
+  redirect-uri: https://www.caimei365.com/user/wechatLogin
+  #小程序wx信息
+  mini-app-id: wxf3cd4ae0cdd11c36
+  mini-app-secret: f5707c40c07adf0e2110c58ce6a4f4b3
+  #crm公众号信息
+  crm-app-id: wxea43a0f9ebce9e66
+  crm-app-secret: 1c3cd60908e72dd280840bee9e15f7f6

+ 73 - 7
src/main/resources/mapper/BaseUserMapper.xml

@@ -1,6 +1,16 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei365.user.mapper.BaseUserDao">
+    <select id="getUserIdByMobile" resultType="java.lang.Integer">
+        select userID from user
+        where bindMobile = #{mobile} and userIdentity in (1,2,3,4)
+        limit 1
+    </select>
+    <select id="getOperationIdByMobile" resultType="java.lang.Integer">
+        select id from cm_mall_operation_user
+        where mobile = #{mobile} and delFlag = '0'
+        limit 1
+    </select>
     <select id="getBaseUserByMobile" resultType="com.caimei365.user.model.BaseUser">
         select u.userID as userId,
                u.userName as userName,
@@ -48,17 +58,73 @@
         where o.mobile = #{mobile} and o.delFlag = '0'
         limit 1
     </select>
-
-    <select id="getUserIdByMobile" resultType="java.lang.Integer">
-        select userID from user
-        where bindMobile = #{mobile} and userIdentity in (1,2,3,4)
+    <select id="getServiceProviderByOpenId" resultType="com.caimei365.user.model.BaseUser">
+        select u.userID as userId,
+               u.userName as userName,
+               u.mobile as mobile,
+               u.bindMobile as bindMobile,
+               u.email as email,
+               u.userPermission as userPermission,
+               u.userIdentity as userIdentity,
+               u.password as password
+        from serviceprovider s
+        left join user u on s.userID = u.userID
+        where s.openid = #{openid} and u.validFlag = 1
         limit 1
     </select>
-    <select id="getOperationIdByMobile" resultType="java.lang.Integer">
-        select id from cm_mall_operation_user
-        where mobile = #{mobile} and delFlag = '0'
+    <select id="getOperationUserByUnionId" resultType="com.caimei365.user.model.BaseUser">
+        select o.userID as userId,
+               o.mobile as mobile,
+               o.clubID as clubId,
+               o.shopID as shopId,
+               o.unionId as unionId,
+               o.openid as openId
+        from
+          cm_mall_operation_user o
+        where unionId = #{unionId} and delFlag = '0'
+        and (userOrganizeID='2' or userOrganizeID is null)
+        limit 1
+    </select>
+    <select id="getOperationUserByOpenId" resultType="com.caimei365.user.model.BaseUser">
+        select o.userID as userId,
+               o.mobile as mobile,
+               o.clubID as clubId,
+               o.shopID as shopId,
+               o.unionId as unionId,
+               o.openid as openId
+        from
+          cm_mall_operation_user o
+        where
+        <if test="source=='www'">
+            pcOpenid = #{openId}
+        </if>
+        <if test="source=='crm'">
+            crmOpenid = #{openId}
+        </if>
+        <if test="source=='mini'">
+            openid = #{openId}
+        </if>
+        and delFlag = '0'
+        and (userOrganizeID='2' or userOrganizeID is null)
         limit 1
     </select>
+    <update id="updateServiceProviderUnionId">
+        update serviceprovider
+        set unionId = #{unionId}
+        where userID = #{userId}
+    </update>
+    <update id="updateOperationOpenId">
+        update cm_mall_operation_user
+        set openid = #{openId}
+        where userID = #{userId}
+    </update>
+    <update id="updateOperationUnionId">
+        update cm_mall_operation_user
+        set unionId = #{unionId}
+        where userID = #{userId}
+    </update>
+
+
     <select id="getUserIdByEmail" resultType="java.lang.Integer">
         select userID from user
         where email = #{mobile} and userIdentity in (1,2,3,4)

+ 4 - 0
src/main/resources/mapper/RegisterUserMapper.xml

@@ -9,6 +9,10 @@
         insert into club(`name`, `sName`, `contractMobile`, `linkMan`, `userID`, `addTime`, `status`, `spID`)
                   values(#{name},#{sName},#{contractMobile},#{linkMan},#{userId},#{addTime},#{status},#{serviceProviderId})
     </insert>
+    <insert id="insertOperation" parameterType="com.caimei365.user.model.OperationPo" keyProperty="clubId" useGeneratedKeys="true">
+        insert into cm_mall_operation_user(`userID`, `clubID`, `nickName`, `headimgurl`, `userType`, `mobile`, `linkName`, `status`, `unionId`, `openid`, `addTime`, `updateTime`, `bindTime`, `delFlag`)
+                                    values(#{userId},#{clubId},#{nickName},#{avatarUrl},#{UserType},#{mobile},#{linkName},#{status},#{unionId},#{openid},#{addTime},#{updateTime},#{bindTime},#{delFlag})
+    </insert>
     <update id="updateUserClubId">
         update user set clubID = #{clubId} where userID = #{userId}
     </update>

+ 1 - 1
src/test/java/com/caimei365/user/ReactiveRedisTest.java

@@ -1,6 +1,6 @@
 package com.caimei365.user;
 
-import com.caimei365.user.service.RedisService;
+import com.caimei365.user.components.RedisService;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;