mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	pay: 优化回调的逻辑
This commit is contained in:
		@@ -1,11 +1,11 @@
 | 
			
		||||
package cn.iocoder.yudao.framework.pay.core.client;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyDataDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedRespDTO;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -30,15 +30,6 @@ public interface PayClient {
 | 
			
		||||
     */
 | 
			
		||||
    PayOrderUnifiedRespDTO unifiedOrder(PayOrderUnifiedReqDTO reqDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 解析支付单的通知结果
 | 
			
		||||
     *
 | 
			
		||||
     * @param data 通知结果
 | 
			
		||||
     * @return 解析结果
 | 
			
		||||
     * @throws Exception 解析失败,抛出异常
 | 
			
		||||
     */
 | 
			
		||||
    PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调用支付渠道,进行退款
 | 
			
		||||
     * @param reqDTO  统一退款请求信息
 | 
			
		||||
@@ -47,32 +38,15 @@ public interface PayClient {
 | 
			
		||||
    PayRefundUnifiedRespDTO unifiedRefund(PayRefundUnifiedReqDTO reqDTO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 解析支付退款通知数据
 | 
			
		||||
     * @param notifyData  支付退款通知请求数据
 | 
			
		||||
     * @return 支付退款通知的Notify DTO
 | 
			
		||||
     */
 | 
			
		||||
    PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData);
 | 
			
		||||
 | 
			
		||||
    // TODO @芋艿:后续改成非 default,避免不知道去实现
 | 
			
		||||
    /**
 | 
			
		||||
     * 验证是否渠道通知
 | 
			
		||||
     * 解析回调数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param notifyData 通知数据
 | 
			
		||||
     * @return 默认是 true
 | 
			
		||||
     * @param rawNotify 通知内容
 | 
			
		||||
     * @return 回调对象
 | 
			
		||||
     *         1. {@link PayRefundNotifyRespDTO} 退款通知
 | 
			
		||||
     *         2. {@link PayOrderNotifyRespDTO} 支付通知
 | 
			
		||||
     */
 | 
			
		||||
    default boolean verifyNotifyData(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO @芋艿:后续改成非 default,避免不知道去实现
 | 
			
		||||
    /**
 | 
			
		||||
     * 判断是否为退款通知
 | 
			
		||||
     *
 | 
			
		||||
     * @param notifyData  通知数据
 | 
			
		||||
     * @return 默认是 false
 | 
			
		||||
     */
 | 
			
		||||
    default  boolean isRefundNotify(PayNotifyDataDTO notifyData){
 | 
			
		||||
        return false;
 | 
			
		||||
    default Object parseNotify(PayNotifyReqDTO rawNotify) {
 | 
			
		||||
        throw new UnsupportedOperationException("未实现 parseNotify 方法!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,11 +13,11 @@ import java.util.Map;
 | 
			
		||||
@Data
 | 
			
		||||
@ToString
 | 
			
		||||
@Builder
 | 
			
		||||
public class PayNotifyDataDTO {
 | 
			
		||||
public class PayNotifyReqDTO {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *  HTTP 回调接口的 request body
 | 
			
		||||
     * HTTP 回调接口的 request body
 | 
			
		||||
     */
 | 
			
		||||
    private String body;
 | 
			
		||||
 | 
			
		||||
@@ -35,15 +35,9 @@ public class PayOrderNotifyRespDTO {
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime successTime;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通知的原始数据
 | 
			
		||||
     *
 | 
			
		||||
     * 主要用于持久化,方便后续修复数据,或者排错
 | 
			
		||||
     */
 | 
			
		||||
    private String data;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * TODO @jason 结合其他的渠道定义成枚举,
 | 
			
		||||
     *
 | 
			
		||||
     * alipay
 | 
			
		||||
     * TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。
 | 
			
		||||
     * TRADE_SUCCESS, 交易支付成功
 | 
			
		||||
 
 | 
			
		||||
@@ -15,14 +15,13 @@ import java.time.LocalDateTime;
 | 
			
		||||
@Data
 | 
			
		||||
@ToString
 | 
			
		||||
@Builder
 | 
			
		||||
public class PayRefundNotifyDTO {
 | 
			
		||||
public class PayRefundNotifyRespDTO {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 支付渠道编号
 | 
			
		||||
     */
 | 
			
		||||
    private String channelOrderNo;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 交易订单号,根据规则生成
 | 
			
		||||
     * 调用支付渠道时,使用该字段作为对接的订单号。
 | 
			
		||||
@@ -46,18 +45,14 @@ public class PayRefundNotifyDTO {
 | 
			
		||||
     */
 | 
			
		||||
    private String reqNo;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 退款是否成功
 | 
			
		||||
     */
 | 
			
		||||
    private PayNotifyRefundStatusEnum status;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 退款成功时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime refundSuccessTime;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -12,6 +12,7 @@ import com.alipay.api.AlipayResponse;import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import javax.validation.Validation;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
import static cn.hutool.core.date.DatePattern.NORM_DATETIME_FORMATTER;
 | 
			
		||||
import static cn.hutool.core.date.DatePattern.NORM_DATETIME_MS_FORMATTER;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
 | 
			
		||||
@@ -129,7 +130,12 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen
 | 
			
		||||
 | 
			
		||||
    protected String formatTime(LocalDateTime time) {
 | 
			
		||||
        // "yyyy-MM-dd HH:mm:ss"
 | 
			
		||||
        return LocalDateTimeUtil.format(time, NORM_DATETIME_MS_FORMATTER);
 | 
			
		||||
        return LocalDateTimeUtil.format(time, NORM_DATETIME_FORMATTER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected LocalDateTime parseTime(String str) {
 | 
			
		||||
        // "yyyy-MM-dd HH:mm:ss"
 | 
			
		||||
        return LocalDateTimeUtil.parse(str, NORM_DATETIME_FORMATTER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyDataDTO;
 | 
			
		||||
import cn.hutool.http.HttpUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
 | 
			
		||||
@@ -20,7 +20,6 @@ import lombok.SneakyThrows;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
 | 
			
		||||
@@ -47,56 +46,6 @@ public abstract class AbstractAlipayClient extends AbstractPayClient<AlipayPayCl
 | 
			
		||||
        this.client = new DefaultAlipayClient(alipayConfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 从支付宝通知返回参数中解析 PayOrderNotifyRespDTO, 通知具体参数参考
 | 
			
		||||
     *  //https://opendocs.alipay.com/open/203/105286
 | 
			
		||||
     * @param data 通知结果
 | 
			
		||||
     * @return 解析结果 PayOrderNotifyRespDTO
 | 
			
		||||
     * @throws Exception  解析失败,抛出异常
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public  PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception {
 | 
			
		||||
        Map<String, String> params = strToMap(data.getBody());
 | 
			
		||||
 | 
			
		||||
        return  PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no"))
 | 
			
		||||
                .channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id"))
 | 
			
		||||
                .tradeStatus(params.get("trade_status"))
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss"))
 | 
			
		||||
                .data(data.getBody()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        Map<String, String> params = strToMap(notifyData.getBody());
 | 
			
		||||
        PayRefundNotifyDTO notifyDTO = PayRefundNotifyDTO.builder().channelOrderNo(params.get("trade_no"))
 | 
			
		||||
                .tradeNo(params.get("out_trade_no"))
 | 
			
		||||
                .reqNo(params.get("out_biz_no"))
 | 
			
		||||
                .status(PayNotifyRefundStatusEnum.SUCCESS)
 | 
			
		||||
                .refundSuccessTime(LocalDateTimeUtil.parse(params.get("gmt_refund"), "yyyy-MM-dd HH:mm:ss"))
 | 
			
		||||
                .build();
 | 
			
		||||
        return notifyDTO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isRefundNotify(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        if (notifyData.getParams().containsKey("refund_fee")) {
 | 
			
		||||
            return true;
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean verifyNotifyData(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        boolean verifyResult = false;
 | 
			
		||||
        try {
 | 
			
		||||
            verifyResult =  AlipaySignature.rsaCheckV1(notifyData.getParams(), config.getAlipayPublicKey(), StandardCharsets.UTF_8.name(), "RSA2");
 | 
			
		||||
        } catch (AlipayApiException e) {
 | 
			
		||||
            log.error("[AlipayClient verifyNotifyData][(notify param is :{}) 验证失败]", toJsonString(notifyData.getParams()), e);
 | 
			
		||||
        }
 | 
			
		||||
        return verifyResult;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 支付宝统一的退款接口 alipay.trade.refund
 | 
			
		||||
     * @param reqDTO 退款请求 request DTO
 | 
			
		||||
@@ -109,7 +58,7 @@ public abstract class AbstractAlipayClient extends AbstractPayClient<AlipayPayCl
 | 
			
		||||
        model.setOutTradeNo(reqDTO.getPayTradeNo());
 | 
			
		||||
 | 
			
		||||
        model.setOutRequestNo(reqDTO.getMerchantRefundId());
 | 
			
		||||
        model.setRefundAmount(formatAmount(reqDTO.getAmount() / 2).toString());
 | 
			
		||||
        model.setRefundAmount(formatAmount(reqDTO.getAmount()).toString());
 | 
			
		||||
        model.setRefundReason(reqDTO.getReason());
 | 
			
		||||
 | 
			
		||||
        AlipayTradeRefundRequest refundRequest = new AlipayTradeRefundRequest();
 | 
			
		||||
@@ -138,25 +87,29 @@ public abstract class AbstractAlipayClient extends AbstractPayClient<AlipayPayCl
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 支付宝统一回调参数  str 转 map
 | 
			
		||||
     *
 | 
			
		||||
     * @param s 支付宝支付通知回调参数
 | 
			
		||||
     * @return map 支付宝集合
 | 
			
		||||
     */
 | 
			
		||||
    public static Map<String, String> strToMap(String s) {
 | 
			
		||||
        // TODO @zxy:这个可以使用 hutool 的 HttpUtil decodeParams 方法么?
 | 
			
		||||
        Map<String, String> stringStringMap = new HashMap<>();
 | 
			
		||||
        // 调整时间格式
 | 
			
		||||
        String s3 = s.replaceAll("%3A", ":");
 | 
			
		||||
        // 获取 map
 | 
			
		||||
        String s4 = s3.replace("+", " ");
 | 
			
		||||
        String[] split = s4.split("&");
 | 
			
		||||
        for (String s1 : split) {
 | 
			
		||||
            String[] split1 = s1.split("=");
 | 
			
		||||
            stringStringMap.put(split1[0], split1[1]);
 | 
			
		||||
    @Override
 | 
			
		||||
    @SneakyThrows
 | 
			
		||||
    public Object parseNotify(PayNotifyReqDTO rawNotify) {
 | 
			
		||||
        // 1. 校验回调数据
 | 
			
		||||
        String body = rawNotify.getBody();
 | 
			
		||||
        Map<String, String> params = rawNotify.getParams();
 | 
			
		||||
        Map<String, String> bodyObj = HttpUtil.decodeParamMap(body, StandardCharsets.UTF_8);
 | 
			
		||||
        AlipaySignature.rsaCheckV1(bodyObj, config.getAlipayPublicKey(),
 | 
			
		||||
                StandardCharsets.UTF_8.name(), "RSA2");
 | 
			
		||||
 | 
			
		||||
        // 2.1 退款的情况
 | 
			
		||||
        if (bodyObj.containsKey("refund_fee")) {
 | 
			
		||||
            return PayRefundNotifyRespDTO.builder().channelOrderNo(bodyObj.get("trade_no"))
 | 
			
		||||
                    .tradeNo(bodyObj.get("out_trade_no")).reqNo(bodyObj.get("out_biz_no"))
 | 
			
		||||
                    .status(PayNotifyRefundStatusEnum.SUCCESS)
 | 
			
		||||
                    .refundSuccessTime(parseTime(params.get("gmt_refund")))
 | 
			
		||||
                    .build();
 | 
			
		||||
        }
 | 
			
		||||
        return stringStringMap;
 | 
			
		||||
        // 2.2 支付的情况
 | 
			
		||||
        return PayOrderNotifyRespDTO.builder().orderExtensionNo(bodyObj.get("out_trade_no"))
 | 
			
		||||
                .channelOrderNo(bodyObj.get("trade_no")).channelUserId(bodyObj.get("seller_id"))
 | 
			
		||||
                .tradeStatus(bodyObj.get("trade_status")).successTime(parseTime(params.get("notify_time")))
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,9 @@ import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.hutool.core.map.MapUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.io.FileUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyDataDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
 | 
			
		||||
@@ -145,8 +145,8 @@ public class WXLitePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
     * @return 支付回调对象
 | 
			
		||||
     * @throws WxPayException 微信异常类
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
//    @Override
 | 
			
		||||
    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        log.info("[parseOrderNotify][微信支付回调data数据:{}]", data.getBody());
 | 
			
		||||
        // 微信支付 v2 回调结果处理
 | 
			
		||||
        switch (config.getApiVersion()) {
 | 
			
		||||
@@ -159,7 +159,7 @@ public class WXLitePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = client.parseOrderNotifyV3Result(data.getBody(), null);
 | 
			
		||||
        WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult();
 | 
			
		||||
        // 转换结果
 | 
			
		||||
@@ -172,11 +172,10 @@ public class WXLitePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
                .channelOrderNo(result.getTransactionId())
 | 
			
		||||
                .channelUserId(result.getPayer().getOpenid())
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(result.getSuccessTime(), "yyyy-MM-dd'T'HH:mm:ssXXX"))
 | 
			
		||||
                .data(data.getBody())
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody());
 | 
			
		||||
        Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
 | 
			
		||||
        // 转换结果
 | 
			
		||||
@@ -186,18 +185,10 @@ public class WXLitePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
                .channelOrderNo(notifyResult.getTransactionId())
 | 
			
		||||
                .channelUserId(notifyResult.getOpenid())
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
 | 
			
		||||
                .data(data.getBody())
 | 
			
		||||
                .build();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        //TODO 需要实现
 | 
			
		||||
        throw new UnsupportedOperationException("需要实现");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected PayRefundUnifiedRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO)  {
 | 
			
		||||
        //TODO 需要实现
 | 
			
		||||
 
 | 
			
		||||
@@ -6,9 +6,9 @@ import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.io.FileUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyDataDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
 | 
			
		||||
@@ -130,8 +130,8 @@ public class WXNativePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
     * @return 支付回调对象
 | 
			
		||||
     * @throws WxPayException 微信异常类
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
//    @Override
 | 
			
		||||
    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        log.info("微信支付回调data数据:{}", data.getBody());
 | 
			
		||||
        // 微信支付 v2 回调结果处理
 | 
			
		||||
        switch (config.getApiVersion()) {
 | 
			
		||||
@@ -144,7 +144,7 @@ public class WXNativePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = client.parseOrderNotifyV3Result(data.getBody(), null);
 | 
			
		||||
        WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult();
 | 
			
		||||
        // 转换结果
 | 
			
		||||
@@ -155,11 +155,10 @@ public class WXNativePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
                .orderExtensionNo(result.getOutTradeNo())
 | 
			
		||||
                .channelOrderNo(result.getTradeState())
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(result.getSuccessTime(), "yyyy-MM-dd'T'HH:mm:ssXXX"))
 | 
			
		||||
                .data(data.getBody())
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody());
 | 
			
		||||
        Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
 | 
			
		||||
        // 转换结果
 | 
			
		||||
@@ -169,18 +168,10 @@ public class WXNativePayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
                .channelOrderNo(notifyResult.getTransactionId())
 | 
			
		||||
                .channelUserId(notifyResult.getOpenid())
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
 | 
			
		||||
                .data(data.getBody())
 | 
			
		||||
                .build();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        // TODO 需要实现
 | 
			
		||||
        throw new UnsupportedOperationException("需要实现");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected PayRefundUnifiedRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO)  {
 | 
			
		||||
        // TODO 需要实现
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,8 @@ import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.hutool.core.map.MapUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.io.FileUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyDataDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayNotifyReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayRefundNotifyDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
 | 
			
		||||
@@ -142,8 +141,8 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
     * @return 支付回调对象
 | 
			
		||||
     * @throws WxPayException 微信异常类
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
//    @Override
 | 
			
		||||
    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        log.info("[parseOrderNotify][微信支付回调data数据: {}]", data.getBody());
 | 
			
		||||
        // 微信支付 v2 回调结果处理
 | 
			
		||||
        switch (config.getApiVersion()) {
 | 
			
		||||
@@ -156,7 +155,7 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = client.parseOrderNotifyV3Result(data.getBody(), null);
 | 
			
		||||
        WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult();
 | 
			
		||||
        // 转换结果
 | 
			
		||||
@@ -167,11 +166,10 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
                .orderExtensionNo(result.getOutTradeNo())
 | 
			
		||||
                .channelOrderNo(result.getTradeState())
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(result.getSuccessTime(), "yyyy-MM-dd'T'HH:mm:ssXXX"))
 | 
			
		||||
                .data(data.getBody())
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyDataDTO data) throws WxPayException {
 | 
			
		||||
    private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyReqDTO data) throws WxPayException {
 | 
			
		||||
        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody());
 | 
			
		||||
        Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
 | 
			
		||||
        // 转换结果
 | 
			
		||||
@@ -181,17 +179,10 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
 | 
			
		||||
                .channelOrderNo(notifyResult.getTransactionId())
 | 
			
		||||
                .channelUserId(notifyResult.getOpenid())
 | 
			
		||||
                .successTime(LocalDateTimeUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
 | 
			
		||||
                .data(data.getBody())
 | 
			
		||||
                .build();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) {
 | 
			
		||||
        // TODO 需要实现
 | 
			
		||||
        throw new UnsupportedOperationException("需要实现");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected PayRefundUnifiedRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
 | 
			
		||||
        // TODO 需要实现
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ package cn.iocoder.yudao.framework.pay.core.enums;
 | 
			
		||||
 * @author  jason
 | 
			
		||||
 */
 | 
			
		||||
public enum PayNotifyRefundStatusEnum {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 支付宝 中 全额退款 trade_status=TRADE_CLOSED, 部分退款 trade_status=TRADE_SUCCESS
 | 
			
		||||
     * 退款成功
 | 
			
		||||
@@ -17,4 +18,5 @@ public enum PayNotifyRefundStatusEnum {
 | 
			
		||||
     * 退款异常
 | 
			
		||||
     */
 | 
			
		||||
    ABNORMAL;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user