From eaf2c4e361a4a4045e057359becc75ed9c37175c Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期四, 22 八月 2024 14:04:54 +0800
Subject: [PATCH] 支付宝登录

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java    |    8 ++-
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java |   41 ++++++++++++++++----
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/ali/tools/AliAppletTools.java         |   52 +++++++++++++++++++++++++-
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java          |    5 +-
 4 files changed, 91 insertions(+), 15 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 a31fb9e..0db2213 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,18 +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.AlipayUserInfoShareRequest;
-import com.alipay.api.request.AlipayUserUserinfoShareRequest;
 import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 import com.alipay.api.response.AlipayUserInfoShareResponse;
-import com.alipay.api.response.AlipayUserUserinfoShareResponse;
 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
@@ -76,6 +82,48 @@
     }
 
     /**
+     * 获取用户手机号
+     * @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;
+        }
+        return plainData;
+    }
+
+    /**
      * 初始化支付宝配置
      * @return
      */
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java
index a437bb4..4c21021 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AliLoginController.java
@@ -56,10 +56,12 @@
         AlipaySystemOauthTokenResponse response = new AliAppletTools(aliProperties).login(appletUserLogin.getCode());
         if (response.isSuccess()) {
             // 获取用户信息
-            AlipayUserInfoShareResponse userInfo = new AliAppletTools(aliProperties).getUserInfo(appletUserLogin.getToken());
-            log.info("获取支付宝用户信息:{}", userInfo);
+//            AlipayUserInfoShareResponse userInfo = new AliAppletTools(aliProperties).getUserInfo(response.getAccessToken());
+            // 获取用户手机号
+            String phoneNumber = new AliAppletTools(aliProperties).getPhoneNumber(appletUserLogin.getToken());
+            log.info("获取支付宝用户信息:{}", phoneNumber);
             // 用户信息封装
-            return AjaxResult.ok(appUserService.aliLogin(response,userInfo));
+            return AjaxResult.ok(appUserService.aliLogin(response,phoneNumber));
         } else {
              String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
              log.warn("诊断结果:{}",diagnosisUrl);
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
index 957d698..9e59184 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
@@ -28,10 +28,11 @@
 
     /**
      * 支付宝小程序登录用户封装
-     * @param userInfo
+     * @param response
      * @return
      */
-    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo);
+//    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo);
+    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response,String phone);
 
     /**
      * 封装用户信息和token
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
index c9fe14f..d3351ef 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
@@ -66,34 +66,59 @@
     }
 
     @Override
-    public Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo) {
+    public Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response,String phone) {
         // 通过手机号查询用户,是否已存在手动导入用户,包含微信用户
         TAppUser appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
-                .eq(TAppUser::getPhone, userInfo.getMobile())
+                .eq(TAppUser::getPhone, phone)
                 .isNull(TAppUser::getAliOpenid)
                 .last("LIMIT 1"));
         if(Objects.isNull(appUser)){
             // 先使用openId和当前手机号进行查询
             appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
                     .eq(TAppUser::getAliOpenid, response.getOpenId())
-                    .eq(TAppUser::getPhone, userInfo.getMobile())
+                    .eq(TAppUser::getPhone, phone)
                     .last("LIMIT 1"));
             if(Objects.isNull(appUser)){
                 appUser = new TAppUser();
-                appUser.setPhone(userInfo.getMobile());
+                appUser.setPhone(phone);
             }
         }
         if(Objects.nonNull(appUser.getStatus())){
             throwInfo(appUser.getStatus());
         }
-        appUser.setAvatar(userInfo.getAvatar());
-        appUser.setCity(userInfo.getCity());
-        appUser.setName(userInfo.getNickName());
-        appUser.setProvince(userInfo.getProvince());
         appUser.setAliOpenid(response.getOpenId());
         this.saveOrUpdate(appUser);
         return this.getUserInfo(appUser);
     }
+//    @Override
+//    public Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo) {
+//        // 通过手机号查询用户,是否已存在手动导入用户,包含微信用户
+//        TAppUser appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
+//                .eq(TAppUser::getPhone, userInfo.getMobile())
+//                .isNull(TAppUser::getAliOpenid)
+//                .last("LIMIT 1"));
+//        if(Objects.isNull(appUser)){
+//            // 先使用openId和当前手机号进行查询
+//            appUser = this.getOne(Wrappers.lambdaQuery(TAppUser.class)
+//                    .eq(TAppUser::getAliOpenid, response.getOpenId())
+//                    .eq(TAppUser::getPhone, userInfo.getMobile())
+//                    .last("LIMIT 1"));
+//            if(Objects.isNull(appUser)){
+//                appUser = new TAppUser();
+//                appUser.setPhone(userInfo.getMobile());
+//            }
+//        }
+//        if(Objects.nonNull(appUser.getStatus())){
+//            throwInfo(appUser.getStatus());
+//        }
+//        appUser.setAvatar(userInfo.getAvatar());
+//        appUser.setCity(userInfo.getCity());
+//        appUser.setName(userInfo.getNickName());
+//        appUser.setProvince(userInfo.getProvince());
+//        appUser.setAliOpenid(response.getOpenId());
+//        this.saveOrUpdate(appUser);
+//        return this.getUserInfo(appUser);
+//    }
 
     @Override
     public Map<String, Object> getUserInfo(TAppUser appUser) {

--
Gitblit v1.7.1