Browse Source

代码优化

feature-1.1
wuxicheng 3 years ago
parent
commit
7bc766fcf4
  1. 1
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java
  2. 2
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/UserInfoVo.java
  3. 151
      bnyer-common/bnyer-common-security/src/main/java/com/bnyer/common/security/utils/SecurityUtils.java
  4. 6
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java
  5. 4
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java
  6. 19
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/query/VipOrderDetailsQuery.java
  7. 9
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java
  8. 31
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
  9. 16
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderDetailsVo.java
  10. 2
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java
  11. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/UnifiedOrderBo.java
  12. 42
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java
  13. 88
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java
  14. 103
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java
  15. 5
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java
  16. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java
  17. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java
  18. 12
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java

1
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java

@ -9,6 +9,7 @@ public enum ResponseEnum {
//======================系统异常========================,
SERVER_ERROR(500, "系统繁忙,请稍候重试!"),
NOT_AUTH(500, "未登录!"),
PARAM_ERROR(400, "参数异常!"),
NOT_EXIST(110001, "查询为空"),
PAY_CONFIG_ERROR(110002, "支付配置未启用或未配置!"),

2
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/UserInfoVo.java

@ -81,7 +81,7 @@ public class UserInfoVo implements Serializable {
/**
* 用户类型 抖音->10;快手->20;微信->30;微信艺术家->40
*/
private int userClientType;
private Integer userClientType;
private static final long serialVersionUID = 1L;
}

151
bnyer-common/bnyer-common-security/src/main/java/com/bnyer/common/security/utils/SecurityUtils.java

@ -4,6 +4,7 @@ import com.bnyer.common.core.constant.SecurityConstants;
import com.bnyer.common.core.constant.TokenConstants;
import com.bnyer.common.core.context.SecurityContextHolder;
import com.bnyer.common.core.enums.EnumUserClientType;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.ServletUtils;
import com.bnyer.common.core.utils.StringUtils;
@ -34,82 +35,82 @@ public class SecurityUtils
*/
public static UserInfoVo getUserInfo(){
String platform = ServletUtils.getRequest().getHeader("platform");
if(StringUtils.isNotEmpty(platform)){
EnumUserClientType userClientType = EnumUserClientType.getTypeByCode(platform);
switch (userClientType){
case DU:
UserInfoVo tiktokUserInfo = new UserInfoVo();
LoginTiktokUser loginTikTokUser = getLoginTikTokUser();
tiktokUserInfo.setId(loginTikTokUser.getTiktokUserId());
tiktokUserInfo.setOpenId(loginTikTokUser.getTiktokUserOpenId());
tiktokUserInfo.setUserName(loginTikTokUser.getTiktokUserName());
tiktokUserInfo.setIpaddr(loginTikTokUser.getIpaddr());
tiktokUserInfo.setLastLoginTime(loginTikTokUser.getLoginTime());
tiktokUserInfo.setImg(loginTikTokUser.getTiktokUser().getImg());
tiktokUserInfo.setIsVip(loginTikTokUser.getTiktokUser().getIsVip());
tiktokUserInfo.setCreateTime(loginTikTokUser.getTiktokUser().getCreateTime());
tiktokUserInfo.setUpdateTime(loginTikTokUser.getTiktokUser().getUpdateTime());
tiktokUserInfo.setSort(loginTikTokUser.getTiktokUser().getSort());
tiktokUserInfo.setUserClientType(userClientType.getType());
return tiktokUserInfo;
case WU:
UserInfoVo wechatUserInfo = new UserInfoVo();
LoginWechatUser loginWechatUser = getLoginWechatUser();
wechatUserInfo.setId(loginWechatUser.getWxUserId());
wechatUserInfo.setOpenId(loginWechatUser.getWxUserOpenId());
wechatUserInfo.setUserName(loginWechatUser.getWxUserName());
wechatUserInfo.setIpaddr(loginWechatUser.getIpaddr());
wechatUserInfo.setLastLoginTime(loginWechatUser.getLoginTime());
wechatUserInfo.setImg(loginWechatUser.getWxUser().getImg());
wechatUserInfo.setIsVip(loginWechatUser.getWxUser().getIsVip());
wechatUserInfo.setCreateTime(loginWechatUser.getWxUser().getCreateTime());
wechatUserInfo.setUpdateTime(loginWechatUser.getWxUser().getUpdateTime());
wechatUserInfo.setSort(loginWechatUser.getWxUser().getSort());
wechatUserInfo.setUserClientType(userClientType.getType());
return wechatUserInfo;
case KU:
UserInfoVo fhUserInfo = new UserInfoVo();
LoginFhUser loginFhUser = getLoginFhUser();
fhUserInfo.setId(loginFhUser.getFhUserId());
fhUserInfo.setOpenId(loginFhUser.getFhUserOpenId());
fhUserInfo.setUserName(loginFhUser.getFhUserName());
fhUserInfo.setIpaddr(loginFhUser.getIpaddr());
fhUserInfo.setLastLoginTime(loginFhUser.getLoginTime());
fhUserInfo.setImg(loginFhUser.getFhUser().getImg());
fhUserInfo.setIsVip(loginFhUser.getFhUser().getIsVip());
fhUserInfo.setCreateTime(loginFhUser.getFhUser().getCreateTime());
fhUserInfo.setUpdateTime(loginFhUser.getFhUser().getUpdateTime());
fhUserInfo.setSort(loginFhUser.getFhUser().getSort());
fhUserInfo.setUserClientType(userClientType.getType());
return fhUserInfo;
case WY:
UserInfoVo creatorInfo = new UserInfoVo();
LoginCreator loginCreator = getLoginCreator();
creatorInfo.setId(loginCreator.getCreatorId());
creatorInfo.setPhone(loginCreator.getCreatorPhone());
creatorInfo.setScanCode(loginCreator.getCreator().getScanCode());
creatorInfo.setAmt(loginCreator.getCreator().getAmt());
creatorInfo.setInviteCode(loginCreator.getCreator().getInviteCode());
creatorInfo.setStatus(loginCreator.getCreator().getStatus());
creatorInfo.setUrl(loginCreator.getCreator().getUrl());
creatorInfo.setIsHot(loginCreator.getCreator().getIsHot());
creatorInfo.setIsShow(loginCreator.getCreator().getIsShow());
creatorInfo.setIntro(loginCreator.getCreator().getIntro());
creatorInfo.setUserName(loginCreator.getCreator().getName());
creatorInfo.setIpaddr(loginCreator.getIpaddr());
creatorInfo.setLastLoginTime(loginCreator.getLoginTime());
creatorInfo.setImg(loginCreator.getCreator().getImg());
creatorInfo.setIsShow(loginCreator.getCreator().getIsShow());
creatorInfo.setCreateTime(loginCreator.getCreator().getCreateTime());
creatorInfo.setUpdateTime(loginCreator.getCreator().getUpdateTime());
creatorInfo.setSort(loginCreator.getCreator().getSort());
creatorInfo.setUserClientType(userClientType.getType());
return creatorInfo;
default:
throw new ServiceException("userClientType 未匹配上对应用户类型");
}
if(StringUtils.isBlank(platform)){
throw new ServiceException(ResponseEnum.NOT_AUTH);
}
EnumUserClientType userClientType = EnumUserClientType.getTypeByCode(platform);
switch (userClientType){
case DU:
UserInfoVo tiktokUserInfo = new UserInfoVo();
LoginTiktokUser loginTikTokUser = getLoginTikTokUser();
tiktokUserInfo.setId(loginTikTokUser.getTiktokUserId());
tiktokUserInfo.setOpenId(loginTikTokUser.getTiktokUserOpenId());
tiktokUserInfo.setUserName(loginTikTokUser.getTiktokUserName());
tiktokUserInfo.setIpaddr(loginTikTokUser.getIpaddr());
tiktokUserInfo.setLastLoginTime(loginTikTokUser.getLoginTime());
tiktokUserInfo.setImg(loginTikTokUser.getTiktokUser().getImg());
tiktokUserInfo.setIsVip(loginTikTokUser.getTiktokUser().getIsVip());
tiktokUserInfo.setCreateTime(loginTikTokUser.getTiktokUser().getCreateTime());
tiktokUserInfo.setUpdateTime(loginTikTokUser.getTiktokUser().getUpdateTime());
tiktokUserInfo.setSort(loginTikTokUser.getTiktokUser().getSort());
tiktokUserInfo.setUserClientType(userClientType.getType());
return tiktokUserInfo;
case WU:
UserInfoVo wechatUserInfo = new UserInfoVo();
LoginWechatUser loginWechatUser = getLoginWechatUser();
wechatUserInfo.setId(loginWechatUser.getWxUserId());
wechatUserInfo.setOpenId(loginWechatUser.getWxUserOpenId());
wechatUserInfo.setUserName(loginWechatUser.getWxUserName());
wechatUserInfo.setIpaddr(loginWechatUser.getIpaddr());
wechatUserInfo.setLastLoginTime(loginWechatUser.getLoginTime());
wechatUserInfo.setImg(loginWechatUser.getWxUser().getImg());
wechatUserInfo.setIsVip(loginWechatUser.getWxUser().getIsVip());
wechatUserInfo.setCreateTime(loginWechatUser.getWxUser().getCreateTime());
wechatUserInfo.setUpdateTime(loginWechatUser.getWxUser().getUpdateTime());
wechatUserInfo.setSort(loginWechatUser.getWxUser().getSort());
wechatUserInfo.setUserClientType(userClientType.getType());
return wechatUserInfo;
case KU:
UserInfoVo fhUserInfo = new UserInfoVo();
LoginFhUser loginFhUser = getLoginFhUser();
fhUserInfo.setId(loginFhUser.getFhUserId());
fhUserInfo.setOpenId(loginFhUser.getFhUserOpenId());
fhUserInfo.setUserName(loginFhUser.getFhUserName());
fhUserInfo.setIpaddr(loginFhUser.getIpaddr());
fhUserInfo.setLastLoginTime(loginFhUser.getLoginTime());
fhUserInfo.setImg(loginFhUser.getFhUser().getImg());
fhUserInfo.setIsVip(loginFhUser.getFhUser().getIsVip());
fhUserInfo.setCreateTime(loginFhUser.getFhUser().getCreateTime());
fhUserInfo.setUpdateTime(loginFhUser.getFhUser().getUpdateTime());
fhUserInfo.setSort(loginFhUser.getFhUser().getSort());
fhUserInfo.setUserClientType(userClientType.getType());
return fhUserInfo;
case WY:
UserInfoVo creatorInfo = new UserInfoVo();
LoginCreator loginCreator = getLoginCreator();
creatorInfo.setId(loginCreator.getCreatorId());
creatorInfo.setPhone(loginCreator.getCreatorPhone());
creatorInfo.setScanCode(loginCreator.getCreator().getScanCode());
creatorInfo.setAmt(loginCreator.getCreator().getAmt());
creatorInfo.setInviteCode(loginCreator.getCreator().getInviteCode());
creatorInfo.setStatus(loginCreator.getCreator().getStatus());
creatorInfo.setUrl(loginCreator.getCreator().getUrl());
creatorInfo.setIsHot(loginCreator.getCreator().getIsHot());
creatorInfo.setIsShow(loginCreator.getCreator().getIsShow());
creatorInfo.setIntro(loginCreator.getCreator().getIntro());
creatorInfo.setUserName(loginCreator.getCreator().getName());
creatorInfo.setIpaddr(loginCreator.getIpaddr());
creatorInfo.setLastLoginTime(loginCreator.getLoginTime());
creatorInfo.setImg(loginCreator.getCreator().getImg());
creatorInfo.setIsShow(loginCreator.getCreator().getIsShow());
creatorInfo.setCreateTime(loginCreator.getCreator().getCreateTime());
creatorInfo.setUpdateTime(loginCreator.getCreator().getUpdateTime());
creatorInfo.setSort(loginCreator.getCreator().getSort());
creatorInfo.setUserClientType(userClientType.getType());
return creatorInfo;
default:
throw new ServiceException("userClientType 未匹配上对应用户类型");
}
return null;
}
//******************************通用获取信息结束*********************************************

6
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java

@ -1,11 +1,9 @@
package com.bnyer.order.dto;
import com.bnyer.common.core.annotation.CustomParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@ -29,8 +27,4 @@ public class AddVipOrderDto implements Serializable {
@ApiModelProperty(value="vip表id")
private Long vipId;
@NotNull(message = "用户客户端类型不能为空!")
@ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
}

4
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java

@ -34,6 +34,9 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener<String> {
@Resource
private VipOrderMapper vipOrderMapper;
@Resource
private VipOrderService vipOrderService;
@Resource
private RocketMQTemplate vipRecordMqTemplate;
@ -41,7 +44,6 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener<String> {
public void onMessage(String message) {
log.info("收到消息:{}", message);
//修改订单并添加会员记录
VipOrderService vipOrderService = SpringUtils.getBean(VipOrderService.class);
JSONObject orderObj = JSON.parseObject(message);
String orderNo = orderObj.getString("orderNo");
VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNo, orderNo));

19
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/query/VipOrderDetailsQuery.java

@ -0,0 +1,19 @@
package com.bnyer.order.query;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
/**
* @author :WXC
* @Date :2023/05/09
* @description :
*/
@Getter
@Setter
@Builder
public class VipOrderDetailsQuery {
@ApiModelProperty(value="订单号")
private String orderNo;
}

9
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.bnyer.common.core.domain.VipOrder;
import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.query.VipOrderDetailsQuery;
import com.bnyer.order.vo.VipOrderDetailsVo;
import com.bnyer.order.vo.VipOrderVo;
import java.util.List;
@ -37,6 +39,13 @@ public interface VipOrderService extends IService<VipOrder> {
*/
List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto);
/**
* 查询会员订单详情
* @param query
* @return
*/
VipOrderDetailsVo queryVipOrder(VipOrderDetailsQuery query);
/**
* 更新订单信息
* @param vipOrder

31
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java

@ -11,17 +11,21 @@ import com.bnyer.common.core.enums.*;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils;
import com.bnyer.common.core.utils.OrderUtil;
import com.bnyer.common.core.utils.StringUtils;
import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.vo.UserInfoVo;
import com.bnyer.common.rocketmq.config.RocketMqConstant;
import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.img.api.dto.QueryUserVipDto;
import com.bnyer.img.api.remote.RemoteWxMiniService;
import com.bnyer.img.api.vo.UserVipInfoVo;
import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.query.VipOrderDetailsQuery;
import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.enums.EnumVipOrderStatus;
import com.bnyer.order.mapper.VipOrderMapper;
import com.bnyer.order.service.VipOrderService;
import com.bnyer.order.vo.VipOrderDetailsVo;
import com.bnyer.order.vo.VipOrderVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendStatus;
@ -66,6 +70,25 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
return vipOrderVoList;
}
/**
* 查询会员订单详情
* @param query
* @return
*/
@Override
public VipOrderDetailsVo queryVipOrder(VipOrderDetailsQuery query) {
LambdaQueryWrapper<VipOrder> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(query.getOrderNo())){
queryWrapper.eq(VipOrder::getOrderNo,query.getOrderNo());
}
VipOrder vipOrder = vipOrderMapper.selectOne(queryWrapper);
if (Objects.isNull(vipOrder)){
throw new ServiceException(ResponseEnum.NOT_EXIST,"会员订单");
}
VipOrderDetailsVo orderDetailsVo = EntityConvertUtil.copy(vipOrder, VipOrderDetailsVo.class);
return orderDetailsVo;
}
/**
* 生成会员订单返回订单号
@ -132,7 +155,9 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
* @return
*/
private VipOrder buildImgVipOrder(UserVipInfoVo userVipInfoVo, AddVipOrderDto addVipOrderDto) {
Long userId = SecurityUtils.getUserId();
UserInfoVo userInfo = SecurityUtils.getUserInfo();
Long userId = userInfo.getId();
Integer userClientType = userInfo.getUserClientType();
VipOrder vipOrder = new VipOrder();
vipOrder.setVipId(userVipInfoVo.getId());
vipOrder.setVipCode(userVipInfoVo.getVipCode());
@ -153,8 +178,8 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipInfoVo.getValidTimeNum()));
//开通的天数
vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true));
vipOrder.setUserClientType(addVipOrderDto.getUserClientType());
vipOrder.setOrderNo(OrderUtil.getOrderNo("RV",nowDate, EnumUserClientType.getCodeByType(addVipOrderDto.getUserClientType()),String.valueOf(userId)));
vipOrder.setUserClientType(userClientType);
vipOrder.setOrderNo(OrderUtil.getOrderNo("RV",nowDate, EnumUserClientType.getCodeByType(userClientType),String.valueOf(userId)));
vipOrder.setCreateTime(nowDate);
return vipOrder;
}

16
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderDetailsVo.java

@ -0,0 +1,16 @@
package com.bnyer.order.vo;
import lombok.Getter;
import lombok.Setter;
/**
* @author :WXC
* @Date :2023/03/27
* @description :
*/
@Getter
@Setter
public class VipOrderDetailsVo extends VipOrderVo{
}

2
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java

@ -1,7 +1,5 @@
package com.bnyer.order.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/UnifiedOrderBo.java

@ -49,7 +49,7 @@ public class UnifiedOrderBo {
*/
private String goodsSubject;
/**
* 商品描述: 会员充值
* 商品描述: 支付场景名称会员类型-会员名称
*/
private String goodsDesc;
}

42
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java

@ -3,18 +3,17 @@ package com.bnyer.pay.design.strategy;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.msg.MsgConstants;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.constant.RedisKeyConstant;
import com.bnyer.common.core.domain.PayInfo;
import com.bnyer.common.core.enums.EnumPayType;
import com.bnyer.common.redis.service.RedissonService;
import com.bnyer.pay.dto.PayNotifyCheckDto;
import com.bnyer.pay.mapper.PayInfoMapper;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.vo.PayInfoDetailsVo;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@ -26,11 +25,15 @@ import java.util.concurrent.TimeUnit;
@Slf4j
public abstract class AbstractPayStrategy implements IPayStrategy {
@Resource
private PayInfoMapper payInfoMapper;
private static PayInfoService payInfoService;
@Resource
private RedissonService redissonService;
private static RedissonService redissonService;
@Autowired
public void setBean(PayInfoService payInfoService, RedissonService redissonService) {
AbstractPayStrategy.payInfoService = payInfoService;
AbstractPayStrategy.redissonService = redissonService;
}
/**
* 校验是否已支付避免重复调用
@ -38,38 +41,35 @@ public abstract class AbstractPayStrategy implements IPayStrategy {
* @return
*/
public String payNotifyCheck(PayNotifyCheckDto checkDto){
log.error("回调结果校验开始,支付单号:{}",checkDto.getPayId());
log.info("回调结果校验开始,支付单号:{}",checkDto.getPayId());
String resultMsg = "";
RLock rLock = redissonService.getRLock(RedisKeyConstant.PAY_NOTIFY_LOCK_KEY + checkDto.getPayId());
try{
if(rLock.tryLock(2L, 10L, TimeUnit.SECONDS)){
PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper<PayInfo>().eq(PayInfo::getPayId, checkDto.getPayId()).eq(PayInfo::getIsShow, "1"));
if (Objects.isNull(payInfo)){
return buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail");
}
log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfo));
PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryPayInfo(checkDto.getPayId());
log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfoDetailsVo));
//订单中的金额
String payInfoPayAmount = payInfo.getPayAmount().toString();
String payInfoPayAmount = payInfoDetailsVo.getPayAmount().toString();
//回调中的金额
String notifyPayAmount = checkDto.getPayAmount();
//对账状态
Integer singleStatus = payInfo.getSingleStatus();
Integer singleStatus = payInfoDetailsVo.getSingleStatus();
log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount);
if (payInfoPayAmount.equals(notifyPayAmount)){
if (Objects.nonNull(singleStatus)){
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,checkDto.getMsg());
}
}else {
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail");
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"trade fail");
}
}else {
log.error("获取锁失败,支付单号:{}",checkDto.getPayId());
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail");
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"trade fail");
}
}catch (Exception e){
e.printStackTrace();
log.error("回调结果校验失败,支付单号:{}",checkDto.getPayId());
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail");
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"trade fail");
}finally {
rLock.unlock();
}
@ -86,7 +86,7 @@ public abstract class AbstractPayStrategy implements IPayStrategy {
public String buildNotifyCheckResultMsg(EnumPayType payType,boolean isSuccess,String msg){
String result = "";
if (EnumPayType.WX_PAY == payType){
result = isSuccess?WxPayNotifyResponse.success(msg):WxPayNotifyResponse.fail(msg);
result = isSuccess?WxPayNotifyV3Response.success(msg): WxPayNotifyV3Response.fail(msg);
}else if (EnumPayType.ALI_PAY == payType){
result = isSuccess?MsgConstants.SUCCESS:MsgConstants.FAIL;
} else if (EnumPayType.KS_PAY == payType) {

88
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java

@ -173,53 +173,57 @@ public class DYPayStrategy extends AbstractPayStrategy{
//订单信息的json字符串
String message = object.getString("msg");
JSONObject msgJsonObj = JSON.parseObject(message);
log.info("快手支付:统一回调处理,params:{}",message);
if (StringUtils.isBlank(msgSignature)) {
log.info("抖音支付回调参数丢失,payId:{}",object.getString("cp_orderno"));
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,false,"trade fail");
}
//校验回调签名
String signMessage = dyPayUtil.getCallbackSignature(timestamp, nonce, message,token);
//签名校验
if (msgSignature.equals(signMessage)) {
//固定值SUCCESS
String status = msgJsonObj.getString("status");
//开发者侧的订单号
String outOrderNo = msgJsonObj.getString("cp_orderno");
//支付渠道: 1-微信支付,2-支付宝支付,10-抖音支付
String payChannel = msgJsonObj.getString("way");
//支付金额,单位为分
Integer totalAmount = msgJsonObj.getInteger("total_amount");
//支付渠道侧PC单号,支付页面可见(微信支付宝侧的订单号)
String paymentOrderNo = msgJsonObj.getString("payment_order_no");
//抖音侧订单号
String dyOrderId = msgJsonObj.getString("order_id");
//这里无论回调失败还是成功,都需要都各个业务层去处理相关逻辑
if("success".equals(status)){
//处理业务
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.DY_PAY);
payNotifyCheckDto.setPayAmount(BaseWxPayResult.fenToYuan(totalAmount));
payNotifyCheckDto.setPayId(outOrderNo);
payNotifyCheckDto.setMsg("success");
String notifyCheck = super.payNotifyCheck(payNotifyCheckDto);
if (StringUtils.isNotBlank(notifyCheck)){
return notifyCheck;
}
log.info("抖音支付回调,交易正常:封装参数修改内部支付单信息");
EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto();
editPayInfoNotifyDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(totalAmount)));
editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date()));
editPayInfoNotifyDto.setAppId(appId);
editPayInfoNotifyDto.setPayId(outOrderNo);
editPayInfoNotifyDto.setPayNo(dyOrderId);
editPayInfoNotifyDto.setTradeNo(paymentOrderNo);
editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName(payChannel,EnumPayType.DY_PAY));
payInfoService.editPayInfoNotify(editPayInfoNotifyDto);
//正确处理后返回以下内容格式通知小程序平台不再持续回调
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"success");
}else {
log.info("抖音支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,outOrderNo);
}
} else {
if (!msgSignature.equals(signMessage)) {
log.info("抖音支付回调签名校验失败,payId:{}",msgJsonObj.getString("cp_orderno"));
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,false,"trade fail");
}
//固定值SUCCESS
String status = msgJsonObj.getString("status");
//开发者侧的订单号
String outOrderNo = msgJsonObj.getString("cp_orderno");
//支付渠道: 1-微信支付,2-支付宝支付,10-抖音支付
String payChannel = msgJsonObj.getString("way");
//支付金额,单位为分
Integer totalAmount = msgJsonObj.getInteger("total_amount");
//支付渠道侧PC单号,支付页面可见(微信支付宝侧的订单号)
String paymentOrderNo = msgJsonObj.getString("payment_order_no");
//抖音侧订单号
String dyOrderId = msgJsonObj.getString("order_id");
//这里无论回调失败还是成功,都需要都各个业务层去处理相关逻辑
if(!"success".equals(status)){
log.info("抖音支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,outOrderNo);
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,false,"trade fail");
}
//处理业务
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.DY_PAY);
payNotifyCheckDto.setPayAmount(BaseWxPayResult.fenToYuan(totalAmount));
payNotifyCheckDto.setPayId(outOrderNo);
payNotifyCheckDto.setMsg("success");
String notifyCheck = super.payNotifyCheck(payNotifyCheckDto);
if (StringUtils.isNotBlank(notifyCheck)){
return notifyCheck;
}
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"business fail");
log.info("抖音支付回调,交易正常:封装参数修改内部支付单信息");
EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto();
editPayInfoNotifyDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(totalAmount)));
editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date()));
editPayInfoNotifyDto.setAppId(appId);
editPayInfoNotifyDto.setPayId(outOrderNo);
editPayInfoNotifyDto.setPayNo(dyOrderId);
editPayInfoNotifyDto.setTradeNo(paymentOrderNo);
editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName(payChannel,EnumPayType.DY_PAY));
payInfoService.editPayInfoNotify(editPayInfoNotifyDto);
//正确处理后返回以下内容格式通知小程序平台不再持续回调
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"success");
}
@Override

103
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java

@ -82,7 +82,7 @@ public class KSPayStrategy extends AbstractPayStrategy{
public ThirdUnifiedOrderVo unifiedOrder(UnifiedOrderBo bo) {
String result = "";
KspayConfig kspayConfig = getKspayConfig();
String openId = SecurityContextHolder.getFhOpenId();
String openId = bo.getOpenId();
String appId = kspayConfig.getAppid();
String backurl = kspayConfig.getBackurl();
String secret = kspayConfig.getSecret();
@ -173,59 +173,58 @@ public class KSPayStrategy extends AbstractPayStrategy{
String kwaisign = jsonObject.getString("sign");
String jsonString = JSONObject.toJSONString(object, SerializerFeature.WRITE_MAP_NULL_FEATURES, SerializerFeature.QuoteFieldNames);
log.info("快手支付:统一回调处理,params:{}",jsonString);
if (StringUtils.isNotBlank(kwaisign)) {
jsonString = jsonString + secret;
//签名校验
if (kwaisign.equals(DigestUtils.md5Hex(jsonString))) {
//当前回调消息的唯一ID,在同一个消息多次通知时,保持一致。
String messageId = object.getString("message_id");
JSONObject data = object.getJSONObject("data");
//支付渠道。取值:UNKNOWN - 未知|WECHAT-微信|ALIPAY-支付宝
String channel = data.getString("channel");
//订单支付状态。 取值: PROCESSING-处理中|SUCCESS-成功|FAILED-失败
String status = data.getString("status");
//订单金额
Integer orderAmount = data.getInteger("order_amount");
//用户侧支付页交易单号
String tradeNo = data.getString("trade_no");
//商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
String outOrderNo = data.getString("out_order_no");
//快手小程序平台订单号。
String ksOrderNo = data.getString("ks_order_no");
//回调支付成功
if ("SUCCESS".equals(status)) {
//处理业务
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.KS_PAY);
payNotifyCheckDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(orderAmount)));
payNotifyCheckDto.setPayId(outOrderNo);
payNotifyCheckDto.setMsg(messageId);
String notifyCheck = super.payNotifyCheck(payNotifyCheckDto);
if (StringUtils.isNotBlank(notifyCheck)){
return notifyCheck;
}
log.info("快手支付回调,交易正常:封装参数修改内部支付单信息");
EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto();
editPayInfoNotifyDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(orderAmount)));
editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date()));
editPayInfoNotifyDto.setAppId(appId);
editPayInfoNotifyDto.setPayId(outOrderNo);
editPayInfoNotifyDto.setPayNo(ksOrderNo);
editPayInfoNotifyDto.setTradeNo(tradeNo);
editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName(channel,EnumPayType.KS_PAY));
payInfoService.editPayInfoNotify(editPayInfoNotifyDto);
//正确处理后返回以下内容格式通知小程序平台不再持续回调
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,messageId);
}else {
log.info("快手支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,object.getString("trade_no"));
}
} else {
log.info("快手支付回调签名校验失败,payId:{}",object.getString("trade_no"));
}
} else {
if (StringUtils.isBlank(kwaisign)) {
log.info("快手支付回调参数丢失,payId:{}",object.getString("trade_no"));
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,false,"trade fail");
}
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,"business fail");
jsonString = jsonString + secret;
//签名校验
if (!kwaisign.equals(DigestUtils.md5Hex(jsonString))) {
log.info("快手支付回调签名校验失败,payId:{}",object.getString("trade_no"));
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,false,"trade fail");
}
//当前回调消息的唯一ID,在同一个消息多次通知时,保持一致。
String messageId = object.getString("message_id");
JSONObject data = object.getJSONObject("data");
//支付渠道。取值:UNKNOWN - 未知|WECHAT-微信|ALIPAY-支付宝
String channel = data.getString("channel");
//订单支付状态。 取值: PROCESSING-处理中|SUCCESS-成功|FAILED-失败
String status = data.getString("status");
//订单金额
Integer orderAmount = data.getInteger("order_amount");
//用户侧支付页交易单号
String tradeNo = data.getString("trade_no");
//商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
String outOrderNo = data.getString("out_order_no");
//快手小程序平台订单号。
String ksOrderNo = data.getString("ks_order_no");
//回调支付成功
if (!"SUCCESS".equals(status)) {
log.info("快手支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,object.getString("trade_no"));
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,false,"trade fail");
}
//处理业务
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.KS_PAY);
payNotifyCheckDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(orderAmount)));
payNotifyCheckDto.setPayId(outOrderNo);
payNotifyCheckDto.setMsg(messageId);
String notifyCheck = super.payNotifyCheck(payNotifyCheckDto);
if (StringUtils.isNotBlank(notifyCheck)){
return notifyCheck;
}
log.info("快手支付回调,交易正常:封装参数修改内部支付单信息");
EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto();
editPayInfoNotifyDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(orderAmount)));
editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date()));
editPayInfoNotifyDto.setAppId(appId);
editPayInfoNotifyDto.setPayId(outOrderNo);
editPayInfoNotifyDto.setPayNo(ksOrderNo);
editPayInfoNotifyDto.setTradeNo(tradeNo);
editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName(channel,EnumPayType.KS_PAY));
payInfoService.editPayInfoNotify(editPayInfoNotifyDto);
//正确处理后返回以下内容格式通知小程序平台不再持续回调
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,messageId);
}
@Override

5
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java

@ -82,7 +82,7 @@ public class WxPayStrategy extends AbstractPayStrategy {
private ThirdUnifiedOrderVo jsApiPay(UnifiedOrderBo bo) {
WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(bo.getTradeType());
WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig);
String openId = SecurityContextHolder.getWechatOpenId();
String openId = bo.getOpenId();
try {
WxPayUnifiedOrderV3Request orderRequest = new WxPayUnifiedOrderV3Request();
WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
@ -147,8 +147,9 @@ public class WxPayStrategy extends AbstractPayStrategy {
String timeEnd = result.getSuccessTime();
//支付状态
String tradeState = result.getTradeState();
//如果不是交易成功不往下走
if (!EnumWxPayStatus.SUCCESS.getStatus().equals(tradeState)){
return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,false,"交易失败");
return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,false,"trade fail");
}
//校验是否已支付避免重复调用
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java

@ -29,5 +29,5 @@ public interface PayInfoService extends IService<PayInfo>{
* @param payId
* @return
*/
PayInfoDetailsVo queryOrder(String payId);
PayInfoDetailsVo queryPayInfo(String payId);
}

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java

@ -127,7 +127,7 @@ public class PayInfoServiceImpl extends ServiceImpl<PayInfoMapper, PayInfo> impl
* @return
*/
@Override
public PayInfoDetailsVo queryOrder(String payId) {
public PayInfoDetailsVo queryPayInfo(String payId) {
PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper<PayInfo>().eq(PayInfo::getPayId, payId));
if (Objects.isNull(payInfo)){
throw new ServiceException(ResponseEnum.NOT_EXIST,"支付订单");

12
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java

@ -6,6 +6,8 @@ import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.OrderUtil;
import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.utils.ip.IpUtils;
import com.bnyer.common.core.vo.UserInfoVo;
import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.order.api.dto.QueryVipOrderDto;
import com.bnyer.order.api.remote.RemoteVipOrderService;
import com.bnyer.order.api.vo.VipOrderVo;
@ -15,8 +17,8 @@ import com.bnyer.pay.constant.KSPayConstants;
import com.bnyer.pay.design.factory.PayFactory;
import com.bnyer.pay.design.strategy.IPayStrategy;
import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.dto.QueryOrderDto;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.enums.EnumAliPayStatus;
import com.bnyer.pay.enums.EnumDyPayStatus;
import com.bnyer.pay.enums.EnumKsPayStatus;
@ -131,7 +133,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* 构建统一下单请求实体
*
* @param dto 入参
* @param goodsDesc
* @param goodsDesc 商品描述
* @param goodsType 商品类型
* @param payAmount 不同支付场景下的支付金额
* @param payId 内部系统支付单号
@ -139,12 +141,14 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* @return
*/
private UnifiedOrderBo buildUnifiedOrderDto(UnifiedOrderDto dto, String goodsDesc, int goodsType, String payAmount, String payId, HttpServletRequest request) {
String openId = "";
UserInfoVo userInfo = SecurityUtils.getUserInfo();
String openId = userInfo.getOpenId();
//当前时间
Date currDate = new Date();
//ip地址
String ip = IpUtils.getIpAddr(request);
UnifiedOrderBo unifiedOrderBo = EntityConvertUtil.copy(dto, UnifiedOrderBo.class);
unifiedOrderBo.setOpenId(openId);
unifiedOrderBo.setPayId(payId);
unifiedOrderBo.setIp(ip);
unifiedOrderBo.setCurrDate(currDate);
@ -163,7 +167,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
@Override
public QueryOrderVo queryOrder(QueryOrderDto dto) {
//先查询系统支付单是否已经完成支付,如果因为延迟导致没有及时同步,在调用第三方接口查询支付状态返回
PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryOrder(dto.getPayId());
PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryPayInfo(dto.getPayId());
if (Objects.isNull(payInfoDetailsVo)){
throw new ServiceException(ResponseEnum.NOT_EXIST);
}

Loading…
Cancel
Save