package com.ruoyi.account.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.diagnosis.DiagnosisUtils; import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.response.AlipaySystemOauthTokenResponse; import com.alipay.api.response.AlipayUserInfoShareResponse; import com.alipay.api.response.AlipayUserUserinfoShareResponse; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.ali.Constant.AliConstant; import com.ruoyi.account.ali.model.AliProperties; import com.ruoyi.account.ali.pojo.AppletUserLogin; import com.ruoyi.account.ali.tools.AliAppletTools; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.service.TAppUserService; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUserApplet; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** *

* 支付宝小程序登录 前端控制器 *

* * @author xiaochen * @since 2024-08-06 */ @Slf4j @RestController @RequestMapping("/aliLogin") public class AliLoginController { @Autowired private AliProperties aliProperties; @Autowired private TAppUserService appUserService; @ApiOperation(value = "通过code获得openid",tags = {"支付宝小程序登录"}) @PostMapping("/openIdByJsCode") public AjaxResult> openIdByJsCode(@RequestBody AppletUserLogin appletUserLogin){ log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", appletUserLogin.getCode()); // 登录 AlipaySystemOauthTokenResponse response = new AliAppletTools(aliProperties).login(appletUserLogin.getCode()); if (response.isSuccess()) { String aliUnionId = firstNotBlank(readStringProperty(response, "getUnionId"), readStringProperty(response, "getUnion_id"), getResponseBodyValue(response, "union_id"), getResponseBodyValue(response, "unionId")); String aliUserId = firstNotBlank(response.getUserId(), getResponseBodyValue(response, "user_id"), getResponseBodyValue(response, "userId")); log.info("支付宝授权换取用户标识成功,openId:{},userId:{},unionId:{}", response.getOpenId(), aliUserId, aliUnionId); AlipayUserInfoShareResponse userInfo = new AliAppletTools(aliProperties).getUserInfo(response.getAccessToken()); log.info("支付宝用户信息接口返回:{}", JSON.toJSONString(userInfo)); aliUserId = firstNotBlank(aliUserId, userInfo == null ? null : userInfo.getUserId(), getResponseBodyValue(userInfo, "user_id"), getResponseBodyValue(userInfo, "userId")); aliUnionId = firstNotBlank(aliUnionId, readStringProperty(userInfo, "getUnionId"), readStringProperty(userInfo, "getUnion_id"), getResponseBodyValue(userInfo, "union_id"), getResponseBodyValue(userInfo, "unionId")); if(StringUtils.isEmpty(appletUserLogin.getToken())){ return AjaxResult.success("已拒绝授权"); } // 获取用户手机号 String phoneNumber = new AliAppletTools(aliProperties).getPhoneNumber(appletUserLogin.getToken()); log.info("获取支付宝用户信息:{}", phoneNumber); // 用户信息封装 return AjaxResult.success(appUserService.aliLogin(response,phoneNumber,appletUserLogin.getInviteUserId(), aliUserId, aliUnionId)); } else { String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); log.warn("诊断结果:{}",diagnosisUrl); throw new ServiceException("支付宝小程序登录失败"); } } private String getResponseBodyValue(Object response, String key) { String body = readStringProperty(response, "getBody"); if (StringUtils.isEmpty(body)) { return null; } try { com.alibaba.fastjson.JSONObject bodyJson = JSON.parseObject(body); String value = bodyJson.getString(key); if (StringUtils.isNotEmpty(value)) { return value; } for (String nestedKey : bodyJson.keySet()) { com.alibaba.fastjson.JSONObject nested = bodyJson.getJSONObject(nestedKey); if (nested != null) { value = nested.getString(key); if (StringUtils.isNotEmpty(value)) { return value; } } } return null; } catch (Exception e) { return null; } } private String readStringProperty(Object target, String methodName) { if (target == null) { return null; } try { Method method = target.getClass().getMethod(methodName); Object value = method.invoke(target); return value == null ? null : String.valueOf(value); } catch (Exception e) { return null; } } private String firstNotBlank(String... values) { if (values == null) { return null; } for (String value : values) { if (StringUtils.isNotEmpty(value)) { return value; } } return null; } }