From f5202904f997c074baa304b8fe74339dfbec159e Mon Sep 17 00:00:00 2001 From: "kuang.yifei@iwhalecloud.com" Date: Mon, 30 May 2022 10:42:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9B=9E=E8=B0=83=E7=9A=84?= =?UTF-8?q?=E9=83=A8=E5=88=86=EF=BC=8C=E6=94=B9=E4=B8=BA=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customer/CustomerBankController.java | 2 +- .../pay}/AdapayCallbackController.java | 21 +++-- .../web/controller/pay/AlipayController.java | 2 +- .../web/controller/pay/WxPayController.java | 2 +- .../worker/WorkerBankController.java | 2 +- .../mapping/DrawCashReplyMapping.java | 4 +- .../callback/mapping/PayReplyMapping.java | 4 +- .../callback/mapping/RefundReplyMapping.java | 2 +- .../ghy/payment/service}/AdapayService.java | 11 ++- .../ghy/payment/service/CallBackService.java | 24 ++++++ .../impl/DrawCashCallBackServiceImpl.java | 37 +++++++++ .../service/impl/PayCallBackServiceImpl.java | 76 +++++++++++++++++++ .../impl/RefundCallBackServiceImpl.java | 25 ++++++ 13 files changed, 192 insertions(+), 20 deletions(-) rename {ghy-common/src/main/java/com/ghy/common/adapay/callback => ghy-admin/src/main/java/com/ghy/web/controller/pay}/AdapayCallbackController.java (80%) rename {ghy-common/src/main/java/com/ghy/common/adapay => ghy-payment/src/main/java/com/ghy/payment/service}/AdapayService.java (98%) create mode 100644 ghy-payment/src/main/java/com/ghy/payment/service/CallBackService.java create mode 100644 ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallBackServiceImpl.java create mode 100644 ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallBackServiceImpl.java create mode 100644 ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallBackServiceImpl.java diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java b/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java index d6c65e12..7303988d 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java @@ -2,7 +2,7 @@ package com.ghy.web.controller.customer; import com.alibaba.fastjson.JSON; import com.ghy.common.adapay.AdapayConfig; -import com.ghy.common.adapay.AdapayService; +import com.ghy.payment.service.AdapayService; import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.Merchant; import com.ghy.common.core.domain.AjaxResult; diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/AdapayCallbackController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java similarity index 80% rename from ghy-common/src/main/java/com/ghy/common/adapay/callback/AdapayCallbackController.java rename to ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java index 0670396f..69bc18d0 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/AdapayCallbackController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AdapayCallbackController.java @@ -1,9 +1,9 @@ -package com.ghy.common.adapay.callback; +package com.ghy.web.controller.pay; -import com.ghy.common.adapay.callback.mapping.DrawCashReplyMapping; -import com.ghy.common.adapay.callback.mapping.PayReplyMapping; -import com.ghy.common.adapay.callback.mapping.RefundReplyMapping; +import com.ghy.common.adapay.callback.Event; import com.ghy.common.core.controller.BaseController; +import com.ghy.common.utils.spring.SpringUtils; +import com.ghy.payment.service.CallBackService; import com.huifu.adapay.core.AdapayCore; import com.huifu.adapay.core.util.AdapaySign; import org.apache.commons.lang3.StringUtils; @@ -19,6 +19,8 @@ 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); @@ -36,26 +38,31 @@ public class AdapayCallbackController extends BaseController { if (verifySign) { //Event事件类型 String type = event.getType(); + String beanName; if (StringUtils.isBlank(type)) { return "NG"; } switch (type) { case "payment.succeeded": case "payment.failed": - PayReplyMapping.putReply(event); + beanName = "payCallBackService"; break; case "payment.close.succeeded": case "payment.close.failed": - RefundReplyMapping.putReply(event); + beanName = "refundCallBackService"; break; case "cash.succeeded": case "cash.failed": - DrawCashReplyMapping.putReply(event); + beanName = "drawCashCallBackService"; break; default: logger.warn("UNKNOWN EVENT TYPE [{}]", type); return "NG"; } + logger.info("handler bean is {} ", beanName); + + callBackService = SpringUtils.getBean(beanName); + callBackService.onCallback(event); return "OK"; } logger.warn("签名验证失败 data=[{}], sign=[{}]", data, sign); diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java index 2ecb9c62..4be8a7ad 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java @@ -1,6 +1,6 @@ package com.ghy.web.controller.pay; -import com.ghy.common.adapay.AdapayService; +import com.ghy.payment.service.AdapayService; import com.ghy.common.adapay.model.PayParam; import com.ghy.common.core.controller.BaseController; import com.ghy.common.core.domain.AjaxResult; diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java index 769cf91d..6d985bcb 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java @@ -1,6 +1,6 @@ package com.ghy.web.controller.pay; -import com.ghy.common.adapay.AdapayService; +import com.ghy.payment.service.AdapayService; import com.ghy.common.adapay.model.PayParam; import com.ghy.common.adapay.model.WxpayExpend; import com.ghy.common.config.WxConfig; diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/worker/WorkerBankController.java b/ghy-admin/src/main/java/com/ghy/web/controller/worker/WorkerBankController.java index 377dfda0..a9d79048 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/worker/WorkerBankController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/worker/WorkerBankController.java @@ -2,7 +2,7 @@ package com.ghy.web.controller.worker; import com.alibaba.fastjson.JSON; import com.ghy.common.adapay.AdapayConfig; -import com.ghy.common.adapay.AdapayService; +import com.ghy.payment.service.AdapayService; import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.Merchant; import com.ghy.common.core.controller.BaseController; 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 index abbbd4f5..18bf0896 100644 --- 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 @@ -22,11 +22,11 @@ public class DrawCashReplyMapping { */ private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); - public static void putReply(Event event) { + 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 !!!"); - IDrawCashCallback callback = PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo()); + PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo()); if (callback != null) { callback.onCallback(reply); } 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 index dc110c9c..bfcc4c9f 100644 --- 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 @@ -26,12 +26,12 @@ public class PayReplyMapping { */ private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); - public static void putReply(Event event) { + 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()); - IPayCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo()); + PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo()); if (callback != null) { callback.onCallback(payment); } else { 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 index 8899a4a0..86d80dbd 100644 --- 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 @@ -22,7 +22,7 @@ public class RefundReplyMapping { */ private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); - public static void putReply(Event event) { + 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 !!!"); diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java similarity index 98% rename from ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java rename to ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java index 3066ce91..0991ca6b 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java @@ -1,13 +1,15 @@ -package com.ghy.common.adapay; +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.PayReplyMapping; import com.ghy.common.adapay.callback.mapping.RefundReplyMapping; import com.ghy.common.adapay.model.*; +import com.ghy.payment.service.impl.PayCallBackServiceImpl; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.*; import org.apache.commons.lang3.StringUtils; @@ -33,6 +35,8 @@ public class AdapayService { @Resource private IPayCallback payCallback; @Resource + private PayCallBackServiceImpl payCallBackService; + @Resource private IDrawCashCallback drawCashCallback; @Resource private IRefundCallback refundCallback; @@ -289,8 +293,7 @@ public class AdapayService { paymentParams.put("expend", expend); logger.debug("paymentParams: {}", paymentParams.toJSONString()); JSONObject response = (JSONObject) Payment.create(paymentParams, deptId.toString()); - payCallback.onResponse(response); - PayReplyMapping.putCallback(payParam.getOrderNo(), payCallback); + payCallBackService.onResponse(response); return response; } 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 new file mode 100644 index 00000000..c4fa79b5 --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/CallBackService.java @@ -0,0 +1,24 @@ +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; + +public interface CallBackService { + + public final static ConcurrentMap> resultCallBackMap = new ConcurrentHashMap<>(1024); + + /** + * @param event 回调 + */ + void onCallback(Event event); + + /** + * @param response 同步响应 + */ + void onResponse(JSONObject response); + +} 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 new file mode 100644 index 00000000..1218a11b --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/DrawCashCallBackServiceImpl.java @@ -0,0 +1,37 @@ +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/PayCallBackServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallBackServiceImpl.java new file mode 100644 index 00000000..e32c334e --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayCallBackServiceImpl.java @@ -0,0 +1,76 @@ +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.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.CallBackService; +import com.ghy.payment.service.FinancialMasterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service("payCallBackService") +public class PayCallBackServiceImpl implements CallBackService { + + private static Logger logger = LoggerFactory.getLogger(PayCallBackServiceImpl.class); + + private final static List payList = new ArrayList<>(1024); + + @Resource + FinancialMasterService financialMasterService; + + @Override + public void onCallback(Event event) { + String data = event.getData(); + PayReply payment = JSON.parseObject(data, PayReply.class); + Assert.hasText(payment.getOrderNo(), "orderNo is blank !!!"); + // 校验是否是本系统发出去的回调请求 + if(payList.contains(payment.getOrderNo())){ + // 更新交易记录 + 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); + } + } + logger.info("pay callback is {}", event.toString()); + } + + @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()); + } + + // 将记录保存到临时会话中 + payList.add(response.getString("order_no")); + resultCallBackMap.put("pay", payList); + } + +} 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 new file mode 100644 index 00000000..1937a771 --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/RefundCallBackServiceImpl.java @@ -0,0 +1,25 @@ +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()); + } + +}