From 1931a3adfe7d621ec9abc8782db2cc6bd7608a25 Mon Sep 17 00:00:00 2001 From: "felord.cn" Date: Wed, 3 Feb 2021 22:46:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98V3?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=80=80=E6=AC=BE=E9=80=80=E6=AC=BE=E9=80=9A?= =?UTF-8?q?=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加退款通知事件 - 增加解密逻辑 --- .../payment/wechat/v3/WechatPayCallback.java | 56 ++++++++++- .../wechat/v3/model/RefundConsumeData.java | 95 +++++++++++++++++++ 2 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/RefundConsumeData.java diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java index a86bf33..df3024a 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayCallback.java @@ -18,10 +18,7 @@ package cn.felord.payment.wechat.v3; import cn.felord.payment.PayException; -import cn.felord.payment.wechat.v3.model.CallbackParams; -import cn.felord.payment.wechat.v3.model.CouponConsumeData; -import cn.felord.payment.wechat.v3.model.ResponseSignVerifyParams; -import cn.felord.payment.wechat.v3.model.TransactionConsumeData; +import cn.felord.payment.wechat.v3.model.*; import cn.felord.payment.wechat.v3.model.busifavor.BusiFavorReceiveConsumeData; import cn.felord.payment.wechat.v3.model.combine.CombineTransactionConsumeData; import cn.felord.payment.wechat.v3.model.discountcard.DiscountCardAcceptedConsumeData; @@ -272,6 +269,34 @@ public class WechatPayCallback { return Collections.singletonMap("code", "SUCCESS"); } + /** + * 退款结果通知API + *

+ * 退款状态改变后,微信会把相关退款结果发送给商户。 + * + * @param params the params + * @param consumeDataConsumer the consume data consumer + * @return map + */ + @SneakyThrows + public Map refundCallback(ResponseSignVerifyParams params, Consumer consumeDataConsumer) { + CallbackParams callbackParams = resolve(params); + String eventType = callbackParams.getEventType(); + + if (!Objects.equals(eventType, EventType.REFUND_CLOSED.event)|| + !Objects.equals(eventType,EventType.REFUND_ABNORMAL.event)|| + !Objects.equals(eventType,EventType.REFUND_SUCCESS.event)) { + log.error("wechat pay event type is not matched, callbackParams {}", callbackParams); + throw new PayException(" wechat pay event type is not matched"); + } + String data = this.decrypt(callbackParams); + RefundConsumeData consumeData = MAPPER.readValue(data, RefundConsumeData.class); + + consumeDataConsumer.accept(consumeData); + return Collections.singletonMap("code", "SUCCESS"); + } + + /** * Callback. * @@ -403,7 +428,28 @@ public class WechatPayCallback { * * @since 1.0.0.RELEASE */ - TRANSACTION("TRANSACTION.SUCCESS"); + TRANSACTION("TRANSACTION.SUCCESS"), + + /** + * 退款成功事件. + * + * @since 1.0.6.RELEASE + */ + REFUND_SUCCESS("REFUND.SUCCESS"), + + /** + * 退款异常事件. + * + * @since 1.0.6.RELEASE + */ + REFUND_ABNORMAL("REFUND.ABNORMAL"), + + /** + * 退款关闭事件. + * + * @since 1.0.6.RELEASE + */ + REFUND_CLOSED("REFUND.CLOSED"); /** * The Event. diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/RefundConsumeData.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/RefundConsumeData.java new file mode 100644 index 0000000..88dc249 --- /dev/null +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/model/RefundConsumeData.java @@ -0,0 +1,95 @@ +/* + * + * Copyright 2019-2020 felord.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * Website: + * https://felord.cn + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package cn.felord.payment.wechat.v3.model; + +import cn.felord.payment.wechat.enumeration.RefundStatus; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.OffsetDateTime; + +/** + * 微信支付退款结果通知解密 + * + * @author felord.cn + * @since 1.0.6.RELEASE + */ +@Data +public class RefundConsumeData { + /** + * 直连商户号 + */ + private String mchid; + /** + * 商户订单号 + */ + private String outTradeNo; + /** + * 微信订单号 + */ + private String transactionId; + /** + * 商户退款单号 + */ + private String outRefundNo; + /** + * 微信退款单号 + */ + private String refundId; + /** + * 退款状态 + */ + private RefundStatus refundStatus; + /** + * 退款成功时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private OffsetDateTime successTime; + /** + * 退款入账账户 + */ + private String userReceivedAccount; + + /** + * 微信支付退款金额信息 + * + * @author felord.cn + * @since 1.0.6.RELEASE + */ + @Data + public static class Amount { + /** + * 订单金额,单位为分 + */ + private Integer total; + /** + * 退款金额,单位为分 + */ + private Integer refund; + /** + * 用户实际支付金额,单位为分 + */ + + private Integer payerTotal; + /** + * 退款给用户的金额,单位为分,不包含所有优惠券金额 + */ + private Integer payerRefund; + } +}