chao 4 лет назад
Родитель
Сommit
6fed4ca761

+ 71 - 1
src/main/java/com/caimei365/user/components/WeChatService.java

@@ -147,7 +147,7 @@ public class WeChatService {
      * @param serverWebExchange ServerWebExchange
      * @return HashMap
      */
-    public JsonModel<Map<String, Object>> getAppletsInfo(String code, ServerWebExchange serverWebExchange) {
+    public JsonModel<Map<String, Object>> getInfoMapByApplets(String code, ServerWebExchange serverWebExchange) {
         log.info("Start get SessionKey");
         Map<String, Object> returnMap = new HashMap<>(4);
         // 获取当前微信小程序的环境
@@ -192,6 +192,76 @@ public class WeChatService {
         return JsonModel.success(returnMap);
     }
 
+    /**
+     * 微信公众号授权链接(www)
+     * @param redirectUri 用于微信授权的中间页面
+     * @param mode        授权方式:1静默授权,其他手动同意授权
+     * @return newRedirectUri
+     */
+    public String getAuthorizationLink(String redirectUri, Integer mode) {
+        String link = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
+        // 应用唯一标识
+        link = link.replace("APPID", crmAppId);
+        // 中间页连接
+        link = link.replace("REDIRECT_URI", redirectUri);
+        if (mode == 1) {
+            // 静默授权
+            link = link.replace("snsapi_userinfo", "snsapi_base");
+        }
+        return link;
+    }
+
+    /**
+     * 网页授权登录,通过code获取openid
+     * @param code   微信code
+     * @param source 来源
+     * @return
+     */
+    public Map<String, Object> getInfoMapByWeb(String code, String source) throws Exception {
+        String link = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+        if ("pc".equals(source)) {
+            // 应用唯一标识
+            link = link.replace("APPID", appId);
+            // 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
+            link = link.replace("SECRET", appSecret);
+        } else {
+            //微信公众号
+            link = link.replace("APPID", crmAppId);
+            link = link.replace("SECRET", crmAppSecret);
+        }
+        // 获取的code参数
+        link = link.replace("CODE", code);
+        // 发送授权链接,得到微信用户信息
+        String result = RequestUtil.sendGet(link);
+        log.info(result);
+        Map<String, Object> map = JSONObject.parseObject(result, Map.class);
+        return map;
+    }
+
+    /**
+     * 微信公众号获取access_token
+     * @return access_token
+     */
+    public String getAccessToken() throws Exception {
+        String link = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
+        link = link.replace("APPID", crmAppId);
+        link = link.replace("APPSECRET", crmAppSecret);
+        String result  = RequestUtil.sendGet(link);
+        log.info("微信公众号获取access_token>>>" + result);
+        Map<String, Object> map = JSONObject.parseObject(result, Map.class);
+        return (String) map.get("access_token");
+    }
 
+    /**
+     * 微信公众号获取用户信息
+     * @return
+     */
+    public Map<String, Object> getUserInfo(String accessToken, String openid) throws Exception {
+        String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
+        String userInfo = RequestUtil.sendGet(requestUrl);
+        log.info("微信公众号授权用户数据>>>>>>>>>>>" + userInfo);
+        Map<String, Object> map = JSONObject.parseObject(userInfo, Map.class);
+        return map;
+    }
 
 }

+ 39 - 4
src/main/java/com/caimei365/user/controller/LoginApi.java

@@ -2,8 +2,11 @@ package com.caimei365.user.controller;
 
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
+import com.caimei365.user.model.UserLoginVo;
 import com.caimei365.user.service.LoginService;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -25,25 +28,57 @@ public class LoginApi {
     /**
      * 登录(用户名,密码)
      *
+     * spi旧接口:user/login
+     *
      * @param mobileOrEmail 手机号或邮箱
      * @param password 密码
      * @return BaseUser
      */
     @PostMapping("/password")
-    public JsonModel<BaseUser> passwordLogin(String mobileOrEmail, String password) {
+    public JsonModel<UserLoginVo> passwordLogin(String mobileOrEmail, String password) {
         return loginService.passwordLogin(mobileOrEmail, password);
     }
 
     /**
      * 微信授权登录(小程序)
      *
+     * spi旧接口:club/authorization
+     *
      * @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) {
+    @PostMapping("/auth/applets")
+    public JsonModel<UserLoginVo> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange) {
         return loginService.appletsAuthorization(code, encryptedData, iv, serverWebExchange);
     }
+
+    /**
+     * 微信公众号授权链接(www)
+     *
+     * spi旧接口:user/authorizationLink
+     *
+     * @param redirectUri 用于微信授权的中间页面
+     * @param mode        授权方式:1静默授权,其他手动同意授权
+     */
+    @GetMapping("/auth/link")
+    public JsonModel<String> getAuthorizationLink(String redirectUri, Integer mode) {
+        return loginService.getAuthorizationLink(redirectUri, mode);
+    }
+
+    /**
+     * 微信公众号授权登录(www)
+     *
+     * spi旧接口:user/authorizationLogin
+     *
+     * @param code  微信code
+     * @param state 安全认证
+     * @param mode  1:静默授权,2:用户手动授权
+     */
+    @GetMapping("/auth/website")
+    public JsonModel<UserLoginVo>  websiteAuthorization(String code, String state, Integer mode, ServerWebExchange serverWebExchange) {
+        return loginService.websiteAuthorization(code, state, mode, serverWebExchange);
+    }
+
+
 }

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

@@ -51,7 +51,7 @@ public class ShopApi {
      */
     @Idempotent(prefix="idempotent_club", keys={"#baseUser"}, expire=5)
     @PostMapping("/pc/register")
-    public JsonModel<BaseUser> pcRegister(Integer source,
+    public JsonModel<UserLoginVo> pcRegister(Integer source,
                                         String name,
                                         String sName,
                                         String bindMobile,

+ 31 - 11
src/main/java/com/caimei365/user/mapper/BaseUserDao.java → src/main/java/com/caimei365/user/mapper/LoginMapper.java

@@ -2,6 +2,7 @@ package com.caimei365.user.mapper;
 
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.OperationPo;
+import com.caimei365.user.model.UserLoginVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -12,7 +13,7 @@ import org.apache.ibatis.annotations.Param;
  * @date : 2021/3/5
  */
 @Mapper
-public interface BaseUserDao {
+public interface LoginMapper {
     /**
      * 根据手机号获取用户id
      *
@@ -34,13 +35,20 @@ public interface BaseUserDao {
      * @return BaseUser
      */
     BaseUser getBaseUserByMobile(@Param("mobile") String mobile);
+    /**
+     * 根据用户id获取用户
+     *
+     * @param userId 手机号
+     * @return baseuser
+     */
+    UserLoginVo getLoginUserByUserId(Integer userId);
     /**
      * 根据手机号或邮箱获取用户
      *
      * @param mobileOrEmail 手机号/邮箱
      * @return BaseUser
      */
-    BaseUser getBaseUserByMobileOrEmail(@Param("mobileOrEmail") String mobileOrEmail);
+    UserLoginVo getLoginUserByMobileOrEmail(@Param("mobileOrEmail") String mobileOrEmail);
     /**
      * 根据手机号获取运营人员
      *
@@ -54,7 +62,7 @@ public interface BaseUserDao {
      * @param openId openId
      * @return BaseUser
      */
-    BaseUser getServiceProviderByOpenId(String openId);
+    UserLoginVo getServiceProviderByOpenId(String openId);
 
     /**
      * 根据用户ID更新协销unionId
@@ -66,9 +74,17 @@ public interface BaseUserDao {
     /**
      * 根据unionId获取运营人员
      * @param unionId unionId
+     * @param source
      * @return BaseUser
      */
-    BaseUser getOperationUserByUnionId(String unionId);
+    UserLoginVo getOperationUserByUnionId(@Param("unionId") String unionId, @Param("source") String source);
+    /**
+     * 根据openId获取运营人员
+     * @param openId
+     * @param source
+     * @return
+     */
+    UserLoginVo getOperationUserByOpenId(@Param("openId") String openId, @Param("source") String source);
     /**
      * 根据用户ID更新运营人员openId
      * @param userId
@@ -81,13 +97,7 @@ public interface BaseUserDao {
      * @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
@@ -96,4 +106,14 @@ public interface BaseUserDao {
      * @return userId
      */
     Integer getUserIdByEmail(String email);
+
+    /**
+     * 根据openId获取用户Id
+     * @param openId
+     * @param source
+     * @return
+     */
+    Integer getUserIdByOpenId(String openId, String source);
+
+
 }

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

@@ -2,6 +2,8 @@ package com.caimei365.user.model;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * Description
  *
@@ -9,7 +11,7 @@ import lombok.Data;
  * @date : 2021/3/2
  */
 @Data
-public class BaseUser {
+public class BaseUser implements Serializable {
     /**
      * 用户ID
      */

+ 86 - 0
src/main/java/com/caimei365/user/model/UserLoginVo.java

@@ -0,0 +1,86 @@
+package com.caimei365.user.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 登录成功返回用户数据
+ *
+ * @author : Charles
+ * @date : 2021/3/10
+ */
+@Data
+public class UserLoginVo implements Serializable {
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 机构ID
+     */
+    private Integer clubId;
+    /**
+     * 供应商ID
+     */
+    private Integer shopId;
+    /**
+     * 协销Id
+     */
+    private Integer serviceProviderId;
+    /**
+     * 企业账号名
+     */
+    private Integer account;
+    /**
+     * 机构名称
+     */
+    private String name;
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 个人手机号码
+     */
+    private String mobile;
+    /**
+     * 企业绑定手机号
+     */
+    private String bindMobile;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 用户身份: 1协销 2会员机构 3供应商 4普通机构
+     */
+    private Integer userIdentity;
+    /**
+     * 用户权限: 2会员机构 3供应商 4协销 5普通机构
+     */
+    private Integer userPermission;
+    /**
+     * 用户状态:
+     * 机构:90:已上线,91:已冻结,92:审查资料未通过,待补充资料,1:待审查资料,2:电话预约,3:已预约,20:待确认,21:待拜访,30:待员工推荐,40:已完成第一次采购
+     * 供应商:90:已上线,91:已下线,92:审核不通过,3:待审核
+     */
+    private Integer status;
+    /**
+     * token
+     */
+    private String token;
+    /**
+     * 微信unionId
+     */
+    private String unionId;
+    /**
+     * 微信openId
+     */
+    private String openId;
+
+}

+ 22 - 3
src/main/java/com/caimei365/user/service/LoginService.java

@@ -1,7 +1,7 @@
 package com.caimei365.user.service;
 
-import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
+import com.caimei365.user.model.UserLoginVo;
 import org.springframework.web.server.ServerWebExchange;
 
 /**
@@ -19,7 +19,7 @@ public interface LoginService {
      * @param password      密码
      * @return BaseUser
      */
-    JsonModel<BaseUser> passwordLogin(String mobileOrEmail, String password);
+    JsonModel<UserLoginVo> passwordLogin(String mobileOrEmail, String password);
 
     /**
      * 微信授权登录(小程序)
@@ -30,5 +30,24 @@ public interface LoginService {
      * @param serverWebExchange ServerWebExchange
      * @return BaseUser
      */
-    JsonModel<BaseUser> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange);
+    JsonModel<UserLoginVo> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange);
+
+    /**
+     * 微信公众号授权链接(www)
+     *
+     * @param redirectUri 用于微信授权的中间页面
+     * @param mode        授权方式:1静默授权,其他手动同意授权
+     */
+    JsonModel<String> getAuthorizationLink(String redirectUri, Integer mode);
+
+    /**
+     * 微信公众号授权登录(www)
+     *
+     * spi旧接口:user/authorizationLogin
+     *
+     * @param code  微信code
+     * @param state 安全认证
+     * @param mode  1:静默授权,2:用户手动授权
+     */
+    JsonModel<UserLoginVo> websiteAuthorization(String code, String state, Integer mode, ServerWebExchange serverWebExchange);
 }

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

@@ -36,7 +36,7 @@ public interface ShopService {
      * @param serverWebExchange     ServerWebExchange(新参数)
      * @return BaseUser
      */
-    JsonModel<BaseUser> register(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange);
+    JsonModel<UserLoginVo> register(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange);
 
     /**
      * 小程序端分步供应商注册
@@ -64,5 +64,5 @@ public interface ShopService {
      * @param whichStep             注册步数
      * @return BaseUser
      */
-    JsonModel<BaseUser> appletsRegister(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange, Integer whichStep);
+    JsonModel<UserLoginVo> appletsRegister(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange, Integer whichStep);
 }

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

@@ -1,6 +1,6 @@
 package com.caimei365.user.service.impl;
 
-import com.caimei365.user.mapper.BaseUserDao;
+import com.caimei365.user.mapper.LoginMapper;
 import com.caimei365.user.mapper.RegisterUserDao;
 import com.caimei365.user.model.*;
 import com.caimei365.user.service.ClubService;
@@ -32,7 +32,7 @@ public class ClubServiceImpl implements ClubService {
     @Resource
     private RedisService redisService;
     @Resource
-    private BaseUserDao baseUserDao;
+    private LoginMapper loginMapper;
     @Resource
     private RegisterUserDao registerUserDao;
 
@@ -75,12 +75,12 @@ public class ClubServiceImpl implements ClubService {
             return JsonModel.error("请勾选同意协议", null);
         }
         // 查找用户表是否存在
-        Integer dbUserId = baseUserDao.getUserIdByMobile(bindMobile);
+        Integer dbUserId = loginMapper.getUserIdByMobile(bindMobile);
         if (dbUserId > 0) {
             return JsonModel.error("该手机号已被使用", null);
         }
         // 查找运营人员表是否存在
-        Integer dbOperationId = baseUserDao.getOperationIdByMobile(bindMobile);
+        Integer dbOperationId = loginMapper.getOperationIdByMobile(bindMobile);
         if (dbOperationId > 0) {
             return JsonModel.error("您已是机构运营人员,无需再注册机构", null);
         }
@@ -112,7 +112,7 @@ public class ClubServiceImpl implements ClubService {
         // 设置机构上线
         user.setClubStatus(90);
         // 设置密码
-        user.setPassword(Md5Util.md5(user.getPassword()));
+        user.setPassword(Md5Util.md5(password));
         // 同意协议
         user.setAgreeFlag(isAgreed);
         // 用户状态,1正常,0冻结
@@ -188,7 +188,7 @@ public class ClubServiceImpl implements ClubService {
             operation.setStatus(2);
             // 微信unionId
             operation.setUnionId(unionId);
-            Map<Object, Object> infoData = redisService.getEntries("wxInfo:" + unionId);
+            Map<Object, Object> infoData = redisService.getEntries("wxInfo:applets:" + unionId);
             String openId = (String) infoData.get("openId");
             // 微信openId
             operation.setOpenId(openId);

+ 124 - 46
src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java

@@ -2,9 +2,10 @@ 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.mapper.LoginMapper;
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
+import com.caimei365.user.model.UserLoginVo;
 import com.caimei365.user.service.LoginService;
 import com.caimei365.user.components.RedisService;
 import com.caimei365.user.utils.JwtUtil;
@@ -16,6 +17,7 @@ import org.springframework.web.server.ServerWebExchange;
 
 import javax.annotation.Resource;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * Description
@@ -32,7 +34,7 @@ public class LoginServiceImpl implements LoginService {
     @Resource
     private WeChatService weChatService;
     @Resource
-    private BaseUserDao baseUserDao;
+    private LoginMapper loginMapper;
 
     /**
      * 登录(用户名,密码)
@@ -42,7 +44,7 @@ public class LoginServiceImpl implements LoginService {
      * @return BaseUser
      */
     @Override
-    public JsonModel<BaseUser> passwordLogin(String mobileOrEmail, String password) {
+    public JsonModel<UserLoginVo> passwordLogin(String mobileOrEmail, String password) {
         if (mobileOrEmail.isEmpty()) {
             return JsonModel.error("请填写账户名", null);
         }
@@ -50,7 +52,7 @@ public class LoginServiceImpl implements LoginService {
             return JsonModel.error("请填写密码", null);
         }
         //处理比对密码
-        BaseUser baseUser = baseUserDao.getBaseUserByMobileOrEmail(mobileOrEmail);
+        UserLoginVo baseUser = loginMapper.getLoginUserByMobileOrEmail(mobileOrEmail);
         if (baseUser != null) {
             String md5Password = Md5Util.md5(password);
             String dbPassword = baseUser.getPassword();
@@ -67,33 +69,6 @@ public class LoginServiceImpl implements LoginService {
         return JsonModel.error("输入的密码和账户名不匹配", null);
     }
 
-    /**
-     * 登录校验
-     * @param baseUser 用户信息
-     * @return BaseUser
-     */
-    private JsonModel<BaseUser> logonVerify(BaseUser baseUser) {
-        // 生成token给用户
-        String token = JwtUtil.createToken(baseUser.getUserId());
-        // 为了过期续签,将token存入redis,并设置超时时间
-        redisService.set(token, token, JwtUtil.getExpireTime());
-        baseUser.setToken(token);
-        if (baseUser.getStatus() == 91) {
-            //机构 / 供应商
-            return JsonModel.error(-2, "您的企业账号已被冻结,请联系客服处理", null);
-        }
-        // 供应商
-        if (baseUser.getUserIdentity() == 3) {
-            if (baseUser.getStatus() == 3) {
-                return JsonModel.error(-2, "您的企业账号正在加速审核中,审核通过后即可登录", null);
-            }
-            if (baseUser.getStatus() == 92) {
-                return JsonModel.error(-3, "您的企业账号审核未通过", baseUser);
-            }
-        }
-        return JsonModel.success("登录成功", baseUser);
-    }
-
     /**
      * 微信授权登录(小程序)
      *
@@ -103,12 +78,12 @@ public class LoginServiceImpl implements LoginService {
      * @param serverWebExchange ServerWebExchange
      */
     @Override
-    public JsonModel<BaseUser> appletsAuthorization(String code, String encryptedData, String iv, ServerWebExchange serverWebExchange) {
+    public JsonModel<UserLoginVo> 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);
+        JsonModel<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(code, serverWebExchange);
         if (appletsInfo.getCode() == -1) {
             return JsonModel.error(appletsInfo.getMsg(), null);
         }
@@ -129,12 +104,13 @@ public class LoginServiceImpl implements LoginService {
             e.printStackTrace();
             return JsonModel.error("微信解密失败", null);
         }
-        redisService.setMap("wxInfo:" + unionId, infoData);
-        log.info("通过wxInfo:unionId键保存到redis,返回unionId给前端>>>>>>>>" + unionId);
+        // 用户数据存入Redis,key前缀:wxInfo:applets:
+        redisService.setMap("wxInfo:applets:" + unionId, infoData);
+        log.info("小程序授权登录,返回unionId给前端,用户数据存入Redis,key:wxInfo:applets:" + unionId);
         // 协销授权登录
-        BaseUser seller = baseUserDao.getServiceProviderByOpenId(openId);
+        UserLoginVo seller = loginMapper.getServiceProviderByOpenId(openId);
         if (null != seller) {
-            baseUserDao.updateServiceProviderUnionId(seller.getUserId(), unionId);
+            loginMapper.updateServiceProviderUnionId(seller.getUserId(), unionId);
             String token = JwtUtil.createToken(seller.getUserId());
             seller.setToken(token);
             seller.setUnionId(unionId);
@@ -142,29 +118,131 @@ public class LoginServiceImpl implements LoginService {
             return JsonModel.success(seller);
         }
         // 运营人员授权登录
-        BaseUser operation = baseUserDao.getOperationUserByUnionId(unionId);
+        return operationAuthLogin(openId, unionId, "mini");
+    }
+
+    /**
+     * 微信公众号授权链接(www)
+     *
+     * @param redirectUri 用于微信授权的中间页面
+     * @param mode        授权方式:1静默授权,其他手动同意授权
+     */
+    @Override
+    public JsonModel<String> getAuthorizationLink(String redirectUri, Integer mode) {
+        String link = weChatService.getAuthorizationLink(redirectUri, mode);
+        String state = UUID.randomUUID().toString();
+        redisService.set(state, state, 1800L);
+        link = link.replace("STATE", state);
+        return JsonModel.success(link);
+    }
+
+    /**
+     * 微信公众号授权登录(www)
+     * <p>
+     * spi旧接口:user/authorizationLogin
+     *
+     * @param code              微信code
+     * @param state             安全认证
+     * @param mode              1:静默授权,2:用户手动授权
+     * @param serverWebExchange ServerWebExchange
+     */
+    @Override
+    public JsonModel<UserLoginVo> websiteAuthorization(String code, String state, Integer mode, ServerWebExchange serverWebExchange) {
+        if (StringUtils.isBlank(code) || StringUtils.isBlank(state)) {
+            return JsonModel.error("参数异常", null);
+        }
+        String wxState = (String) redisService.get(state);
+        log.info("微信code>>>" + code + "state>>>" + wxState + "----" + state + "mode>>>" + mode);
+        if (wxState.equals(state)) {
+            try {
+                // 通过code获取微信用户信息
+                Map<String, Object> map = weChatService.getInfoMapByWeb(code, "crm");
+                String openId = (String) map.get("openid");
+                if (mode == 1) {
+                    // 静默授权
+                    Integer userId = loginMapper.getUserIdByOpenId(openId, "www");
+                    if (userId > 0) {
+                        UserLoginVo user = loginMapper.getLoginUserByUserId(userId);
+                        // 返回登录用户
+                        return logonVerify(user);
+                    } else {
+                        return JsonModel.error(-4, "您的微信尚未绑定任何机构", null);
+                    }
+                } else {
+                    // 获取access_token
+                    String accessToken = weChatService.getAccessToken();
+                    // 获取微信用户信息
+                    Map<String, Object> infoData = weChatService.getUserInfo(accessToken, openId);
+                    String unionId = (String) infoData.get("unionid");
+                    // 用户数据存入Redis,key前缀:wxInfo:website:
+                    redisService.setMap("wxInfo:website:" + unionId, infoData);
+                    log.info("移动端授权登录,返回unionId给前端,用户数据存入Redis,key:wxInfo:website:" + unionId);
+                    // 运营人员授权登录
+                    return operationAuthLogin(openId, unionId, "www");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                return JsonModel.error("获取微信信息异常", null);
+            }
+        }
+        return JsonModel.error("请从正确的途径打开链接", null);
+    }
+
+    /**
+     * 运营人员授权登录
+     * @param openId 微信openId
+     * @param unionId 微信unionId
+     * @param source 来源:www网站, mini小程序
+     * @return BaseUser
+     */
+    private JsonModel<UserLoginVo> operationAuthLogin(String openId, String unionId, String source) {
+        UserLoginVo operation = loginMapper.getOperationUserByUnionId(unionId, source);
         if (null == operation) {
-            operation = baseUserDao.getOperationUserByOpenId(openId, "mini");
-            if (null == operation){
-                operation = new BaseUser();
+            operation = loginMapper.getOperationUserByOpenId(openId, source);
+            if (null == operation) {
+                operation = new UserLoginVo();
                 operation.setOpenId(openId);
                 operation.setUnionId(unionId);
-                return JsonModel.error("运营人员不存在,请登录", operation);
+                return JsonModel.error("您的微信尚未绑定任何机构", operation);
             } else {
                 // 表示 openId存在, unionId不存在
-                baseUserDao.updateOperationUnionId(operation.getUserId(), unionId);
+                loginMapper.updateOperationUnionId(operation.getUserId(), unionId);
             }
         }
         // 如果unionId存在, openId不存在
         if (StringUtils.isEmpty(operation.getOpenId()) || StringUtils.isBlank(operation.getOpenId())) {
-            baseUserDao.updateOperationOpenId(operation.getUserId(), openId);
+            loginMapper.updateOperationOpenId(operation.getUserId(), openId);
         }
         operation.setOpenId(openId);
         operation.setUnionId(unionId);
         // 返回登录校验结果
         return logonVerify(operation);
     }
-
-
+    /**
+     * 登录校验
+     * @param baseUser 用户信息
+     * @return BaseUser
+     */
+    private JsonModel<UserLoginVo> logonVerify(UserLoginVo baseUser) {
+        // 生成token给用户
+        String token = JwtUtil.createToken(baseUser.getUserId());
+        // 为了过期续签,将token存入redis,并设置超时时间
+        redisService.set(token, token, JwtUtil.getExpireTime());
+        baseUser.setToken(token);
+        if (baseUser.getStatus() == 91) {
+            //机构 / 供应商
+            return JsonModel.error(-2, "您的企业账号已被冻结,请联系客服处理", null);
+        }
+        // 供应商
+        if (baseUser.getUserIdentity() == 3) {
+            if (baseUser.getStatus() == 3) {
+                return JsonModel.error(-2, "您的企业账号正在加速审核中,审核通过后即可登录", null);
+            }
+            if (baseUser.getStatus() == 92) {
+                return JsonModel.error(-3, "您的企业账号审核未通过", baseUser);
+            }
+        }
+        return JsonModel.success("登录成功", baseUser);
+    }
 
 }

+ 10 - 11
src/main/java/com/caimei365/user/service/impl/ShopServiceImpl.java

@@ -1,9 +1,8 @@
 package com.caimei365.user.service.impl;
 
 import com.caimei365.user.components.RedisService;
-import com.caimei365.user.mapper.BaseUserDao;
+import com.caimei365.user.mapper.LoginMapper;
 import com.caimei365.user.mapper.RegisterUserDao;
-import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
 import com.caimei365.user.model.ShopPo;
 import com.caimei365.user.model.UserPo;
@@ -33,7 +32,7 @@ public class ShopServiceImpl implements ShopService {
     @Resource
     private RedisService redisService;
     @Resource
-    private BaseUserDao baseUserDao;
+    private LoginMapper loginMapper;
     @Resource
     private RegisterUserDao registerUserDao;
 
@@ -63,7 +62,7 @@ public class ShopServiceImpl implements ShopService {
      * @return BaseUser
      */
     @Override
-    public JsonModel<BaseUser> register(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange) {
+    public JsonModel<UserLoginVo> register(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange) {
         // 打印IP
         String ip = RequestUtil.getIp(serverWebExchange);
         log.info("X-Forwarded-For:" + ip);
@@ -84,12 +83,12 @@ public class ShopServiceImpl implements ShopService {
             return JsonModel.error("请勾选同意协议", null);
         }
         // 查找用户表是否存在
-        Integer dbUserId = baseUserDao.getUserIdByMobile(bindMobile);
+        Integer dbUserId = loginMapper.getUserIdByMobile(bindMobile);
         if (dbUserId > 0) {
             return JsonModel.error("该手机号已被使用", null);
         }
         // 查找运营人员表是否存在
-        Integer dbOperationId = baseUserDao.getOperationIdByMobile(bindMobile);
+        Integer dbOperationId = loginMapper.getOperationIdByMobile(bindMobile);
         if (dbOperationId > 0) {
             return JsonModel.error("您已是机构运营人员,无需再注册机构", null);
         }
@@ -98,7 +97,7 @@ public class ShopServiceImpl implements ShopService {
             return JsonModel.error("手机验证码错误", null);
         }
         if (StringUtils.isNotBlank(email)) {
-            dbUserId = baseUserDao.getUserIdByEmail(email);
+            dbUserId = loginMapper.getUserIdByEmail(email);
             if (dbUserId > 0) {
                 return JsonModel.error("该邮箱已被使用", null);
             }
@@ -222,7 +221,7 @@ public class ShopServiceImpl implements ShopService {
      * @return BaseUser
      */
     @Override
-    public JsonModel<BaseUser> appletsRegister(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange, Integer whichStep) {
+    public JsonModel<UserLoginVo> appletsRegister(Integer source, String name, String sName, String bindMobile, String email, String smsCode, String password, String passWordConfirm, String linkMan, Integer provinceId, Integer cityId, Integer townId, String address, String socialCreditCode, String businessLicenseImage, String firstShopType, String secondShopType, String mainPro, Integer isAgreed, ServerWebExchange serverWebExchange, Integer whichStep) {
         // 参数校验
         if (1 == whichStep) {
             if (StringUtils.isBlank(bindMobile) || StringUtils.isBlank(password)
@@ -234,12 +233,12 @@ public class ShopServiceImpl implements ShopService {
                 return JsonModel.error("两次输入的密码不一致");
             }
             // 查找用户表是否存在
-            Integer dbUserId = baseUserDao.getUserIdByMobile(bindMobile);
+            Integer dbUserId = loginMapper.getUserIdByMobile(bindMobile);
             if (dbUserId > 0) {
                 return JsonModel.error("该手机号已被使用", null);
             }
             // 查找运营人员表是否存在
-            Integer dbOperationId = baseUserDao.getOperationIdByMobile(bindMobile);
+            Integer dbOperationId = loginMapper.getOperationIdByMobile(bindMobile);
             if (dbOperationId > 0) {
                 return JsonModel.error("您已是机构运营人员,无需再注册机构", null);
             }
@@ -253,7 +252,7 @@ public class ShopServiceImpl implements ShopService {
                 return JsonModel.error("参数异常");
             }
             if (StringUtils.isNotBlank(email)) {
-                Integer dbUserId = baseUserDao.getUserIdByEmail(email);
+                Integer dbUserId = loginMapper.getUserIdByEmail(email);
                 if (dbUserId > 0) {
                     return JsonModel.error("该邮箱已被使用", null);
                 }

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

@@ -1,6 +1,6 @@
 package com.caimei365.user.service.impl;
 
-import com.caimei365.user.mapper.BaseUserDao;
+import com.caimei365.user.mapper.LoginMapper;
 import com.caimei365.user.model.BaseUser;
 import com.caimei365.user.model.JsonModel;
 import com.caimei365.user.components.RedisService;
@@ -31,7 +31,7 @@ public class UserServiceImpl implements UserService {
     @Resource
     private RedisService redisService;
     @Resource
-    private BaseUserDao baseUserDao;
+    private LoginMapper loginMapper;
 
     /**
      * 获取图片验证码
@@ -109,7 +109,7 @@ public class UserServiceImpl implements UserService {
             // 生成六位验证码
             String randomCode = CodeUtil.generateCodeInt(6);
             // 根据手机号查询用户
-            BaseUser baseUser = baseUserDao.getBaseUserByMobile(mobile);
+            BaseUser baseUser = loginMapper.getBaseUserByMobile(mobile);
             if ("1".equals(activateCodeType)) {
                 if (null == baseUser) {
                     return JsonModel.error("该手机号尚未注册");

+ 55 - 7
src/main/resources/mapper/BaseUserMapper.xml → src/main/resources/mapper/LoginMapper.xml

@@ -1,6 +1,6 @@
 <?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">
+<mapper namespace="com.caimei365.user.mapper.LoginMapper">
     <select id="getUserIdByMobile" resultType="java.lang.Integer">
         select userID from user
         where bindMobile = #{mobile} and userIdentity in (1,2,3,4)
@@ -27,7 +27,20 @@
         ) and u.userIdentity in (1,2,3,4)
         limit 1
     </select>
-    <select id="getBaseUserByMobileOrEmail" resultType="com.caimei365.user.model.BaseUser">
+    <select id="getLoginUserByUserId" resultType="com.caimei365.user.model.UserLoginVo">
+        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 user u
+        where u.userID = #{userId}
+        limit 1
+    </select>
+    <select id="getLoginUserByMobileOrEmail" resultType="com.caimei365.user.model.UserLoginVo">
         select u.userID as userId,
             u.userName as userName,
             u.mobile as mobile,
@@ -58,7 +71,7 @@
         where o.mobile = #{mobile} and o.delFlag = '0'
         limit 1
     </select>
-    <select id="getServiceProviderByOpenId" resultType="com.caimei365.user.model.BaseUser">
+    <select id="getServiceProviderByOpenId" resultType="com.caimei365.user.model.UserLoginVo">
         select u.userID as userId,
                u.userName as userName,
                u.mobile as mobile,
@@ -72,26 +85,42 @@
         where s.openid = #{openid} and u.validFlag = 1
         limit 1
     </select>
-    <select id="getOperationUserByUnionId" resultType="com.caimei365.user.model.BaseUser">
+    <select id="getOperationUserByUnionId" resultType="com.caimei365.user.model.UserLoginVo">
         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
+                <if test="source=='www'">
+                    o.pcOpenid as openId
+                </if>
+                <if test="source=='crm'">
+                    o.crmOpenid as openId
+                </if>
+                <if test="source=='mini'">
+                    o.openid as openId
+                </if>
         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 id="getOperationUserByOpenId" resultType="com.caimei365.user.model.UserLoginVo">
         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
+                <if test="source=='www'">
+                    o.pcOpenid as openId
+                </if>
+                <if test="source=='crm'">
+                    o.crmOpenid as openId
+                </if>
+                <if test="source=='mini'">
+                    o.openid as openId
+                </if>
         from
           cm_mall_operation_user o
         where
@@ -130,5 +159,24 @@
         where email = #{mobile} and userIdentity in (1,2,3,4)
         limit 1
     </select>
+    <select id="getUserIdByOpenId" resultType="java.lang.Integer">
+        select o.userID as userId
+        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>
+
 
 </mapper>