diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java index 69bc18d0..274f7ddf 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java @@ -1,6 +1,6 @@ package com.ghy.web.controller.pay; -import com.ghy.common.adapay.callback.Event; +import com.ghy.common.adapay.model.Event; import com.ghy.common.core.controller.BaseController; import com.ghy.common.utils.spring.SpringUtils; import com.ghy.payment.service.CallBackService; @@ -19,8 +19,6 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class AdapayCallbackController extends BaseController { - private CallBackService callBackService; - @PostMapping("/adapay/callback") public String callback(Event event) { logger.info(" 收单返回消息event" + event); @@ -45,15 +43,19 @@ public class AdapayCallbackController extends BaseController { switch (type) { case "payment.succeeded": case "payment.failed": - beanName = "payCallBackService"; + beanName = "payCallbackService"; + break; + case "payment_reverse.succeeded": + case "payment_reverse.failed": + beanName = "payReverseCallbackService"; break; case "payment.close.succeeded": case "payment.close.failed": - beanName = "refundCallBackService"; + beanName = "refundCallbackService"; break; case "cash.succeeded": case "cash.failed": - beanName = "drawCashCallBackService"; + beanName = "drawCashCallbackService"; break; default: logger.warn("UNKNOWN EVENT TYPE [{}]", type); @@ -61,7 +63,7 @@ public class AdapayCallbackController extends BaseController { } logger.info("handler bean is {} ", beanName); - callBackService = SpringUtils.getBean(beanName); + CallBackService callBackService = SpringUtils.getBean(beanName); callBackService.onCallback(event); return "OK"; } diff --git a/ghy-admin/src/main/java/com/ghy/web/core/adapay/DrawCashCallback.java b/ghy-admin/src/main/java/com/ghy/web/core/adapay/DrawCashCallback.java deleted file mode 100644 index a4fd984e..00000000 --- a/ghy-admin/src/main/java/com/ghy/web/core/adapay/DrawCashCallback.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ghy.web.core.adapay; - -import com.ghy.common.adapay.callback.IDrawCashCallback; -import com.ghy.common.adapay.model.DrawCashReply; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * 处理提现结果 - * - * @author HH 2022/5/27 - */ -@Component -public class DrawCashCallback implements IDrawCashCallback { - - private static final Logger logger = LoggerFactory.getLogger(DrawCashCallback.class); - - @Override - public void onCallback(DrawCashReply reply) { - logger.info("提现结果:{}", reply); - } -} diff --git a/ghy-admin/src/main/java/com/ghy/web/core/adapay/PayCallback.java b/ghy-admin/src/main/java/com/ghy/web/core/adapay/PayCallback.java deleted file mode 100644 index 6207a591..00000000 --- a/ghy-admin/src/main/java/com/ghy/web/core/adapay/PayCallback.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.ghy.web.core.adapay; - -import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.callback.IPayCallback; -import com.ghy.common.adapay.model.AdapayStatusEnum; -import com.ghy.common.adapay.model.PayReply; -import com.ghy.common.adapay.model.PaymentDTO; -import com.ghy.payment.domain.FinancialMaster; -import com.ghy.payment.service.FinancialMasterService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * 处理支付结果 - * - * @author HH 2022/5/27 - */ -@Component -public class PayCallback implements IPayCallback { - - private static final Logger logger = LoggerFactory.getLogger(PayCallback.class); - - @Resource - FinancialMasterService financialMasterService; - - @Override - public void onCallback(PayReply reply) { - // 更新交易记录 - PaymentDTO payment = new PaymentDTO(); - payment.setId(reply.getId()); - payment.setStatus(reply.getStatus()); - payment.setPayTime(reply.getPayTime()); - financialMasterService.updatePayment(payment); - - if (AdapayStatusEnum.succeeded.code.equals(reply.getStatus())) { - // 修改主财务单状态 - financialMasterService.paySucceeded(reply.getOrderNo(), reply.getPayChannel()); - } else { - logger.warn("支付失败 : {}", reply); - } - } - - @Override - public void onResponse(JSONObject response) { - // 保存一条支付记录 - PaymentDTO payment = response.toJavaObject(PaymentDTO.class); - payment.setStatus("pending"); - financialMasterService.insertPayment(payment); - - if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { - FinancialMaster update = new FinancialMaster(); - update.setOrderMasterCode(response.getString("order_no")); - update.setPaymentId(response.getString("id")); - financialMasterService.updateFinancialMaster(update); - } else { - logger.warn("请求支付失败 : {}", response.toJSONString()); - } - } -} \ No newline at end of file diff --git a/ghy-admin/src/main/java/com/ghy/web/core/adapay/RefundCallback.java b/ghy-admin/src/main/java/com/ghy/web/core/adapay/RefundCallback.java deleted file mode 100644 index 1e88dd40..00000000 --- a/ghy-admin/src/main/java/com/ghy/web/core/adapay/RefundCallback.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ghy.web.core.adapay; - -import com.ghy.common.adapay.callback.IRefundCallback; -import com.ghy.common.adapay.model.RefundReply; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * 处理退款结果 - * - * @author HH 2022/5/27 - */ -@Component -public class RefundCallback implements IRefundCallback { - - private static final Logger logger = LoggerFactory.getLogger(RefundCallback.class); - - @Override - public void onCallback(RefundReply reply) { - logger.info("退款结果:{}", reply); - } -} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/IDrawCashCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IDrawCashCallback.java deleted file mode 100644 index ba9e04b2..00000000 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/IDrawCashCallback.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ghy.common.adapay.callback; - -import com.ghy.common.adapay.model.DrawCashReply; - -/** - * 处理提现结果的接口 - * - * @author HH 2022/4/1 - */ -public interface IDrawCashCallback { - - void onCallback(DrawCashReply reply); - -} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/IPayCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IPayCallback.java deleted file mode 100644 index 7ef8091e..00000000 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/IPayCallback.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ghy.common.adapay.callback; - -import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.model.PayReply; - -/** - * 处理支付结果的回调接口 - * - * @author HH 2022/3/25 - */ -public interface IPayCallback { - - void onCallback(PayReply reply); - - void onResponse(JSONObject response); -} \ No newline at end of file diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/IRefundCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IRefundCallback.java deleted file mode 100644 index a8e1cb58..00000000 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/IRefundCallback.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.ghy.common.adapay.callback; - -import com.ghy.common.adapay.model.RefundReply; - -/** - * 处理退款结果的回调接口 - * - * @author HH 2022/3/29 - */ -public interface IRefundCallback { - - void onCallback(RefundReply reply); -} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashReplyMapping.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashReplyMapping.java deleted file mode 100644 index 18bf0896..00000000 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashReplyMapping.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.ghy.common.adapay.callback.mapping; - -import com.alibaba.fastjson.JSON; -import com.ghy.common.adapay.callback.IDrawCashCallback; -import com.ghy.common.adapay.callback.Event; -import com.ghy.common.adapay.model.DrawCashReply; -import org.springframework.util.Assert; - -import java.util.concurrent.ConcurrentHashMap; - -/** - * 提现结果匹配 - * - * @author HH 2022/4/1 - */ -public class DrawCashReplyMapping { - - /** - * 临时保存支付结果 - * key: orderNo - * value: 处理支付结果的回调接口 - */ - private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); - - public static void putReply(Event event, IDrawCashCallback callback) { - String data = event.getData(); - DrawCashReply reply = JSON.parseObject(data, DrawCashReply.class); - Assert.hasText(reply.getOrderNo(), "orderNo is blank !!!"); - PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo()); - if (callback != null) { - callback.onCallback(reply); - } - } - - public static void putCallback(String orderNo, IDrawCashCallback callback) { - Assert.hasText(orderNo, "orderNo is blank !!!"); - Assert.notNull(callback, "PayCallback is null !!!"); - PAY_RESULT_CALLBACK_MAP.put(orderNo, callback); - } -} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/PayReplyMapping.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/PayReplyMapping.java deleted file mode 100644 index bfcc4c9f..00000000 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/PayReplyMapping.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ghy.common.adapay.callback.mapping; - -import com.alibaba.fastjson.JSON; -import com.ghy.common.adapay.callback.Event; -import com.ghy.common.adapay.callback.IPayCallback; -import com.ghy.common.adapay.model.PayReply; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.Assert; - -import java.util.concurrent.ConcurrentHashMap; - -/** - * 支付结果匹配 - * - * @author HH 2022/3/25 - */ -public class PayReplyMapping { - - protected static final Logger logger = LoggerFactory.getLogger(PayReplyMapping.class); - - /** - * 临时保存支付结果 - * key: orderNo - * value: 处理支付结果的回调接口 - */ - private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); - - public static void putReply(Event event, IPayCallback callback) { - String data = event.getData(); - PayReply payment = JSON.parseObject(data, PayReply.class); - Assert.hasText(payment.getOrderNo(), "orderNo is blank !!!"); - payment.setPayTime(event.getCreatedTime()); - PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo()); - if (callback != null) { - callback.onCallback(payment); - } else { - logger.warn("PayCallback don't exist! {}", payment); - } - } - - public static void putCallback(String orderNo, IPayCallback callback) { - Assert.hasText(orderNo, "orderNo is blank !!!"); - Assert.notNull(callback, "PayCallback is null !!!"); - PAY_RESULT_CALLBACK_MAP.put(orderNo, callback); - } -} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/RefundReplyMapping.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/RefundReplyMapping.java deleted file mode 100644 index 86d80dbd..00000000 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/RefundReplyMapping.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.ghy.common.adapay.callback.mapping; - -import com.alibaba.fastjson.JSON; -import com.ghy.common.adapay.callback.Event; -import com.ghy.common.adapay.callback.IRefundCallback; -import com.ghy.common.adapay.model.RefundReply; -import org.springframework.util.Assert; - -import java.util.concurrent.ConcurrentHashMap; - -/** - * 退款结果匹配 - * - * @author HH 2022/3/29 - */ -public class RefundReplyMapping { - - /** - * 临时保存退款结果 - * key: orderNo - * value: 处理支付结果的回调接口 - */ - private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); - - public static void putReply(Event event, IRefundCallback refundCallback) { - String data = event.getData(); - RefundReply payment = JSON.parseObject(data, RefundReply.class); - Assert.hasText(payment.getPaymentId(), "paymentId is blank !!!"); - IRefundCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getPaymentId()); - if (callback != null) { - callback.onCallback(payment); - } - } - - public static void putCallback(String paymentId, IRefundCallback callback) { - Assert.hasText(paymentId, "paymentId is blank !!!"); - Assert.notNull(callback, "RefundCallback is null !!!"); - PAY_RESULT_CALLBACK_MAP.put(paymentId, callback); - } -} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/Event.java b/ghy-common/src/main/java/com/ghy/common/adapay/model/Event.java similarity index 95% rename from ghy-common/src/main/java/com/ghy/common/adapay/callback/Event.java rename to ghy-common/src/main/java/com/ghy/common/adapay/model/Event.java index eb065525..5e8e851d 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/Event.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/model/Event.java @@ -1,4 +1,4 @@ -package com.ghy.common.adapay.callback; +package com.ghy.common.adapay.model; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/PaymentMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/PaymentMapper.java index 54e4de3c..96944f80 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/mapper/PaymentMapper.java +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/PaymentMapper.java @@ -1,5 +1,6 @@ package com.ghy.payment.mapper; +import com.ghy.common.adapay.model.PaymentDTO; import com.huifu.adapay.model.Payment; /** @@ -12,4 +13,6 @@ public interface PaymentMapper { int insertPayment(Payment payment); int updatePayment(Payment payment); + + PaymentDTO selectById(String id); } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java index 0991ca6b..445aae6c 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java @@ -3,13 +3,11 @@ package com.ghy.payment.service; import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.AdapayConfig; import com.ghy.common.adapay.AdapayProperties; -import com.ghy.common.adapay.callback.IDrawCashCallback; -import com.ghy.common.adapay.callback.IPayCallback; -import com.ghy.common.adapay.callback.IRefundCallback; -import com.ghy.common.adapay.callback.mapping.DrawCashReplyMapping; -import com.ghy.common.adapay.callback.mapping.RefundReplyMapping; import com.ghy.common.adapay.model.*; -import com.ghy.payment.service.impl.PayCallBackServiceImpl; +import com.ghy.payment.service.impl.DrawCashCallbackService; +import com.ghy.payment.service.impl.PayCallbackService; +import com.ghy.payment.service.impl.PayReverseCallbackService; +import com.ghy.payment.service.impl.RefundCallbackService; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.*; import org.apache.commons.lang3.StringUtils; @@ -33,13 +31,13 @@ public class AdapayService { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Resource - private IPayCallback payCallback; + private PayCallbackService payCallBackService; @Resource - private PayCallBackServiceImpl payCallBackService; + private RefundCallbackService refundCallbackService; @Resource - private IDrawCashCallback drawCashCallback; + private DrawCashCallbackService drawCashCallbackService; @Resource - private IRefundCallback refundCallback; + private PayReverseCallbackService payReverseCallbackService; @Resource private AdapayProperties adapayProperties; @@ -237,8 +235,9 @@ public class AdapayService { cashParam.put("notify_url", adapayProperties.getNotifyUrl()); cashParam.put("remark", remark); cashParam.put("fee_mode", feeMode); - DrawCashReplyMapping.putCallback(orderNo, drawCashCallback); - return (JSONObject) Drawcash.create(cashParam, deptId.toString()); + JSONObject response = (JSONObject) Drawcash.create(cashParam, deptId.toString()); + drawCashCallbackService.onResponse(response); + return response; } /** @@ -298,7 +297,7 @@ public class AdapayService { } /** - * 发起退款 + * 发起退款(用于[延迟分账]或者[延迟分账且确认支付后]的支付单) * 当您的业务需要发起退款时,可通过 Adapay 系统提供的创建 Refund对象 方法创建一个退款对象,资金会原路退回用户的支付宝或微信中。 * 支持一次全额或多次部分退款,退款次数最多不超过10次。多次部分退款时,当前退款金额 + 已退款金额不能大于原支付金额。 * 对于每次撤销交易,Adapay 都会通过 异步消息通知 告知结果。 @@ -319,8 +318,9 @@ public class AdapayService { JSONObject refundParams = new JSONObject(); refundParams.put("refund_amt", refundAmt); refundParams.put("refund_order_no", refundOrderNo); - RefundReplyMapping.putCallback(paymentId, refundCallback); - return (JSONObject) Refund.create(paymentId, refundParams, deptId.toString()); + JSONObject response = (JSONObject) Refund.create(paymentId, refundParams, deptId.toString()); + refundCallbackService.onResponse(response); + return response; } /** @@ -362,4 +362,29 @@ public class AdapayService { return (JSONObject) Member.query(memberParams, deptId.toString()); } + /** + * 支付撤销 + * 支付撤销对象适用于[延时分账]的场景。只有已支付完成且为延时分账的Payment对象,在没有创建支付确认对象成功之前,可以调用创建支付撤销对象。 + * 用来撤销支付,资金会原路退回用户的支付宝或微信中。 支持一次全额或多次部分撤销,撤销次数最多不超过10次。 + * 多次部分撤销时,当前撤销金额 + 已撤销金额 + 已确认金额不能大于原支付金额。 + * 对于每次撤销交易,Adapay 都会通过 异步消息通知 告知结果。 + * https://docs.adapay.tech/api/trade.html#payment-reverse-object + * + * @param deptId [必填]商户ID + * @param paymentId [必填]Adapay生成的支付对象id + * @param reverseAmt [必填]撤销金额,必须大于0,保留两位小数点,如0.10、100.05等。撤销金额必须小于等于支付金额 - 已确认金额 - 已撤销(撤销成功+撤销中)金额。 + * @return 创建支付撤销对象同步返回成功,表示 Adapay 受理成功,撤销结果以异步通知为准 + */ + public JSONObject payReverse(@NotNull Long deptId, @NotNull String paymentId, @NotNull String reverseAmt) throws BaseAdaPayException { + JSONObject reverseParams = new JSONObject(); + reverseParams.put("app_id", AdapayConfig.getAppId(deptId)); + reverseParams.put("payment_id", paymentId); + reverseParams.put("reverse_amt", reverseAmt); + reverseParams.put("notify_url", adapayProperties.getNotifyUrl()); + reverseParams.put("order_no", "PAYMENT_REVERSE" + System.currentTimeMillis()); + JSONObject response = (JSONObject) PaymentReverse.create(reverseParams); + payReverseCallbackService.onResponse(response); + return response; + } + } \ No newline at end of file diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/CallBackService.java b/ghy-payment/src/main/java/com/ghy/payment/service/CallBackService.java index c4fa79b5..0837957c 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/CallBackService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/CallBackService.java @@ -1,16 +1,10 @@ package com.ghy.payment.service; import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.callback.Event; - -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import com.ghy.common.adapay.model.Event; public interface CallBackService { - public final static ConcurrentMap> resultCallBackMap = new ConcurrentHashMap<>(1024); - /** * @param event 回调 */ diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java index 969f75ef..db2e00f7 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java @@ -76,4 +76,11 @@ public interface FinancialMasterService { * @param payment 支付对象 */ int updatePayment(PaymentDTO payment); + + /** + * 用交易ID查询交易记录 + * + * @param id 交易ID + */ + PaymentDTO selectPaymentById(String id); } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallBackServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallBackServiceImpl.java deleted file mode 100644 index 1218a11b..00000000 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallBackServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ghy.payment.service.impl; - -import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.callback.Event; -import com.ghy.payment.service.CallBackService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - - -@Service("drawCashCallBackService") -public class DrawCashCallBackServiceImpl implements CallBackService { - - private static Logger logger = LoggerFactory.getLogger(DrawCashCallBackServiceImpl.class); - - private final static List drawCashList = new ArrayList<>(1024); - - /** - * 临时保存支付结果 - * key: orderNo - * value: 处理支付结果的回调接口 - */ - - @Override - public void onCallback(Event event) { - logger.info("draw callback is {}", event.toString()); - } - - @Override - public void onResponse(JSONObject response) { - logger.info("draw response is {}", response.toString()); - } - -} diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallbackService.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallbackService.java new file mode 100644 index 00000000..e9df8896 --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallbackService.java @@ -0,0 +1,30 @@ +package com.ghy.payment.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.ghy.common.adapay.model.Event; +import com.ghy.payment.service.CallBackService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 提现回调 + * + * @author HH 2022/5/30 + */ +@Service("drawCashCallbackService") +public class DrawCashCallbackService implements CallBackService { + + private static final Logger logger = LoggerFactory.getLogger(DrawCashCallbackService.class); + + @Override + public void onCallback(Event event) { + logger.info("提现 callback: {}", event.toString()); + } + + @Override + public void onResponse(JSONObject response) { + logger.info("提现 response: {}", response.toString()); + } + +} diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java index 7b30f0c7..28117449 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java @@ -76,7 +76,7 @@ public class FinancialMasterServiceImpl implements FinancialMasterService { public void paySucceeded(String orderNo, String payChannel) { try { financialMasterMapper.paySucceeded(orderNo, PayTypeEnum.valueOf(payChannel.toUpperCase()).getCode()); - }catch (IllegalArgumentException e){ + } catch (IllegalArgumentException e) { logger.warn("OrderNo[{}] Unknown payChannel [{}]!", orderNo, payChannel); } } @@ -103,4 +103,9 @@ public class FinancialMasterServiceImpl implements FinancialMasterService { return paymentMapper.updatePayment(payment); } + @Override + public PaymentDTO selectPaymentById(String id) { + return paymentMapper.selectById(id); + } + } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallBackServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallbackService.java similarity index 71% rename from ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallBackServiceImpl.java rename to ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallbackService.java index e32c334e..64f2f62f 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallBackServiceImpl.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallbackService.java @@ -2,7 +2,7 @@ package com.ghy.payment.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.callback.Event; +import com.ghy.common.adapay.model.Event; import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.PayReply; import com.ghy.common.adapay.model.PaymentDTO; @@ -15,41 +15,54 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; -@Service("payCallBackService") -public class PayCallBackServiceImpl implements CallBackService { +/** + * 支付回调 + * + * @author HH 2022/5/31 + */ +@Service("payCallbackService") +public class PayCallbackService implements CallBackService { - private static Logger logger = LoggerFactory.getLogger(PayCallBackServiceImpl.class); + private static final Logger logger = LoggerFactory.getLogger(PayCallbackService.class); - private final static List payList = new ArrayList<>(1024); + // 用HashSet检索效率高 + private final static HashSet orderNoSet = new HashSet<>(1024); @Resource FinancialMasterService financialMasterService; @Override public void onCallback(Event event) { + logger.debug("pay callback is {}", event); String data = event.getData(); PayReply payment = JSON.parseObject(data, PayReply.class); Assert.hasText(payment.getOrderNo(), "orderNo is blank !!!"); // 校验是否是本系统发出去的回调请求 - if(payList.contains(payment.getOrderNo())){ + boolean ours = orderNoSet.remove(payment.getOrderNo()); + if (!ours) { + //如果内存里没有 就从数据库里找这条记录 + PaymentDTO dto = financialMasterService.selectPaymentById(payment.getId()); + ours = dto != null; + } + if (ours) { // 更新交易记录 PaymentDTO param = new PaymentDTO(); param.setId(payment.getId()); param.setStatus(payment.getStatus()); param.setPayTime(payment.getPayTime()); financialMasterService.updatePayment(param); - + if (AdapayStatusEnum.succeeded.code.equals(payment.getStatus())) { // 修改主财务单状态 financialMasterService.paySucceeded(payment.getOrderNo(), payment.getPayChannel()); } else { logger.warn("支付失败 : {}", payment); } + } else { + logger.warn("系统中不存在这条交易记录: {}", event); } - logger.info("pay callback is {}", event.toString()); } @Override @@ -67,10 +80,8 @@ public class PayCallBackServiceImpl implements CallBackService { } else { logger.warn("请求支付失败 : {}", response.toJSONString()); } - // 将记录保存到临时会话中 - payList.add(response.getString("order_no")); - resultCallBackMap.put("pay", payList); + orderNoSet.add(response.getString("order_no")); } } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java new file mode 100644 index 00000000..7ebee80d --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java @@ -0,0 +1,29 @@ +package com.ghy.payment.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.ghy.common.adapay.model.Event; +import com.ghy.payment.service.CallBackService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 撤销支付回调 + * + * @author HH 2022/5/31 + */ +@Service("payReverseCallbackService") +public class PayReverseCallbackService implements CallBackService { + + private static final Logger logger = LoggerFactory.getLogger(PayReverseCallbackService.class); + + @Override + public void onCallback(Event event) { + logger.debug("撤销支付 callback: {}", event.toString()); + } + + @Override + public void onResponse(JSONObject response) { + logger.debug("撤销支付 Response: {}", response.toString()); + } +} diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallBackServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallBackServiceImpl.java deleted file mode 100644 index 1937a771..00000000 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallBackServiceImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ghy.payment.service.impl; - -import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.callback.Event; -import com.ghy.payment.service.CallBackService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - -@Service("refundCallBackService") -public class RefundCallBackServiceImpl implements CallBackService { - - private static Logger logger = LoggerFactory.getLogger(RefundCallBackServiceImpl.class); - - @Override - public void onCallback(Event event) { - logger.info("refund callback is {}", event.toString()); - } - - @Override - public void onResponse(JSONObject response) { - logger.info("refund response is {}", response.toString()); - } - -} diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallbackService.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallbackService.java new file mode 100644 index 00000000..5b1477b2 --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallbackService.java @@ -0,0 +1,30 @@ +package com.ghy.payment.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.ghy.common.adapay.model.Event; +import com.ghy.payment.service.CallBackService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 退款回调 + * + * @author HH 2022/5/30 + */ +@Service("refundCallbackService") +public class RefundCallbackService implements CallBackService { + + private static final Logger logger = LoggerFactory.getLogger(RefundCallbackService.class); + + @Override + public void onCallback(Event event) { + logger.debug("退款 callback: {}", event.toString()); + } + + @Override + public void onResponse(JSONObject response) { + logger.debug("退款 Response: {}", response.toString()); + } + +} diff --git a/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml b/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml index 127b9495..f445affc 100644 --- a/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml +++ b/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml @@ -2,7 +2,7 @@ - + @@ -16,7 +16,7 @@ - + SELECT id, order_no, prod_mode, app_id, pay_channel, pay_amt, party_order_id, query_url, currency, status, pay_time, created_time, update_time FROM adapay_pay_log @@ -58,4 +58,8 @@ WHERE id = #{id} + + \ No newline at end of file