支付宝注册时增加获取alipay的openid

This commit is contained in:
2025-08-31 21:48:53 +08:00
parent f80c13a93f
commit ce3a300f4b
6 changed files with 23 additions and 59 deletions

View File

@ -237,7 +237,7 @@
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.0.ALL</version>
<version>4.40.427.ALL</version>
</dependency>
</dependencies>

View File

@ -14,6 +14,9 @@ public class AlipayMiniProgramRegRequest {
@ApiModelProperty(value = "签名")
private String sign;
@ApiModelProperty(value = "支付宝授权码")
private String authCode;
@ApiModelProperty(value = "推荐人userId")
private Long referralUserId;
}

View File

@ -32,6 +32,9 @@ public class SimpleUserInfoDTO {
@ApiModelProperty("支付宝小程序 userid")
private String alipayUserid;
@ApiModelProperty("支付宝小程序 openid")
private String alipayOpenid;
@ApiModelProperty("是否认证0未认证1已认证")
private Integer authed;

View File

@ -55,6 +55,9 @@ public class BaseUserPO implements Serializable {
@ApiModelProperty("支付宝小程序 userid")
private String alipayUserid;
@ApiModelProperty("支付宝小程序 openid")
private String alipayOpenid;
@ApiModelProperty("是否认证0未认证1已认证")
private Integer authed;

View File

@ -234,11 +234,14 @@ public class UserServiceImpl implements IUserService {
public LoginResponse alipayMiniProgramLoginOrReg(AlipayMiniProgramRegRequest alipayMiniProgramRegRequest) {
try {
// 2. 获取手机号
// 1. 获取手机号
String phoneNumber = alipayInteg.getPhoneNumberFromEncryptedData(alipayMiniProgramRegRequest.getEncryptedData(), alipayMiniProgramRegRequest.getSign());
if (StringUtils.isBlank(phoneNumber)) {
throw new BizException("支付宝小程序登录失败,无法获取用户真实手机号");
}
//2.获取openId
String openId = alipayInteg.getUserInfoByAuthCode(alipayMiniProgramRegRequest.getAuthCode());
// 3. 查询用户是否存在
LambdaQueryWrapper<BaseUserPO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BaseUserPO::getPhoneNumber, phoneNumber);
@ -252,6 +255,7 @@ public class UserServiceImpl implements IUserService {
baseUserPO.setPhoneNumber(phoneNumber);
baseUserPO.setPassword(MD5Utils.md5Hex(phoneNumber, StandardCharsets.UTF_8.name()));
baseUserPO.setRoleId(1);
baseUserPO.setAlipayOpenid(openId);
baseUserRepo.saveOrUpdate(baseUserPO);
if(Objects.nonNull(alipayMiniProgramRegRequest.getReferralUserId())){
@ -270,6 +274,11 @@ public class UserServiceImpl implements IUserService {
baseUserReferralRepo.save(baseUserReferralPO);
}
}
}else {
if(StringUtils.isBlank(baseUserPO.getAlipayOpenid())){
baseUserPO.setAlipayOpenid(openId);
baseUserRepo.saveOrUpdate(baseUserPO);
}
}
// 5. 返回登录信息
return getLoginResponse(baseUserPO,MiniProgramTypeEnum.ALIPAY);

View File

@ -7,17 +7,12 @@ import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipayEncrypt;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.request.AlipayUserInfoShareRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.sczx.user.exception.BizException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
public class AlipayInteg {
@ -105,11 +100,11 @@ public class AlipayInteg {
}
/**
* 通过授权码获取用户信息
* 通过授权码获取用户OPENID
* @param authCode 授权码
* @return 用户信息
*/
public Map<String, Object> getUserInfoByAuthCode(String authCode) {
public String getUserInfoByAuthCode(String authCode) {
try {
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl, appId, privateKey, format, charset, publicKey, signType);
@ -125,60 +120,11 @@ public class AlipayInteg {
log.error("获取支付宝access_token失败: {}", tokenResponse.getSubMsg());
throw new BizException("获取支付宝用户信息失败");
}
// 2. 通过access_token获取用户信息
AlipayUserInfoShareRequest userInfoRequest = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse userInfoResponse = alipayClient.execute(userInfoRequest, tokenResponse.getAccessToken());
if (!userInfoResponse.isSuccess()) {
log.error("获取支付宝用户信息失败: {}", userInfoResponse.getSubMsg());
throw new BizException("获取支付宝用户信息失败");
}
// 3. 构造返回结果
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("userId", userInfoResponse.getUserId());
userInfo.put("nickName", userInfoResponse.getNickName());
userInfo.put("avatar", userInfoResponse.getAvatar());
userInfo.put("mobile", userInfoResponse.getMobile());
return userInfo;
return tokenResponse.getOpenId();
} catch (Exception e) {
log.error("获取支付宝用户信息异常", e);
throw new BizException("获取支付宝用户信息异常");
}
}
/**
* 通过userId获取用户信息简化版适用于已授权用户
* @param userId 用户ID
* @return 用户信息
*/
public Map<String, Object> getUserInfoByUserId(String userId) {
try {
// 这里可以调用支付宝的用户信息接口获取用户详情
// 为简化实现,直接返回基础信息
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("userId", userId);
return userInfo;
} catch (Exception e) {
log.error("获取支付宝用户信息异常", e);
throw new BizException("获取支付宝用户信息异常");
}
}
/**
* 获取用户手机号(通过支付宝接口)
* @param authCode 授权码
* @return 手机号
*/
public String getPhoneNumber(String authCode) {
try {
Map<String, Object> userInfo = getUserInfoByAuthCode(authCode);
return (String) userInfo.get("mobile");
} catch (Exception e) {
log.error("获取支付宝手机号异常", e);
throw new BizException("获取支付宝手机号异常");
}
}
}