增加微信小程序登录或注册接口

This commit is contained in:
2025-08-16 01:54:50 +08:00
parent 201a08216b
commit fd1cd8d9b0
3 changed files with 74 additions and 1 deletions

View File

@ -49,8 +49,16 @@ public class AuthController {
return Result.ok(userService.miniProgramLogin(code));
}
@ApiOperation(value = "微信小程序登录或注册", notes = "微信小程序登录")
@PostMapping("/mini-program/wechatLogin")
public Result<LoginResponse> wechatLogin(
@RequestBody WxMiniProgramRegRequest wxMiniProgramRegRequest) {
LoginResponse result = userService.wxMiniProgramLoginOrReg(wxMiniProgramRegRequest);
return Result.ok(result);
}
@ApiOperation(value = "支付宝小程序登录", notes = "支付宝小程序登录")
@ApiOperation(value = "支付宝小程序登录或注册", notes = "支付宝小程序登录")
@PostMapping("/mini-program/alipayLogin")
public Result<LoginResponse> alipayLogin(
@RequestBody AlipayMiniProgramRegRequest alipayMiniProgramRegRequest) {

View File

@ -39,6 +39,13 @@ public interface IUserService {
*/
LoginResponse miniProgramLogin(String code);
/**
*
* @param wxMiniProgramRegRequest
* @return
*/
LoginResponse wxMiniProgramLoginOrReg(WxMiniProgramRegRequest wxMiniProgramRegRequest);
/**

View File

@ -132,6 +132,64 @@ public class UserServiceImpl implements IUserService {
return getLoginResponse(openid,MiniProgramTypeEnum.WECHAT.getType());
}
@Override
public LoginResponse wxMiniProgramLoginOrReg(WxMiniProgramRegRequest wxMiniProgramRegRequest) {
try{
// 1. 通过code获取session_key和openid
WechatMiniProgramResponse sessionInfo = weichatInteg.getSessionInfoByCode(wxMiniProgramRegRequest.getCode());
if (sessionInfo == null || sessionInfo.getOpenid() == null) {
throw new BizException("获取微信用户信息失败");
}
String openid = sessionInfo.getOpenid();
String sessionKey = sessionInfo.getSession_key();
//先根据openid查询用户如果有则直接返回登录信息
LambdaQueryWrapper<BaseUserPO> queryByOpenIdWrapper = new LambdaQueryWrapper<>();
queryByOpenIdWrapper.eq(BaseUserPO::getWechatOpenid, openid).last(" limit 1");
BaseUserPO baseUserPO = baseUserRepo.getOne(queryByOpenIdWrapper);
if(Objects.nonNull(baseUserPO)){
return getLoginResponse(baseUserPO,MiniProgramTypeEnum.WECHAT);
}
//没有则获取手机号,根据手机号查
// 2. 解密手机号数据
WechatDecryptedPhoneInfo phoneInfo = null;
if (StringUtils.isNotBlank(wxMiniProgramRegRequest.getPhoneEncryptedData()) && StringUtils.isNotBlank(wxMiniProgramRegRequest.getPhoneIv())
&& StringUtils.isNotBlank(sessionKey)) {
phoneInfo = weichatInteg.decryptPhoneNumber(sessionKey, wxMiniProgramRegRequest.getPhoneEncryptedData(), wxMiniProgramRegRequest.getPhoneIv());
log.info("解密手机号信息:{}", phoneInfo);
}
String phoneNumber = Optional.ofNullable(phoneInfo).map(WechatDecryptedPhoneInfo::getPurePhoneNumber).orElse(null);
if(StringUtils.isBlank(phoneNumber)){
throw new BizException("微信小程序注册失败,无法获取用户真实手机号");
}
LambdaQueryWrapper<BaseUserPO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BaseUserPO::getPhoneNumber, phoneNumber);
baseUserPO = baseUserRepo.getOne(queryWrapper);
if(Objects.isNull(baseUserPO)){
baseUserPO = new BaseUserPO();
baseUserPO.setWechatOpenid(openid);
baseUserPO.setUserName(phoneNumber);
baseUserPO.setPhoneNumber(phoneNumber);
baseUserPO.setPassword(MD5Utils.md5Hex(phoneNumber, StandardCharsets.UTF_8.name()));
baseUserPO.setNickName(phoneNumber);
baseUserPO.setRoleId(1);
baseUserRepo.saveOrUpdate(baseUserPO);
}else {
if(StringUtils.isBlank(baseUserPO.getWechatOpenid())){
baseUserPO.setWechatOpenid(openid);
baseUserRepo.saveOrUpdate(baseUserPO);
}
}
return getLoginResponse(baseUserPO,MiniProgramTypeEnum.WECHAT);
}catch (Exception e){
log.error("微信小程序注册失败", e);
throw new BizException("微信小程序注册失败");
}
}
@Override
public LoginResponse alipayMiniProgramLoginOrReg(AlipayMiniProgramRegRequest alipayMiniProgramRegRequest) {
try {