From a2620230c68cf6e8c732311b65aa4912efb350a4 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 22 八月 2024 15:31:26 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java |   63 +++++++++++++++++++++++++++++--
 1 files changed, 59 insertions(+), 4 deletions(-)

diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java
index 8a60f08..0678b48 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java
@@ -1,16 +1,24 @@
 package com.ruoyi.account.ali.tools;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.parser.Feature;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.AlipayConfig;
 import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.internal.util.AlipayEncrypt;
+import com.alipay.api.internal.util.AlipaySignature;
 import com.alipay.api.request.AlipaySystemOauthTokenRequest;
-import com.alipay.api.request.AlipayUserUserinfoShareRequest;
+import com.alipay.api.request.AlipayUserInfoShareRequest;
 import com.alipay.api.response.AlipaySystemOauthTokenResponse;
-import com.alipay.api.response.AlipayUserUserinfoShareResponse;
+import com.alipay.api.response.AlipayUserInfoShareResponse;
 import com.ruoyi.account.ali.Constant.AliConstant;
 import com.ruoyi.account.ali.model.AliProperties;
+import com.ruoyi.common.core.exception.ServiceException;
 import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
 
 /**
  * @author xiaochen
@@ -60,12 +68,12 @@
      * 支付宝小程序授权获取手机号
      * @return
      */
-    public AlipayUserUserinfoShareResponse getUserInfo(String accessToken) {
+    public AlipayUserInfoShareResponse getUserInfo(String accessToken) {
         try {
             // 初始化SDK
             AlipayClient alipayClient = new DefaultAlipayClient(new AliAppletTools(aliProperties).getAlipayConfig(AliConstant.LOGIN_SERVER_URL));
             //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.user.userinfo.share
-            AlipayUserUserinfoShareRequest request = new AlipayUserUserinfoShareRequest();
+            AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
             //授权类接口执行API调用时需要带上accessToken
             return alipayClient.execute(request,accessToken);
         } catch (AlipayApiException e) {
@@ -74,6 +82,53 @@
     }
 
     /**
+     * 获取用户手机号
+     * @param response
+     * @return
+     */
+    public String getPhoneNumber(String response){
+        //1. 获取验签和解密所需要的参数
+        Map<String, String> openapiResult = JSON.parseObject(response,new TypeReference<Map<String, String>>() {}, Feature.OrderedField);
+        String signType = "RSA2";
+        String charset = "UTF-8";
+        String encryptType = "AES";
+        String sign = openapiResult.get("sign");
+        String content = openapiResult.get("response");
+        //判断是否为加密内容
+        boolean isDataEncrypted = !content.startsWith("{");
+        boolean signCheckPass = false;
+        //2. 验签
+        String signContent = content;
+        if (isDataEncrypted) {
+            signContent = "\"" + signContent + "\"";
+        } try {
+            signCheckPass = AlipaySignature.rsaCheck(signContent, sign, aliProperties.getAlipayPublicKey(), charset, signType);
+        } catch (AlipayApiException e) {
+            // 验签异常, 日志
+        } if (!signCheckPass) {
+            //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
+            throw new ServiceException("验签失败");
+        }
+        //3. 解密
+        String plainData = null;
+        if (isDataEncrypted) {
+            try {
+                plainData = AlipayEncrypt.decryptContent(content, encryptType, "XABBSOeWDakvuG9TDez4Qg====", charset);
+            } catch (AlipayApiException e) {
+                //解密异常, 记录日志
+                throw new ServiceException("解密异常");
+            }} else {
+            plainData = content;
+        }
+        log.info("解密后的数据:{}", plainData);
+        String phoneNumber = "";
+        if (plainData.contains("mobile")) {
+            phoneNumber = JSON.parseObject(plainData).getString("mobile");
+        }
+        return phoneNumber;
+    }
+
+    /**
      * 初始化支付宝配置
      * @return
      */

--
Gitblit v1.7.1