Commit 75633aa84ba63bcc64d7b1aa2a4e58f3e55b4018

Authored by YunaiV
1 parent bac30d47

增加微信公众号的支付回调接口

Showing 13 changed files with 173 additions and 11 deletions
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderDO.java
@@ -121,6 +121,10 @@ public class PayOrderDO extends BaseDO { @@ -121,6 +121,10 @@ public class PayOrderDO extends BaseDO {
121 */ 121 */
122 private Date successTime; 122 private Date successTime;
123 /** 123 /**
  124 + * 订单支付通知时间,即支付渠道的通知时间
  125 + */
  126 + private Date notifyTime;
  127 + /**
124 * 支付成功的订单拓展单编号 128 * 支付成功的订单拓展单编号
125 * 129 *
126 * 关联 {@link PayOrderDO#getId()} 130 * 关联 {@link PayOrderDO#getId()}
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/dataobject/order/PayOrderExtensionDO.java
@@ -77,6 +77,6 @@ public class PayOrderExtensionDO extends BaseDO { @@ -77,6 +77,6 @@ public class PayOrderExtensionDO extends BaseDO {
77 * 77 *
78 * 在支持成功后,会记录回调的数据 78 * 在支持成功后,会记录回调的数据
79 */ 79 */
80 - private String channelCallbackData; 80 + private String channelNotifyData;
81 81
82 } 82 }
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderCoreMapper.java
1 package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order; 1 package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order;
2 2
3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; 3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
  4 +import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
@@ -13,4 +14,9 @@ public interface PayOrderCoreMapper extends BaseMapperX<PayOrderDO> { @@ -13,4 +14,9 @@ public interface PayOrderCoreMapper extends BaseMapperX<PayOrderDO> {
13 .eq("merchant_order_id", merchantOrderId)); 14 .eq("merchant_order_id", merchantOrderId));
14 } 15 }
15 16
  17 + default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) {
  18 + return update(update, new QueryWrapper<PayOrderDO>()
  19 + .eq("id", id).eq("status", status));
  20 + }
  21 +
16 } 22 }
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/order/PayOrderExtensionCoreMapper.java
1 package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order; 1 package cn.iocoder.yudao.coreservice.modules.pay.dal.mysql.order;
2 2
3 -import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;  
4 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO; 3 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderExtensionDO;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -9,4 +8,13 @@ import org.apache.ibatis.annotations.Mapper; @@ -9,4 +8,13 @@ import org.apache.ibatis.annotations.Mapper;
9 @Mapper 8 @Mapper
10 public interface PayOrderExtensionCoreMapper extends BaseMapperX<PayOrderExtensionDO> { 9 public interface PayOrderExtensionCoreMapper extends BaseMapperX<PayOrderExtensionDO> {
11 10
  11 + default PayOrderExtensionDO selectByOrderExtensionNo(String orderExtensionNo) {
  12 + return selectOne("order_extension_no", orderExtensionNo);
  13 + }
  14 +
  15 + default int updateByIdAndStatus(Long id, Integer status, PayOrderExtensionDO update) {
  16 + return update(update, new QueryWrapper<PayOrderExtensionDO>()
  17 + .eq("id", id).eq("status", status));
  18 + }
  19 +
12 } 20 }
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/enums/PayErrorCodeCoreConstants.java
@@ -19,13 +19,13 @@ public interface PayErrorCodeCoreConstants { @@ -19,13 +19,13 @@ public interface PayErrorCodeCoreConstants {
19 ErrorCode PAY_CHANNEL_CLIENT_NOT_FOUND = new ErrorCode(1007001002, "支付渠道的客户端不存在"); 19 ErrorCode PAY_CHANNEL_CLIENT_NOT_FOUND = new ErrorCode(1007001002, "支付渠道的客户端不存在");
20 20
21 // ========== ORDER 模块 1-007-002-000 ========== 21 // ========== ORDER 模块 1-007-002-000 ==========
22 - ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(100401000, "支付订单不存在");  
23 - ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(100401001, "支付订单不处于待支付");  
24 - ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(100401002, "支付订单不处于已支付");  
25 - ErrorCode PAY_ORDER_ERROR_USER = new ErrorCode(100401003, "支付订单用户不正确");  
26 -  
27 - ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(100401050, "支付交易拓展单不存在");  
28 - ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(100401051, "支付交易拓展单不处于待支付");  
29 - ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_SUCCESS = new ErrorCode(100401052, "支付订单不处于已支付"); 22 + ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(1007002000, "支付订单不存在");
  23 + ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1007002001, "支付订单不处于待支付");
  24 + ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007002002, "支付订单不处于已支付");
  25 + ErrorCode PAY_ORDER_ERROR_USER = new ErrorCode(1007002003, "支付订单用户不正确");
  26 + // ========== ORDER 模块(拓展单) 1-007-003-000 ==========
  27 + ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在");
  28 + ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付");
  29 + ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007003002, "支付订单不处于已支付");
30 30
31 } 31 }
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java
@@ -39,4 +39,13 @@ public interface PayOrderCoreService { @@ -39,4 +39,13 @@ public interface PayOrderCoreService {
39 */ 39 */
40 PayOrderSubmitRespDTO submitPayOrder(@Valid PayOrderSubmitReqDTO reqDTO); 40 PayOrderSubmitRespDTO submitPayOrder(@Valid PayOrderSubmitReqDTO reqDTO);
41 41
  42 + /**
  43 + * 通知支付单成功
  44 + *
  45 + * @param channelId 渠道编号
  46 + * @param channelCode 渠道编码
  47 + * @param notifyData 通知数据
  48 + */
  49 + void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception;
  50 +
42 } 51 }
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java
@@ -23,6 +23,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -23,6 +23,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
23 import cn.iocoder.yudao.framework.pay.config.PayProperties; 23 import cn.iocoder.yudao.framework.pay.config.PayProperties;
24 import cn.iocoder.yudao.framework.pay.core.client.PayClient; 24 import cn.iocoder.yudao.framework.pay.core.client.PayClient;
25 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; 25 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
  26 +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
26 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 27 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
27 import lombok.extern.slf4j.Slf4j; 28 import lombok.extern.slf4j.Slf4j;
28 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
@@ -99,7 +100,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { @@ -99,7 +100,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
99 @Override 100 @Override
100 public PayOrderSubmitRespDTO submitPayOrder(PayOrderSubmitReqDTO reqDTO) { 101 public PayOrderSubmitRespDTO submitPayOrder(PayOrderSubmitReqDTO reqDTO) {
101 // 校验 App 102 // 校验 App
102 - PayAppDO app = payAppCoreService.validPayApp(reqDTO.getAppId()); 103 + payAppCoreService.validPayApp(reqDTO.getAppId());
103 // 校验支付渠道是否有效 104 // 校验支付渠道是否有效
104 PayChannelDO channel = payChannelCoreService.validPayChannel(reqDTO.getAppId(), reqDTO.getChannelCode()); 105 PayChannelDO channel = payChannelCoreService.validPayChannel(reqDTO.getAppId(), reqDTO.getChannelCode());
105 // 校验支付客户端是否正确初始化 106 // 校验支付客户端是否正确初始化
@@ -172,4 +173,61 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { @@ -172,4 +173,61 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
172 ; 173 ;
173 } 174 }
174 175
  176 + @Override
  177 + public void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception {
  178 + // TODO 芋艿,记录回调日志
  179 + log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData);
  180 +
  181 + // 校验支付渠道是否有效
  182 + PayChannelDO channel = payChannelCoreService.validPayChannel(channelId, channelCode);
  183 + // 校验支付客户端是否正确初始化
  184 + PayClient client = payClientFactory.getPayClient(channel.getId());
  185 + if (client == null) {
  186 + log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId());
  187 + throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND);
  188 + }
  189 + // 解析支付结果
  190 + PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData);
  191 +
  192 + // TODO 芋艿,先最严格的校验。即使调用方重复调用,实际哪个订单已经被重复回调的支付,也返回 false 。也没问题,因为实际已经回调成功了。
  193 + // 1.1 查询 PayOrderExtensionDO
  194 + PayOrderExtensionDO orderExtension = payOrderExtensionCoreMapper.selectByOrderExtensionNo(
  195 + notifyRespDTO.getOrderExtensionNo());
  196 + if (orderExtension == null) {
  197 + throw exception(PAY_ORDER_EXTENSION_NOT_FOUND);
  198 + }
  199 + if (!PayOrderStatusEnum.WAITING.getStatus().equals(orderExtension.getStatus())) { // 校验状态,必须是待支付
  200 + throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
  201 + }
  202 + // 1.2 更新 PayOrderExtensionDO
  203 + int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getOrderId(),
  204 + PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
  205 + .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData).build());
  206 + if (updateCounts == 0) { // 校验状态,必须是待支付
  207 + throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
  208 + }
  209 + log.info("[notifyPayOrder][支付拓展单({}) 更新为已支付]", orderExtension.getId());
  210 +
  211 + // 2.1 判断 PayOrderDO 是否处于待支付
  212 + PayOrderDO order = payOrderCoreMapper.selectById(orderExtension.getOrderId());
  213 + if (order == null) {
  214 + throw exception(PAY_ORDER_NOT_FOUND);
  215 + }
  216 + if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
  217 + throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING);
  218 + }
  219 + // 2.2 更新 PayOrderDO
  220 + updateCounts = payOrderCoreMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(),
  221 + PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus()).channelId(channelId).channelCode(channelCode)
  222 + .successTime(notifyRespDTO.getSuccessTime()).notifyTime(new Date())
  223 + .successExtensionId(orderExtension.getId()).build());
  224 + if (updateCounts == 0) { // 校验状态,必须是待支付
  225 + throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING);
  226 + }
  227 + log.info("[notifyPayOrder][支付订单({}) 更新为已支付]", order.getId());
  228 +
  229 + // 3. 插入支付通知记录
  230 +// payNotifyService.addPayTransactionNotifyTask(order, orderExtension);
  231 + }
  232 +
175 } 233 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClient.java
1 package cn.iocoder.yudao.framework.pay.core.client; 1 package cn.iocoder.yudao.framework.pay.core.client;
2 2
  3 +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
3 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 4 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
4 5
5 /** 6 /**
@@ -24,4 +25,13 @@ public interface PayClient { @@ -24,4 +25,13 @@ public interface PayClient {
24 */ 25 */
25 PayCommonResult<?> unifiedOrder(PayOrderUnifiedReqDTO reqDTO); 26 PayCommonResult<?> unifiedOrder(PayOrderUnifiedReqDTO reqDTO);
26 27
  28 + /**
  29 + * 解析支付单的通知结果
  30 + *
  31 + * @param data 通知结果
  32 + * @return 解析结果
  33 + * @throws Exception 解析失败,抛出异常
  34 + */
  35 + PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception;
  36 +
27 } 37 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayOrderNotifyRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.pay.core.client.dto;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import java.util.Date;
  8 +
  9 +/**
  10 + * 支付通知 Response DTO
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Data
  15 +@NoArgsConstructor
  16 +@AllArgsConstructor
  17 +public class PayOrderNotifyRespDTO {
  18 +
  19 + /**
  20 + * 支付订单号(支付模块的)
  21 + */
  22 + private String orderExtensionNo;
  23 + /**
  24 + * 支付渠道
  25 + */
  26 + private String channelOrderNo;
  27 + /**
  28 + * 支付渠道
  29 + */
  30 + private Date successTime;
  31 +
  32 + /**
  33 + * 通知的原始数据
  34 + *
  35 + * 主要用于持久化,方便后续修复数据,或者排错
  36 + */
  37 + private String data;
  38 +
  39 +}
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.java
@@ -12,6 +12,8 @@ import java.util.Map; @@ -12,6 +12,8 @@ import java.util.Map;
12 12
13 /** 13 /**
14 * 统一下单 Request DTO 14 * 统一下单 Request DTO
  15 + *
  16 + * @author 芋道源码
15 */ 17 */
16 @Data 18 @Data
17 public class PayOrderUnifiedReqDTO { 19 public class PayOrderUnifiedReqDTO {
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
2 2
3 import cn.hutool.core.bean.BeanUtil; 3 import cn.hutool.core.bean.BeanUtil;
4 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 4 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
  5 +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
5 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 6 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
6 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; 7 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
7 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; 8 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
@@ -65,4 +66,9 @@ public class AlipayQrPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt; @@ -65,4 +66,9 @@ public class AlipayQrPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt;
65 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); 66 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
66 } 67 }
67 68
  69 + @Override
  70 + public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
  71 + // TODO 芋艿:待完成
  72 + return null;
  73 + }
68 } 74 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
2 2
3 import cn.hutool.core.bean.BeanUtil; 3 import cn.hutool.core.bean.BeanUtil;
4 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 4 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
  5 +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
5 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 6 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
6 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; 7 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
7 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; 8 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
@@ -61,4 +62,9 @@ public class AlipayWapPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt; @@ -61,4 +62,9 @@ public class AlipayWapPayClient extends AbstractPayClient&lt;AlipayPayClientConfig&gt;
61 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); 62 return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
62 } 63 }
63 64
  65 + @Override
  66 + public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
  67 + // TODO 芋艿:待完成
  68 + return null;
  69 + }
64 } 70 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/wx/WXPubPayClient.java
@@ -2,14 +2,17 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.wx; @@ -2,14 +2,17 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.wx;
2 2
3 import cn.hutool.core.bean.BeanUtil; 3 import cn.hutool.core.bean.BeanUtil;
4 import cn.hutool.core.date.DateUtil; 4 import cn.hutool.core.date.DateUtil;
  5 +import cn.hutool.core.lang.Assert;
5 import cn.hutool.core.map.MapUtil; 6 import cn.hutool.core.map.MapUtil;
6 import cn.hutool.core.util.StrUtil; 7 import cn.hutool.core.util.StrUtil;
7 import cn.iocoder.yudao.framework.common.util.io.FileUtils; 8 import cn.iocoder.yudao.framework.common.util.io.FileUtils;
8 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; 9 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
9 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 10 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
  11 +import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
10 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; 12 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
11 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; 13 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
12 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; 14 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
  15 +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
13 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; 16 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
14 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; 17 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
15 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; 18 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
@@ -22,6 +25,8 @@ import com.github.binarywang.wxpay.service.WxPayService; @@ -22,6 +25,8 @@ import com.github.binarywang.wxpay.service.WxPayService;
22 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; 25 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
23 import lombok.extern.slf4j.Slf4j; 26 import lombok.extern.slf4j.Slf4j;
24 27
  28 +import java.util.Objects;
  29 +
25 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; 30 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
26 import static cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXCodeMapping.CODE_SUCCESS; 31 import static cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXCodeMapping.CODE_SUCCESS;
27 import static cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXCodeMapping.MESSAGE_SUCCESS; 32 import static cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXCodeMapping.MESSAGE_SUCCESS;
@@ -126,4 +131,13 @@ public class WXPubPayClient extends AbstractPayClient&lt;WXPayClientConfig&gt; { @@ -126,4 +131,13 @@ public class WXPubPayClient extends AbstractPayClient&lt;WXPayClientConfig&gt; {
126 return openid; 131 return openid;
127 } 132 }
128 133
  134 + @Override
  135 + public PayOrderNotifyRespDTO parseOrderNotify(String data) throws WxPayException {
  136 + WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data);
  137 + Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
  138 + // 转换结果
  139 + return new PayOrderNotifyRespDTO(notifyResult.getOutTradeNo(), notifyResult.getTransactionId(),
  140 + DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"), data);
  141 + }
  142 +
129 } 143 }