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 */ 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); 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 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) {