Browse Source

呵呵商城登录

plf 4 years ago
parent
commit
e89afd4ca3

+ 40 - 10
src/main/java/com/caimei365/user/components/WeChatService.java

@@ -44,25 +44,35 @@ public class WeChatService {
     private String crmAppId;
     private String crmAppId;
     @Value("${wx.crm-app-secret}")
     @Value("${wx.crm-app-secret}")
     private String crmAppSecret;
     private String crmAppSecret;
+    @Value("${wx.hehe-app-id}")
+    private String heHeAppId;
+    @Value("${wx.hehe-app-secret}")
+    private String heHeAppSecret;
 
 
     public void setRedirectUri(String redirectUri) {
     public void setRedirectUri(String redirectUri) {
         redirectUri = redirectUri;
         redirectUri = redirectUri;
     }
     }
+
     public void setAppId(String appId) {
     public void setAppId(String appId) {
         appId = appId;
         appId = appId;
     }
     }
+
     public void setAppSecret(String appSecret) {
     public void setAppSecret(String appSecret) {
         appSecret = appSecret;
         appSecret = appSecret;
     }
     }
+
     public void setMiniAppId(String miniAppId) {
     public void setMiniAppId(String miniAppId) {
         miniAppId = miniAppId;
         miniAppId = miniAppId;
     }
     }
+
     public void setMiniAppSecret(String miniAppSecret) {
     public void setMiniAppSecret(String miniAppSecret) {
         miniAppSecret = miniAppSecret;
         miniAppSecret = miniAppSecret;
     }
     }
+
     public void setCrmAppId(String crmAppId) {
     public void setCrmAppId(String crmAppId) {
         crmAppId = crmAppId;
         crmAppId = crmAppId;
     }
     }
+
     public void setCrmAppSecret(String crmAppSecret) {
     public void setCrmAppSecret(String crmAppSecret) {
         crmAppSecret = crmAppSecret;
         crmAppSecret = crmAppSecret;
     }
     }
@@ -70,21 +80,27 @@ public class WeChatService {
     public String getRedirectUri() {
     public String getRedirectUri() {
         return redirectUri;
         return redirectUri;
     }
     }
+
     public String getAppId() {
     public String getAppId() {
         return appId;
         return appId;
     }
     }
+
     public String getAppSecret() {
     public String getAppSecret() {
         return appSecret;
         return appSecret;
     }
     }
+
     public String getMiniAppId() {
     public String getMiniAppId() {
         return miniAppId;
         return miniAppId;
     }
     }
+
     public String getMiniAppSecret() {
     public String getMiniAppSecret() {
         return miniAppSecret;
         return miniAppSecret;
     }
     }
+
     public String getCrmAppId() {
     public String getCrmAppId() {
         return crmAppId;
         return crmAppId;
     }
     }
+
     public String getCrmAppSecret() {
     public String getCrmAppSecret() {
         return crmAppSecret;
         return crmAppSecret;
     }
     }
@@ -99,6 +115,7 @@ public class WeChatService {
         // BouncyCastle是一个开源的加解密解决方案
         // BouncyCastle是一个开源的加解密解决方案
         Security.addProvider(new BouncyCastleProvider());
         Security.addProvider(new BouncyCastleProvider());
     }
     }
+
     /**
     /**
      * AES解密
      * AES解密
      *
      *
@@ -136,11 +153,12 @@ public class WeChatService {
     /**
     /**
      * 小程序微信授权登录,获取openid
      * 小程序微信授权登录,获取openid
      *
      *
-     * @param code              微信凭证
-     * @param headers           HttpHeaders
+     * @param code    微信凭证
+     * @param headers HttpHeaders
+     * @param mode    1:采美小程序,2:呵呵商城小程序+
      * @return HashMap
      * @return HashMap
      */
      */
-    public ResponseJson<Map<String, Object>> getInfoMapByApplets(String code, HttpHeaders headers) {
+    public ResponseJson<Map<String, Object>> getInfoMapByApplets(String code, HttpHeaders headers, Integer mode) {
         log.info("Start get SessionKey");
         log.info("Start get SessionKey");
         Map<String, Object> returnMap = new HashMap<>(4);
         Map<String, Object> returnMap = new HashMap<>(4);
         // 获取当前微信小程序的环境
         // 获取当前微信小程序的环境
@@ -149,11 +167,19 @@ public class WeChatService {
         returnMap.put("referer", referer);
         returnMap.put("referer", referer);
         String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
         String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
         Map<String, String> requestUrlParam = new HashMap<String, String>(4);
         Map<String, String> requestUrlParam = new HashMap<String, String>(4);
-        // 小程序appId
-        requestUrlParam.put("appid", miniAppId);
-        log.info("appId: ---" + miniAppId);
-        // 小程序appSecret
-        requestUrlParam.put("secret", miniAppSecret);
+        if (mode == 1) {
+            // 小程序appId
+            requestUrlParam.put("appid", miniAppId);
+            log.info("采美小程序appId: ---" + miniAppId);
+            // 小程序appSecret
+            requestUrlParam.put("secret", miniAppSecret);
+        } else {
+            // 呵呵商城小程序appId
+            requestUrlParam.put("appid", heHeAppId);
+            log.info("呵呵商城appId: ---" + heHeAppId);
+            // 呵呵商城小程序appSecret
+            requestUrlParam.put("secret", heHeAppSecret);
+        }
         // 小程序端返回的code
         // 小程序端返回的code
         requestUrlParam.put("js_code", code);
         requestUrlParam.put("js_code", code);
         // 默认参数
         // 默认参数
@@ -172,7 +198,7 @@ public class WeChatService {
         String sessionKey = jsonObject.getString(Keys.SESSION_KEY);
         String sessionKey = jsonObject.getString(Keys.SESSION_KEY);
         String errCode = jsonObject.getString("errcode");
         String errCode = jsonObject.getString("errcode");
         String errMsg = jsonObject.getString("errmsg");
         String errMsg = jsonObject.getString("errmsg");
-        log.info("openId----->" + openId +", unionId------>" + unionId);
+        log.info("openId----->" + openId + ", unionId------>" + unionId);
         returnMap.put(Keys.OPEN_ID, openId);
         returnMap.put(Keys.OPEN_ID, openId);
         returnMap.put(Keys.UNION_ID, unionId);
         returnMap.put(Keys.UNION_ID, unionId);
         returnMap.put(Keys.SESSION_KEY, sessionKey);
         returnMap.put(Keys.SESSION_KEY, sessionKey);
@@ -185,6 +211,7 @@ public class WeChatService {
 
 
     /**
     /**
      * 微信公众号授权链接(www)
      * 微信公众号授权链接(www)
+     *
      * @param redirectUri 用于微信授权的中间页面
      * @param redirectUri 用于微信授权的中间页面
      * @param mode        授权方式:1静默授权,其他手动同意授权
      * @param mode        授权方式:1静默授权,其他手动同意授权
      * @return newRedirectUri
      * @return newRedirectUri
@@ -204,6 +231,7 @@ public class WeChatService {
 
 
     /**
     /**
      * 网页授权登录,通过code获取openid
      * 网页授权登录,通过code获取openid
+     *
      * @param code   微信code
      * @param code   微信code
      * @param source 来源
      * @param source 来源
      * @return
      * @return
@@ -231,13 +259,14 @@ public class WeChatService {
 
 
     /**
     /**
      * 微信公众号获取access_token
      * 微信公众号获取access_token
+     *
      * @return access_token
      * @return access_token
      */
      */
     public String getAccessToken() throws Exception {
     public String getAccessToken() throws Exception {
         String link = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
         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("APPID", crmAppId);
         link = link.replace("APPSECRET", crmAppSecret);
         link = link.replace("APPSECRET", crmAppSecret);
-        String result  = RequestUtil.sendGet(link);
+        String result = RequestUtil.sendGet(link);
         log.info("微信公众号获取access_token>>>" + result);
         log.info("微信公众号获取access_token>>>" + result);
         Map<String, Object> map = JSONObject.parseObject(result, Map.class);
         Map<String, Object> map = JSONObject.parseObject(result, Map.class);
         return (String) map.get("access_token");
         return (String) map.get("access_token");
@@ -245,6 +274,7 @@ public class WeChatService {
 
 
     /**
     /**
      * 微信公众号获取用户信息
      * 微信公众号获取用户信息
+     *
      * @return
      * @return
      */
      */
     public Map<String, Object> getUserInfo(String accessToken, String openId) throws Exception {
     public Map<String, Object> getUserInfo(String accessToken, String openId) throws Exception {

+ 60 - 0
src/main/java/com/caimei365/user/controller/HeHeApi.java

@@ -0,0 +1,60 @@
+package com.caimei365.user.controller;
+
+import com.caimei365.user.model.ResponseJson;
+import com.caimei365.user.model.dto.HeHeUserDto;
+import com.caimei365.user.model.vo.HeHeUserVo;
+import com.caimei365.user.service.HeHeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 呵呵商城用户API
+ *
+ * @author : plf
+ * @date : 2021/4/21
+ */
+@Api(tags = "呵呵商城用户API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/heHe")
+public class HeHeApi {
+
+    private final HeHeService heHeService;
+
+    @ApiOperation("微信授权登录")
+    @GetMapping("/authorization")
+    public ResponseJson<HeHeUserVo> authorization(String code, @RequestHeader HttpHeaders headers) {
+        if (StringUtils.isBlank(code)) {
+            return ResponseJson.error("微信code异常", null);
+        }
+        return heHeService.authorization(code, headers);
+    }
+
+    @ApiOperation("手机号验证码登录")
+    @PostMapping("/mobile/login")
+    public ResponseJson<HeHeUserVo> mobileLogin(@RequestBody HeHeUserDto heHeUserDto) {
+        if (StringUtils.isBlank(heHeUserDto.getMobile())) {
+            return ResponseJson.error("请输入手机号", null);
+        }
+        if (StringUtils.isBlank(heHeUserDto.getVerificationCode())) {
+            return ResponseJson.error("请输入短信验证码", null);
+        }
+        if (StringUtils.isBlank(heHeUserDto.getOpenId()) || StringUtils.isBlank(heHeUserDto.getNickName()) || StringUtils.isBlank(heHeUserDto.getHeadImgUrl())) {
+            return ResponseJson.error("微信信息异常", null);
+        }
+        return heHeService.mobileLogin(heHeUserDto);
+    }
+
+    @ApiOperation("发送手机号验证码")
+    @GetMapping("/send")
+    public ResponseJson<String> sendVerificationCode(String mobile) {
+        if (StringUtils.isBlank(mobile)) {
+            return ResponseJson.error("请输入手机号", null);
+        }
+        return heHeService.sendVerificationCode(mobile);
+    }
+}

+ 45 - 0
src/main/java/com/caimei365/user/mapper/HeHeMapper.java

@@ -0,0 +1,45 @@
+package com.caimei365.user.mapper;
+
+import com.caimei365.user.model.dto.HeHeUserDto;
+import com.caimei365.user.model.vo.HeHeUserVo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/4/21
+ */
+@Mapper
+public interface HeHeMapper {
+
+    /**
+     * 查询呵呵用户信息
+     *
+     * @param openId
+     * @return
+     */
+    HeHeUserVo findHeHeUserByOpenId(String openId);
+
+    /**
+     * 根据手机号查询用户信息
+     *
+     * @param mobile
+     * @return
+     */
+    HeHeUserVo findHeHeUserByMobile(String mobile);
+
+    /**
+     * 更新呵呵用户信息
+     *
+     * @param heHeUser
+     */
+    void updateHeHeUser(HeHeUserVo heHeUser);
+
+    /**
+     * 保存呵呵普通用户信息
+     *
+     * @param heHeUserDto
+     */
+    void insertHeHeUser(HeHeUserDto heHeUserDto);
+}

+ 52 - 0
src/main/java/com/caimei365/user/model/dto/HeHeUserDto.java

@@ -0,0 +1,52 @@
+package com.caimei365.user.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/4/22
+ */
+@ApiModel("呵呵小程序登录")
+@Data
+public class HeHeUserDto {
+    /**
+     * 手机号
+     */
+    @NotNull
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    /**
+     * 验证码
+     */
+    @NotNull
+    @ApiModelProperty("验证码")
+    private String verificationCode;
+
+    /**
+     * 微信昵称
+     */
+    @NotNull
+    @ApiModelProperty("微信昵称")
+    private String nickName;
+
+    /**
+     * 微信头像
+     */
+    @NotNull
+    @ApiModelProperty("微信头像")
+    private String headImgUrl;
+
+    /**
+     * 微信openid
+     */
+    @NotNull
+    @ApiModelProperty("微信openid")
+    private String openId;
+}

+ 49 - 0
src/main/java/com/caimei365/user/model/vo/HeHeUserVo.java

@@ -0,0 +1,49 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/4/21
+ */
+@Data
+public class HeHeUserVo implements Serializable {
+    /**
+     * 呵呵商城用户id
+     */
+    private Integer userId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 用户身份:1普通用户,2分销者
+     */
+    private String userIdentity;
+
+    /**
+     * 微信昵称
+     */
+    private String nickName;
+
+    /**
+     * 微信头像
+     */
+    private String headImgUrl;
+
+    /**
+     * 微信openid
+     */
+    private String openId;
+}

+ 39 - 0
src/main/java/com/caimei365/user/service/HeHeService.java

@@ -0,0 +1,39 @@
+package com.caimei365.user.service;
+
+import com.caimei365.user.model.ResponseJson;
+import com.caimei365.user.model.dto.HeHeUserDto;
+import com.caimei365.user.model.vo.HeHeUserVo;
+import org.springframework.http.HttpHeaders;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/4/21
+ */
+public interface HeHeService {
+    /**
+     * 微信授权登录
+     *
+     * @param code    微信code
+     * @param headers 请求头
+     * @return
+     */
+    ResponseJson<HeHeUserVo> authorization(String code, HttpHeaders headers);
+
+    /**
+     * 手机号验证码登录
+     *
+     * @param heHeUserDto
+     * @return
+     */
+    ResponseJson<HeHeUserVo> mobileLogin(HeHeUserDto heHeUserDto);
+
+    /**
+     * 发送手机验证码
+     *
+     * @param mobile
+     * @return
+     */
+    ResponseJson<String> sendVerificationCode(String mobile);
+}

+ 90 - 0
src/main/java/com/caimei365/user/service/impl/HeHeServiceImpl.java

@@ -0,0 +1,90 @@
+package com.caimei365.user.service.impl;
+
+import com.caimei365.user.components.RedisService;
+import com.caimei365.user.components.WeChatService;
+import com.caimei365.user.mapper.HeHeMapper;
+import com.caimei365.user.model.ResponseJson;
+import com.caimei365.user.model.dto.HeHeUserDto;
+import com.caimei365.user.model.vo.HeHeUserVo;
+import com.caimei365.user.service.HeHeService;
+import com.caimei365.user.utils.AliyunSmsUtil;
+import com.caimei365.user.utils.CodeUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/4/21
+ */
+@Slf4j
+@Service
+public class HeHeServiceImpl implements HeHeService {
+    @Resource
+    private HeHeMapper heHeMapper;
+    @Resource
+    private WeChatService weChatService;
+    @Resource
+    private RedisService redisService;
+
+    @Override
+    public ResponseJson<HeHeUserVo> authorization(String code, HttpHeaders headers) {
+        // 小程序微信授权获取登录信息
+        ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(code, headers, 2);
+        if (appletsInfo.getCode() == -1) {
+            return ResponseJson.error(appletsInfo.getMsg(), null);
+        }
+        Map<String, Object> infoData = appletsInfo.getData();
+        String openId = (String) infoData.get(WeChatService.Keys.OPEN_ID);
+        HeHeUserVo heHeUser = heHeMapper.findHeHeUserByOpenId(openId);
+        if (heHeUser == null) {
+            heHeUser = new HeHeUserVo();
+            heHeUser.setOpenId(openId);
+        }
+        return ResponseJson.success(heHeUser);
+    }
+
+    @Override
+    public ResponseJson<HeHeUserVo> mobileLogin(HeHeUserDto heHeUserDto) {
+        String redisSmsCode = (String) redisService.get("heCode" + heHeUserDto.getMobile());
+        if (null != redisSmsCode && !"null".equals(redisSmsCode)) {
+            if (redisSmsCode.equals(heHeUserDto.getVerificationCode())) {
+                HeHeUserVo heHeUser = heHeMapper.findHeHeUserByMobile(heHeUserDto.getMobile());
+                if (heHeUser != null) {
+                    if (StringUtils.isBlank(heHeUser.getOpenId())) {
+                        heHeUser.setOpenId(heHeUserDto.getOpenId());
+                        heHeUser.setHeadImgUrl(heHeUserDto.getHeadImgUrl());
+                        heHeUser.setNickName(heHeUserDto.getNickName());
+                        heHeMapper.updateHeHeUser(heHeUser);
+                    }
+                } else {
+                    heHeMapper.insertHeHeUser(heHeUserDto);
+                    heHeUser = heHeMapper.findHeHeUserByMobile(heHeUserDto.getMobile());
+                }
+                return ResponseJson.success(heHeUser);
+            } else {
+                return ResponseJson.error("验证码错误", null);
+            }
+        }
+        return ResponseJson.error("验证码已过期", null);
+    }
+
+    @Override
+    public ResponseJson<String> sendVerificationCode(String mobile) {
+        String randomCode = CodeUtil.generateCodeInt(6);
+        boolean smsFlag = AliyunSmsUtil.sendSms(mobile, 7, "{code:" + randomCode + "}");
+        if (!smsFlag) {
+            // 短信发送失败重试一次
+            AliyunSmsUtil.sendSms(mobile, 7, "{code:" + randomCode + "}");
+        }
+        log.info("呵呵商城注册验证码:" + randomCode);
+        redisService.set("heCode:" + mobile, randomCode, 300L);
+        return ResponseJson.success("发送成功");
+    }
+}

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

@@ -112,7 +112,7 @@ public class LoginServiceImpl implements LoginService {
             return ResponseJson.error("没有获取到微信授权code", null);
             return ResponseJson.error("没有获取到微信授权code", null);
         }
         }
         // 小程序微信授权获取登录信息
         // 小程序微信授权获取登录信息
-        ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(code, headers);
+        ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(code, headers, 1);
         if (appletsInfo.getCode() == -1) {
         if (appletsInfo.getCode() == -1) {
             return ResponseJson.error(appletsInfo.getMsg(), null);
             return ResponseJson.error(appletsInfo.getMsg(), null);
         }
         }

+ 2 - 2
src/main/java/com/caimei365/user/utils/AliyunSmsUtil.java

@@ -55,9 +55,9 @@ public class AliyunSmsUtil {
             // 模版内容: 欢迎成为采美机构用户,您的登录账号为:${name},初始密码为:cm${content},您可使用该账号密码登录采美365网和“采美采购商城”小程序。
             // 模版内容: 欢迎成为采美机构用户,您的登录账号为:${name},初始密码为:cm${content},您可使用该账号密码登录采美365网和“采美采购商城”小程序。
             templateCode = "SMS_215122672";
             templateCode = "SMS_215122672";
         } else if (type == 7) {
         } else if (type == 7) {
-            // 模版内容: 您的短信验证码为:${code}。
+            // 模版内容: 您"呵呵商城"小程序的验证码为:${code},验证码 5 分钟内有效
             templateCode = "SMS_215344905";
             templateCode = "SMS_215344905";
-            signName = "呵呵商城";
+            signName = "采美365";
         } else if (type == 8) {
         } else if (type == 8) {
             // 模版内容: 欢迎注册采美365网,您的短信验证码为:${code},该验证码 5 分钟内有效,请勿泄漏于他人。
             // 模版内容: 欢迎注册采美365网,您的短信验证码为:${code},该验证码 5 分钟内有效,请勿泄漏于他人。
             templateCode = "SMS_205435882";
             templateCode = "SMS_205435882";

+ 58 - 0
src/main/resources/mapper/HeHeMapper.xml

@@ -0,0 +1,58 @@
+<?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.HeHeMapper">
+
+    <select id="findHeHeUserByOpenId" resultType="com.caimei365.user.model.vo.HeHeUserVo">
+        SELECT
+          id AS userId,
+          NAME,
+          mobile,
+          userIdentity,
+          nickName,
+          openId
+        FROM
+          cm_hehe_user
+        WHERE
+          openId = #{openId}
+    </select>
+
+    <select id="findHeHeUserByMobile" resultType="com.caimei365.user.model.vo.HeHeUserVo">
+        SELECT
+          id AS userId,
+          NAME,
+          mobile,
+          userIdentity,
+          nickName,
+          openId
+        FROM
+          cm_hehe_user
+        WHERE
+          mobile = #{mobile}
+    </select>
+
+    <update id="updateHeHeUser">
+        UPDATE
+          `cm_hehe_user`
+        SET
+          `nickName` = #{nickName},
+          `headImgUrl` = #{headImgUrl},
+          `openId` = #{openId}
+        WHERE
+          `id` = #{id}
+    </update>
+
+    <insert id="insertHeHeUser" parameterType="com.caimei365.user.model.dto.HeHeUserDto">
+        INSERT INTO `cm_hehe_user` (
+          `mobile`, `userIdentity`, `nickName`,
+          `headImgUrl`, `openId`, `addTime`
+        )
+        VALUES
+          (
+            #{mobile}, 1, #{nickName}, #{headImgUrl},
+            #{openId}, NOW()
+          )
+    </insert>
+
+</mapper>