فهرست منبع

第二版,频安宝

suntianwu 3 سال پیش
والد
کامیت
786da71012

+ 13 - 0
src/main/java/com/care/client/controller/PassportController.java

@@ -50,6 +50,19 @@ public class PassportController {
         return passportService.login(params);
     }
 
+    @ApiOperation(value = "小程序登录", notes = "微信一键登录解密手机号")
+    @PostMapping("decodePhoneNumber")
+    public Result<Object> decodePhoneNumber(@RequestParam(value = "code", required = true) String code,
+                                            @RequestParam(value = "encryptedData", required = true) String encryptedData,
+                                            @RequestParam(value = "iv", required = true) String iv) {
+        if (passportService.decodePhoneNumber(code,encryptedData,iv)){
+            return Result.success();
+        } else {
+            return Result.error("失败");
+        }
+
+    }
+
     @ApiOperation(value = "新用户注册", notes = "新用户注册")
     @GetMapping("registerPhone")
     @ApiImplicitParams(value = {

+ 30 - 0
src/main/java/com/care/client/service/PassportService.java

@@ -9,8 +9,10 @@ import com.care.common.exception.BDException;
 import com.care.common.service.CareMemberInfoService;
 import com.care.common.util.CheckUtils;
 import com.care.common.util.Result;
+import com.care.common.util.WxUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -71,4 +73,32 @@ public class PassportService extends AbstractPassportService {
          careMemberInfo.setPassword(DigestUtils.md5Hex(password));
          return careMemberInfoService.updateById(careMemberInfo);
      }
+
+     public Boolean decodePhoneNumber(String code, String encryptedData,String iv) {
+         MemberInitParams params = (MemberInitParams) redisUtil.hget(RedisKeyConstant.PINANBAO_LOGIN_INFO, code);
+         String sessionKey = params.getSessionKey();
+         String openId = params.getOpenid();
+
+         String phone = WxUtil.getPhoneNumber(encryptedData,sessionKey,iv);
+        if (StringUtils.isEmpty(phone)) {
+            return false;
+        }
+         CareMemberInfo member = careMemberInfoService.detailByPhone(phone);
+         if (member == null) { //注册新用户
+             CareMemberInfo careMemberInfo = new CareMemberInfo();
+             careMemberInfo.setPhone(phone);
+             careMemberInfo.setOpenId(openId);
+
+             boolean flag = careMemberInfoService.save(careMemberInfo);
+             if (flag) {
+                 cache(params);
+                 return true;
+             } else {
+                 return false;
+             }
+         } else { //已经注册了
+             cache(params);
+             return true;
+         }
+     }
 }

+ 8 - 4
src/main/java/com/care/client/service/WxPassportService.java

@@ -38,14 +38,18 @@ public class WxPassportService extends AbstractPassportService {
         log.warn("-----jsonObject:[{}]", jsonObject);
 
         String openid = jsonObject.getStr("openid");
-        String sessionKey = jsonObject.getStr("session_key"); // TODO 暂时用不到
+        String sessionKey = jsonObject.getStr("session_key");
         log.warn("-----openid:[{}], session_key:[{}]", openid, sessionKey);
 
-        // TODO 测试阶段先注释掉
-        params.setOpenid(openid);
-        return cache(params);
+        MemberInitParams memberInitParams = new MemberInitParams();
+        params.setLoginType("wx");
+        memberInitParams.setOpenid(openid);
+        memberInitParams.setSessionKey(sessionKey);
+        redisUtil.hset(RedisKeyConstant.PINANBAO_LOGIN_INFO, params.getCode(), memberInitParams, RedisKeyConstant.WX_ACCESS_TOKEN_TIME);
+        return Result.success();
     }
 
+
     private JSONObject httpGet(String url) {
         HttpResponse response = HttpRequest.get(url).execute();
         String json = response.charset("utf-8").body();

+ 3 - 1
src/main/java/com/care/client/vo/MemberInitParams.java

@@ -15,6 +15,8 @@ public class MemberInitParams implements Serializable {
     private String code;
     @ApiModelProperty(name = "openid", value = "平台标识")
     private String openid;
+    @ApiModelProperty(name = "sessionKey", value = "session_key")
+    private String sessionKey;
 
     @ApiModelProperty(name = "nickname", value = "昵称")
     private String nickname;
@@ -35,6 +37,6 @@ public class MemberInitParams implements Serializable {
     @ApiModelProperty(name = "vcode", value = "验证码")
     private String vcode;
 
-    @ApiModelProperty(name = "loginType", value = "登录方式")
+    @ApiModelProperty(name = "loginType", value = "登录方式,微信:wx,密码:pwd")
     private String loginType;
 }

+ 55 - 0
src/main/java/com/care/common/util/WxUtil.java

@@ -0,0 +1,55 @@
+package com.care.common.util;
+
+import java.util.Arrays;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import com.alibaba.fastjson.JSONObject;
+
+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.Base64;
+
+public class WxUtil {
+
+    public static String getPhoneNumber(String encryptedData, String session_key, String iv) {
+        // 被加密的数据
+        byte[] dataByte = Base64.getDecoder().decode(encryptedData);
+        // 加密秘钥
+        byte[] keyByte = Base64.getDecoder().decode(session_key);
+        // 偏移量
+        byte[] ivByte = Base64.getDecoder().decode(iv);
+        try {
+            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+            int base = 16;
+            if (keyByte.length % base != 0) {
+                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
+                byte[] temp = new byte[groups * base];
+                Arrays.fill(temp, (byte) 0);
+                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
+                keyByte = temp;
+            }
+            // 初始化
+            Security.addProvider(new BouncyCastleProvider());
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            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) {
+                String result = new String(resultByte, "UTF-8");
+                System.out.println(result);
+                //{"phoneNumber":"18800000000","watermark":{"appid":"wx2ba363fc4454f27c","timestamp":1586333901},"purePhoneNumber":"18800000000","countryCode":"86"}
+                return JSONObject.parseObject(result).getString("phoneNumber");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}