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