This commit is contained in:
moxiangrong
2024-03-01 19:41:08 +08:00
parent 073b6d8663
commit ec0d30af37
9 changed files with 59 additions and 26 deletions

View File

@ -19,7 +19,7 @@ public interface ErrorCodeConstants {
ErrorCode ORDER_PAY_FINISH = new ErrorCode(1008007010, "该订单已支付"); ErrorCode ORDER_PAY_FINISH = new ErrorCode(1008007010, "该订单已支付");
ErrorCode USER_NOT_BINDING_WX_APPLET = new ErrorCode(1008007011, "该用户未绑定微信小程序openid为空"); ErrorCode USER_NOT_BINDING_WX_APPLET = new ErrorCode(1008007011, "该用户未绑定微信小程序openid为空");
ErrorCode USER_NOT_BINDING_WX = new ErrorCode(1008007011, "该用户未绑定微信手机号无法调起支付"); ErrorCode USER_NOT_BINDING_WX = new ErrorCode(1008007011, "该用户未支持支付,请使用小程序或其他浏览器登录");
ErrorCode PAY_YUE_NOT = new ErrorCode(1008007011, "余额不足"); ErrorCode PAY_YUE_NOT = new ErrorCode(1008007011, "余额不足");
ErrorCode ORDER_STATUS_ERROR = new ErrorCode(1008007012, "订单状态错误"); ErrorCode ORDER_STATUS_ERROR = new ErrorCode(1008007012, "订单状态错误");
ErrorCode COMMENT_PRODUCT_NOT_EXISTS = new ErrorCode(1008007013, "评价产品不存在"); ErrorCode COMMENT_PRODUCT_NOT_EXISTS = new ErrorCode(1008007013, "评价产品不存在");

View File

@ -61,4 +61,7 @@ public class AppAuthSmsLoginReqVO {
return socialType == null || StrUtil.isNotEmpty(socialState); return socialType == null || StrUtil.isNotEmpty(socialState);
} }
@Schema(description = "登录 code,小程序通过 wx.login 方法获得", requiredMode = Schema.RequiredMode.REQUIRED, example = "word")
private String loginCode;
} }

View File

@ -106,7 +106,8 @@ public class MemberAuthServiceImpl implements MemberAuthService {
} }
// 获得获得注册用户 // 获得获得注册用户
MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, reqVO.getFrom(), reqVO.getInvitationCode()); MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, reqVO.getFrom(),
reqVO.getInvitationCode(), reqVO.getLoginCode());
Assert.notNull(user, "获取用户失败,结果为空"); Assert.notNull(user, "获取用户失败,结果为空");
// 如果 socialType 非空,说明需要绑定社交用户 // 如果 socialType 非空,说明需要绑定社交用户
@ -166,7 +167,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
if (memberUserDO == null) { if (memberUserDO == null) {
// 获得获得注册用户 // 获得获得注册用户
memberUserDO = userService.createUserIfAbsent(phoneNumberInfo.getPhoneNumber(), getClientIP(), memberUserDO = userService.createUserIfAbsent(phoneNumberInfo.getPhoneNumber(), getClientIP(),
LoginTypeEnum.WXAPP.getValue(), reqVO.getInvitationCode()); LoginTypeEnum.WXAPP.getValue(), reqVO.getInvitationCode(), null);
memberUserDO.setNickname("用户_" + memberUserDO.getId()); memberUserDO.setNickname("用户_" + memberUserDO.getId());
} }
memberUserDO.setRoutineOpenId(session.getOpenid()); memberUserDO.setRoutineOpenId(session.getOpenid());

View File

@ -43,9 +43,10 @@ public interface MemberUserService extends IService<MemberUserDO> {
* @param mobile 手机号 * @param mobile 手机号
* @param registerIp 注册 IP * @param registerIp 注册 IP
* @param invitationCode 邀请码 * @param invitationCode 邀请码
* @param loginCode 登录 code
* @return 用户对象 * @return 用户对象
*/ */
MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, String from, String invitationCode); MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, String from, String invitationCode, String loginCode);
/** /**
* 更新用户的最后登陆信息 * 更新用户的最后登陆信息

View File

@ -1,5 +1,7 @@
package co.yixiang.yshop.module.member.service.user; package co.yixiang.yshop.module.member.service.user;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
@ -29,6 +31,8 @@ import co.yixiang.yshop.module.system.service.dict.DictDataService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
@ -46,8 +50,7 @@ import java.util.Objects;
import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception; import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception;
import static co.yixiang.yshop.framework.common.util.servlet.ServletUtils.getClientIP; import static co.yixiang.yshop.framework.common.util.servlet.ServletUtils.getClientIP;
import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.NOT_ENOUGH_INTEGRAL; import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.*;
import static co.yixiang.yshop.module.member.enums.ErrorCodeConstants.USER_NOT_EXISTS;
/** /**
* 会员 User Service 实现类 * 会员 User Service 实现类
@ -82,6 +85,8 @@ public class MemberUserServiceImpl extends ServiceImpl<MemberUserMapper, MemberU
private UserInviteLogService userInviteLogService; private UserInviteLogService userInviteLogService;
@Resource @Resource
private UserBillService userBillService; private UserBillService userBillService;
@Resource
private WxMaService wxMaService;
@Override @Override
@ -95,19 +100,42 @@ public class MemberUserServiceImpl extends ServiceImpl<MemberUserMapper, MemberU
} }
@Override @Override
public MemberUserDO createUserIfAbsent(String mobile, String registerIp, String from, String invitationCode) { public MemberUserDO createUserIfAbsent(String mobile, String registerIp, String from, String invitationCode, String loginCode) {
// 用户已经存在 // 用户已经存在
MemberUserDO user = memberUserMapper.selectByMobile(mobile); MemberUserDO user = memberUserMapper.selectByMobile(mobile);
if (!StringUtils.isNotBlank(user.getRoutineOpenId()) && StringUtils.isNotBlank(loginCode)) {
this.updateOpenId(user.getId(), loginCode);
}
if (user != null) { if (user != null) {
return user; return user;
} }
// 用户不存在,则进行创建 // 用户不存在,则进行创建
user = this.createUser(mobile, registerIp, from); user = this.createUser(mobile, registerIp, from);
if (StringUtils.isNotBlank(loginCode)) {
this.updateOpenId(user.getId(), loginCode);
}
// 处理其他逻辑 // 处理其他逻辑
handlerAfterRegister(user, invitationCode); handlerAfterRegister(user, invitationCode);
return user; return user;
} }
/**
* 更新小程序openId
*
* @param id 用户id
* @param loginCode 登录code
*/
private void updateOpenId(Long id, String loginCode) {
WxMaJscode2SessionResult session;
try {
session = wxMaService.getUserService().getSessionInfo(loginCode);
} catch (WxErrorException e) {
log.error(e.getMessage());
throw exception(MINI_AUTH_LOGIN_BAD);
}
this.updateById(new MemberUserDO().setId(id).setRoutineOpenId(session.getOpenid()));
}
/** /**
* 处理注册完成之后其他墨迹 * 处理注册完成之后其他墨迹
* *

View File

@ -96,7 +96,7 @@ public class AppPayController {
} }
if (PayTypeEnum.WEIXIN.getType().equals(param.getPayType())) { if (PayTypeEnum.WEIXIN.getType().equals(param.getPayType())) {
//小程序支付需要openid //小程序支付需要openid
if (Objects.isNull(user.getRoutineOpenId())) throw exception(USER_NOT_BINDING_WX); if (Objects.isNull(user.getRoutineOpenId())) throw exception(USER_NOT_BINDING_WX);
} }
payParam.setType(param.getPayType()); payParam.setType(param.getPayType());
payParam.setMerchantDetailsDO(merchantDetailsDO); payParam.setMerchantDetailsDO(merchantDetailsDO);

View File

@ -168,19 +168,19 @@ wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-sta
--- #微信支付配置 --- #微信支付配置
weixin: weixin:
#小程序appid #小程序appid,在后台支付配置中配在merchant_details表中对应应用id
appid: appid:
#APP端的appid #APP端的appid,在后台支付配置中配在merchant_details表中对应应用id
app_appid: app_appid:
#小程序秘钥 #小程序秘钥,在后台支付配置中配在merchant_details表中对应密钥
secret: secret:
#商户号 #商户号,在后台支付配置中配在merchant_details表中对应微信商户id
mchid: mchid:
#证书路径 #证书路径
certurl: certurl: /yshop-server/apiclient_cert.p12
#订单取消退款回调地址 #订单取消退款回调地址
order_refund_notifyurl: order_refund_notifyurl:
#APP回调地址 #APP回调地址,在后台支付配置中配在merchant_details表中对应异步回调地址
app_notifyurl: app_notifyurl:
#商户秘钥 #商户秘钥
key: key:

View File

@ -180,19 +180,19 @@ wx:
--- #微信支付配置 --- #微信支付配置
weixin: weixin:
#小程序appid #小程序appid,在后台支付配置中配在merchant_details表中对应应用id
appid: appid:
#APP端的appid #APP端的appid,在后台支付配置中配在merchant_details表中对应应用id
app_appid: app_appid:
#小程序秘钥 #小程序秘钥,在后台支付配置中配在merchant_details表中对应密钥
secret: secret:
#商户号 #商户号,在后台支付配置中配在merchant_details表中对应微信商户id
mchid: mchid:
#证书路径 #证书路径
certurl: certurl: /yshop-server/apiclient_cert.p12
#订单取消退款回调地址 #订单取消退款回调地址
order_refund_notifyurl: order_refund_notifyurl:
#APP回调地址 #APP回调地址,在后台支付配置中配在merchant_details表中对应异步回调地址
app_notifyurl: app_notifyurl:
#商户秘钥 #商户秘钥
key: key:

View File

@ -179,24 +179,24 @@ wx:
--- #微信支付配置 --- #微信支付配置
weixin: weixin:
#appid #小程序appid,在后台支付配置中配在merchant_details表中对应应用id
appid: appid:
#APP端的appid #APP端的appid,在后台支付配置中配在merchant_details表中对应应用id
app_appid: app_appid:
#小程序秘钥 #小程序秘钥,在后台支付配置中配在merchant_details表中对应密钥
secret: secret:
#商户号 #商户号,在后台支付配置中配在merchant_details表中对应微信商户id
mchid: mchid:
#证书路径 #证书路径
certurl: /yshop-server/apiclient_cert.p12 certurl: /yshop-server/apiclient_cert.p12
#订单取消退款回调地址 #订单取消退款回调地址
order_refund_notifyurl: order_refund_notifyurl:
#APP回调地址 #APP回调地址,在后台支付配置中配在merchant_details表中对应异步回调地址
app_notifyurl: app_notifyurl:
#商户秘钥 #商户秘钥
key: key:
#h5支付之后跳转地址 #h5支付之后跳转地址
redirect_url: redirect_url: http://localhost:8080/
--- #################### yshop相关配置 #################### --- #################### yshop相关配置 ####################
# yshop配置项设置当前项目所有自定义的配置 # yshop配置项设置当前项目所有自定义的配置