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. 7
      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. 22
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java
  14. 27
      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, "系统繁忙,请稍候重试!"), SERVER_ERROR(500, "系统繁忙,请稍候重试!"),
NOT_AUTH(500, "未登录!"),
PARAM_ERROR(400, "参数异常!"), PARAM_ERROR(400, "参数异常!"),
NOT_EXIST(110001, "查询为空"), NOT_EXIST(110001, "查询为空"),
PAY_CONFIG_ERROR(110002, "支付配置未启用或未配置!"), 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 * 用户类型 抖音->10;快手->20;微信->30;微信艺术家->40
*/ */
private int userClientType; private Integer userClientType;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

7
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.constant.TokenConstants;
import com.bnyer.common.core.context.SecurityContextHolder; import com.bnyer.common.core.context.SecurityContextHolder;
import com.bnyer.common.core.enums.EnumUserClientType; 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.exception.ServiceException;
import com.bnyer.common.core.utils.ServletUtils; import com.bnyer.common.core.utils.ServletUtils;
import com.bnyer.common.core.utils.StringUtils; import com.bnyer.common.core.utils.StringUtils;
@ -34,7 +35,9 @@ public class SecurityUtils
*/ */
public static UserInfoVo getUserInfo(){ public static UserInfoVo getUserInfo(){
String platform = ServletUtils.getRequest().getHeader("platform"); String platform = ServletUtils.getRequest().getHeader("platform");
if(StringUtils.isNotEmpty(platform)){ if(StringUtils.isBlank(platform)){
throw new ServiceException(ResponseEnum.NOT_AUTH);
}
EnumUserClientType userClientType = EnumUserClientType.getTypeByCode(platform); EnumUserClientType userClientType = EnumUserClientType.getTypeByCode(platform);
switch (userClientType){ switch (userClientType){
case DU: case DU:
@ -109,8 +112,6 @@ public class SecurityUtils
throw new ServiceException("userClientType 未匹配上对应用户类型"); 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; package com.bnyer.order.dto;
import com.bnyer.common.core.annotation.CustomParamsValidation;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@ -29,8 +27,4 @@ public class AddVipOrderDto implements Serializable {
@ApiModelProperty(value="vip表id") @ApiModelProperty(value="vip表id")
private Long vipId; 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 @Resource
private VipOrderMapper vipOrderMapper; private VipOrderMapper vipOrderMapper;
@Resource
private VipOrderService vipOrderService;
@Resource @Resource
private RocketMQTemplate vipRecordMqTemplate; private RocketMQTemplate vipRecordMqTemplate;
@ -41,7 +44,6 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener<String> {
public void onMessage(String message) { public void onMessage(String message) {
log.info("收到消息:{}", message); log.info("收到消息:{}", message);
//修改订单并添加会员记录 //修改订单并添加会员记录
VipOrderService vipOrderService = SpringUtils.getBean(VipOrderService.class);
JSONObject orderObj = JSON.parseObject(message); JSONObject orderObj = JSON.parseObject(message);
String orderNo = orderObj.getString("orderNo"); String orderNo = orderObj.getString("orderNo");
VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNo, 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.common.core.domain.VipOrder;
import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.dto.AddVipOrderDto; 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 com.bnyer.order.vo.VipOrderVo;
import java.util.List; import java.util.List;
@ -37,6 +39,13 @@ public interface VipOrderService extends IService<VipOrder> {
*/ */
List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto); List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto);
/**
* 查询会员订单详情
* @param query
* @return
*/
VipOrderDetailsVo queryVipOrder(VipOrderDetailsQuery query);
/** /**
* 更新订单信息 * 更新订单信息
* @param vipOrder * @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.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.core.utils.DateUtils;
import com.bnyer.common.core.utils.OrderUtil; 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.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.vo.UserInfoVo;
import com.bnyer.common.rocketmq.config.RocketMqConstant; import com.bnyer.common.rocketmq.config.RocketMqConstant;
import com.bnyer.common.security.utils.SecurityUtils; import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.img.api.dto.QueryUserVipDto; import com.bnyer.img.api.dto.QueryUserVipDto;
import com.bnyer.img.api.remote.RemoteWxMiniService; import com.bnyer.img.api.remote.RemoteWxMiniService;
import com.bnyer.img.api.vo.UserVipInfoVo; import com.bnyer.img.api.vo.UserVipInfoVo;
import com.bnyer.order.dto.AddVipOrderDto; import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.query.VipOrderDetailsQuery;
import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.enums.EnumVipOrderStatus; import com.bnyer.order.enums.EnumVipOrderStatus;
import com.bnyer.order.mapper.VipOrderMapper; import com.bnyer.order.mapper.VipOrderMapper;
import com.bnyer.order.service.VipOrderService; import com.bnyer.order.service.VipOrderService;
import com.bnyer.order.vo.VipOrderDetailsVo;
import com.bnyer.order.vo.VipOrderVo; import com.bnyer.order.vo.VipOrderVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.client.producer.SendStatus;
@ -66,6 +70,25 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
return vipOrderVoList; 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 * @return
*/ */
private VipOrder buildImgVipOrder(UserVipInfoVo userVipInfoVo, AddVipOrderDto addVipOrderDto) { 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 vipOrder = new VipOrder();
vipOrder.setVipId(userVipInfoVo.getId()); vipOrder.setVipId(userVipInfoVo.getId());
vipOrder.setVipCode(userVipInfoVo.getVipCode()); 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.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipInfoVo.getValidTimeNum()));
//开通的天数 //开通的天数
vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true)); vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true));
vipOrder.setUserClientType(addVipOrderDto.getUserClientType()); vipOrder.setUserClientType(userClientType);
vipOrder.setOrderNo(OrderUtil.getOrderNo("RV",nowDate, EnumUserClientType.getCodeByType(addVipOrderDto.getUserClientType()),String.valueOf(userId))); vipOrder.setOrderNo(OrderUtil.getOrderNo("RV",nowDate, EnumUserClientType.getCodeByType(userClientType),String.valueOf(userId)));
vipOrder.setCreateTime(nowDate); vipOrder.setCreateTime(nowDate);
return vipOrder; 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; package com.bnyer.order.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; 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 goodsSubject;
/** /**
* 商品描述: 会员充值 * 商品描述: 支付场景名称会员类型-会员名称
*/ */
private String goodsDesc; 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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alipay.api.msg.MsgConstants; 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.constant.RedisKeyConstant;
import com.bnyer.common.core.domain.PayInfo;
import com.bnyer.common.core.enums.EnumPayType; import com.bnyer.common.core.enums.EnumPayType;
import com.bnyer.common.redis.service.RedissonService; import com.bnyer.common.redis.service.RedissonService;
import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.PayNotifyCheckDto;
import com.bnyer.pay.mapper.PayInfoMapper; import com.bnyer.pay.service.PayInfoService;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; import com.bnyer.pay.vo.PayInfoDetailsVo;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -26,11 +25,15 @@ import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
public abstract class AbstractPayStrategy implements IPayStrategy { public abstract class AbstractPayStrategy implements IPayStrategy {
@Resource private static PayInfoService payInfoService;
private PayInfoMapper payInfoMapper;
@Resource private static RedissonService redissonService;
private 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 * @return
*/ */
public String payNotifyCheck(PayNotifyCheckDto checkDto){ public String payNotifyCheck(PayNotifyCheckDto checkDto){
log.error("回调结果校验开始,支付单号:{}",checkDto.getPayId()); log.info("回调结果校验开始,支付单号:{}",checkDto.getPayId());
String resultMsg = ""; String resultMsg = "";
RLock rLock = redissonService.getRLock(RedisKeyConstant.PAY_NOTIFY_LOCK_KEY + checkDto.getPayId()); RLock rLock = redissonService.getRLock(RedisKeyConstant.PAY_NOTIFY_LOCK_KEY + checkDto.getPayId());
try{ try{
if(rLock.tryLock(2L, 10L, TimeUnit.SECONDS)){ if(rLock.tryLock(2L, 10L, TimeUnit.SECONDS)){
PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper<PayInfo>().eq(PayInfo::getPayId, checkDto.getPayId()).eq(PayInfo::getIsShow, "1")); PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryPayInfo(checkDto.getPayId());
if (Objects.isNull(payInfo)){ log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfoDetailsVo));
return buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail");
}
log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfo));
//订单中的金额 //订单中的金额
String payInfoPayAmount = payInfo.getPayAmount().toString(); String payInfoPayAmount = payInfoDetailsVo.getPayAmount().toString();
//回调中的金额 //回调中的金额
String notifyPayAmount = checkDto.getPayAmount(); String notifyPayAmount = checkDto.getPayAmount();
//对账状态 //对账状态
Integer singleStatus = payInfo.getSingleStatus(); Integer singleStatus = payInfoDetailsVo.getSingleStatus();
log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount); log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount);
if (payInfoPayAmount.equals(notifyPayAmount)){ if (payInfoPayAmount.equals(notifyPayAmount)){
if (Objects.nonNull(singleStatus)){ if (Objects.nonNull(singleStatus)){
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,checkDto.getMsg()); resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,checkDto.getMsg());
} }
}else { }else {
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"trade fail");
} }
}else { }else {
log.error("获取锁失败,支付单号:{}",checkDto.getPayId()); log.error("获取锁失败,支付单号:{}",checkDto.getPayId());
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"trade fail");
} }
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
log.error("回调结果校验失败,支付单号:{}",checkDto.getPayId()); log.error("回调结果校验失败,支付单号:{}",checkDto.getPayId());
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"trade fail");
}finally { }finally {
rLock.unlock(); rLock.unlock();
} }
@ -86,7 +86,7 @@ public abstract class AbstractPayStrategy implements IPayStrategy {
public String buildNotifyCheckResultMsg(EnumPayType payType,boolean isSuccess,String msg){ public String buildNotifyCheckResultMsg(EnumPayType payType,boolean isSuccess,String msg){
String result = ""; String result = "";
if (EnumPayType.WX_PAY == payType){ 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){ }else if (EnumPayType.ALI_PAY == payType){
result = isSuccess?MsgConstants.SUCCESS:MsgConstants.FAIL; result = isSuccess?MsgConstants.SUCCESS:MsgConstants.FAIL;
} else if (EnumPayType.KS_PAY == payType) { } else if (EnumPayType.KS_PAY == payType) {

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

@ -173,10 +173,18 @@ public class DYPayStrategy extends AbstractPayStrategy{
//订单信息的json字符串 //订单信息的json字符串
String message = object.getString("msg"); String message = object.getString("msg");
JSONObject msgJsonObj = JSON.parseObject(message); 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); String signMessage = dyPayUtil.getCallbackSignature(timestamp, nonce, message,token);
//签名校验 //签名校验
if (msgSignature.equals(signMessage)) { if (!msgSignature.equals(signMessage)) {
log.info("抖音支付回调签名校验失败,payId:{}",msgJsonObj.getString("cp_orderno"));
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,false,"trade fail");
}
//固定值SUCCESS //固定值SUCCESS
String status = msgJsonObj.getString("status"); String status = msgJsonObj.getString("status");
//开发者侧的订单号 //开发者侧的订单号
@ -190,7 +198,10 @@ public class DYPayStrategy extends AbstractPayStrategy{
//抖音侧订单号 //抖音侧订单号
String dyOrderId = msgJsonObj.getString("order_id"); String dyOrderId = msgJsonObj.getString("order_id");
//这里无论回调失败还是成功,都需要都各个业务层去处理相关逻辑 //这里无论回调失败还是成功,都需要都各个业务层去处理相关逻辑
if("success".equals(status)){ if(!"success".equals(status)){
log.info("抖音支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,outOrderNo);
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,false,"trade fail");
}
//处理业务 //处理业务
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.DY_PAY); payNotifyCheckDto.setPayType(EnumPayType.DY_PAY);
@ -213,13 +224,6 @@ public class DYPayStrategy extends AbstractPayStrategy{
payInfoService.editPayInfoNotify(editPayInfoNotifyDto); payInfoService.editPayInfoNotify(editPayInfoNotifyDto);
//正确处理后返回以下内容格式通知小程序平台不再持续回调 //正确处理后返回以下内容格式通知小程序平台不再持续回调
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"success"); return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"success");
}else {
log.info("抖音支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,outOrderNo);
}
} else {
log.info("抖音支付回调签名校验失败,payId:{}",msgJsonObj.getString("cp_orderno"));
}
return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"business fail");
} }
@Override @Override

27
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) { public ThirdUnifiedOrderVo unifiedOrder(UnifiedOrderBo bo) {
String result = ""; String result = "";
KspayConfig kspayConfig = getKspayConfig(); KspayConfig kspayConfig = getKspayConfig();
String openId = SecurityContextHolder.getFhOpenId(); String openId = bo.getOpenId();
String appId = kspayConfig.getAppid(); String appId = kspayConfig.getAppid();
String backurl = kspayConfig.getBackurl(); String backurl = kspayConfig.getBackurl();
String secret = kspayConfig.getSecret(); String secret = kspayConfig.getSecret();
@ -173,10 +173,16 @@ public class KSPayStrategy extends AbstractPayStrategy{
String kwaisign = jsonObject.getString("sign"); String kwaisign = jsonObject.getString("sign");
String jsonString = JSONObject.toJSONString(object, SerializerFeature.WRITE_MAP_NULL_FEATURES, SerializerFeature.QuoteFieldNames); String jsonString = JSONObject.toJSONString(object, SerializerFeature.WRITE_MAP_NULL_FEATURES, SerializerFeature.QuoteFieldNames);
log.info("快手支付:统一回调处理,params:{}",jsonString); log.info("快手支付:统一回调处理,params:{}",jsonString);
if (StringUtils.isNotBlank(kwaisign)) { if (StringUtils.isBlank(kwaisign)) {
log.info("快手支付回调参数丢失,payId:{}",object.getString("trade_no"));
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,false,"trade fail");
}
jsonString = jsonString + secret; jsonString = jsonString + secret;
//签名校验 //签名校验
if (kwaisign.equals(DigestUtils.md5Hex(jsonString))) { if (!kwaisign.equals(DigestUtils.md5Hex(jsonString))) {
log.info("快手支付回调签名校验失败,payId:{}",object.getString("trade_no"));
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,false,"trade fail");
}
//当前回调消息的唯一ID,在同一个消息多次通知时,保持一致。 //当前回调消息的唯一ID,在同一个消息多次通知时,保持一致。
String messageId = object.getString("message_id"); String messageId = object.getString("message_id");
JSONObject data = object.getJSONObject("data"); JSONObject data = object.getJSONObject("data");
@ -193,7 +199,10 @@ public class KSPayStrategy extends AbstractPayStrategy{
//快手小程序平台订单号。 //快手小程序平台订单号。
String ksOrderNo = data.getString("ks_order_no"); String ksOrderNo = data.getString("ks_order_no");
//回调支付成功 //回调支付成功
if ("SUCCESS".equals(status)) { 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 payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.KS_PAY); payNotifyCheckDto.setPayType(EnumPayType.KS_PAY);
@ -216,16 +225,6 @@ public class KSPayStrategy extends AbstractPayStrategy{
payInfoService.editPayInfoNotify(editPayInfoNotifyDto); payInfoService.editPayInfoNotify(editPayInfoNotifyDto);
//正确处理后返回以下内容格式通知小程序平台不再持续回调 //正确处理后返回以下内容格式通知小程序平台不再持续回调
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,messageId); 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 {
log.info("快手支付回调参数丢失,payId:{}",object.getString("trade_no"));
}
return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,"business fail");
} }
@Override @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) { private ThirdUnifiedOrderVo jsApiPay(UnifiedOrderBo bo) {
WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(bo.getTradeType()); WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(bo.getTradeType());
WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig);
String openId = SecurityContextHolder.getWechatOpenId(); String openId = bo.getOpenId();
try { try {
WxPayUnifiedOrderV3Request orderRequest = new WxPayUnifiedOrderV3Request(); WxPayUnifiedOrderV3Request orderRequest = new WxPayUnifiedOrderV3Request();
WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
@ -147,8 +147,9 @@ public class WxPayStrategy extends AbstractPayStrategy {
String timeEnd = result.getSuccessTime(); String timeEnd = result.getSuccessTime();
//支付状态 //支付状态
String tradeState = result.getTradeState(); String tradeState = result.getTradeState();
//如果不是交易成功不往下走
if (!EnumWxPayStatus.SUCCESS.getStatus().equals(tradeState)){ 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(); 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 * @param payId
* @return * @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 * @return
*/ */
@Override @Override
public PayInfoDetailsVo queryOrder(String payId) { public PayInfoDetailsVo queryPayInfo(String payId) {
PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper<PayInfo>().eq(PayInfo::getPayId, payId)); PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper<PayInfo>().eq(PayInfo::getPayId, payId));
if (Objects.isNull(payInfo)){ if (Objects.isNull(payInfo)){
throw new ServiceException(ResponseEnum.NOT_EXIST,"支付订单"); 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.OrderUtil;
import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.utils.ip.IpUtils; 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.dto.QueryVipOrderDto;
import com.bnyer.order.api.remote.RemoteVipOrderService; import com.bnyer.order.api.remote.RemoteVipOrderService;
import com.bnyer.order.api.vo.VipOrderVo; 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.factory.PayFactory;
import com.bnyer.pay.design.strategy.IPayStrategy; import com.bnyer.pay.design.strategy.IPayStrategy;
import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.dto.QueryOrderDto; import com.bnyer.pay.dto.QueryOrderDto;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.enums.EnumAliPayStatus; import com.bnyer.pay.enums.EnumAliPayStatus;
import com.bnyer.pay.enums.EnumDyPayStatus; import com.bnyer.pay.enums.EnumDyPayStatus;
import com.bnyer.pay.enums.EnumKsPayStatus; import com.bnyer.pay.enums.EnumKsPayStatus;
@ -131,7 +133,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* 构建统一下单请求实体 * 构建统一下单请求实体
* *
* @param dto 入参 * @param dto 入参
* @param goodsDesc * @param goodsDesc 商品描述
* @param goodsType 商品类型 * @param goodsType 商品类型
* @param payAmount 不同支付场景下的支付金额 * @param payAmount 不同支付场景下的支付金额
* @param payId 内部系统支付单号 * @param payId 内部系统支付单号
@ -139,12 +141,14 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* @return * @return
*/ */
private UnifiedOrderBo buildUnifiedOrderDto(UnifiedOrderDto dto, String goodsDesc, int goodsType, String payAmount, String payId, HttpServletRequest request) { 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(); Date currDate = new Date();
//ip地址 //ip地址
String ip = IpUtils.getIpAddr(request); String ip = IpUtils.getIpAddr(request);
UnifiedOrderBo unifiedOrderBo = EntityConvertUtil.copy(dto, UnifiedOrderBo.class); UnifiedOrderBo unifiedOrderBo = EntityConvertUtil.copy(dto, UnifiedOrderBo.class);
unifiedOrderBo.setOpenId(openId);
unifiedOrderBo.setPayId(payId); unifiedOrderBo.setPayId(payId);
unifiedOrderBo.setIp(ip); unifiedOrderBo.setIp(ip);
unifiedOrderBo.setCurrDate(currDate); unifiedOrderBo.setCurrDate(currDate);
@ -163,7 +167,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
@Override @Override
public QueryOrderVo queryOrder(QueryOrderDto dto) { public QueryOrderVo queryOrder(QueryOrderDto dto) {
//先查询系统支付单是否已经完成支付,如果因为延迟导致没有及时同步,在调用第三方接口查询支付状态返回 //先查询系统支付单是否已经完成支付,如果因为延迟导致没有及时同步,在调用第三方接口查询支付状态返回
PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryOrder(dto.getPayId()); PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryPayInfo(dto.getPayId());
if (Objects.isNull(payInfoDetailsVo)){ if (Objects.isNull(payInfoDetailsVo)){
throw new ServiceException(ResponseEnum.NOT_EXIST); throw new ServiceException(ResponseEnum.NOT_EXIST);
} }

Loading…
Cancel
Save