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 9bb2fc25..2ecb9c62 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,18 +1,20 @@ package com.ghy.web.controller.pay; import com.ghy.common.adapay.AdapayService; -import com.ghy.common.adapay.callback.PayCallback; import com.ghy.common.adapay.model.PayParam; import com.ghy.common.core.controller.BaseController; import com.ghy.common.core.domain.AjaxResult; import com.ghy.order.domain.OrderMaster; import com.ghy.order.service.OrderMasterService; +import com.ghy.payment.domain.FinancialMaster; +import com.ghy.payment.service.FinancialMasterService; import com.huifu.adapay.core.exception.BaseAdaPayException; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Map; /** @@ -24,31 +26,32 @@ import java.util.Map; @RequestMapping("pay/ali") public class AlipayController extends BaseController { - @Resource - private PayCallback payCallback; @Resource private AdapayService adapayService; @Resource private OrderMasterService orderMasterService; + @Resource + private FinancialMasterService financialMasterService; /** * 支付宝正扫支付 */ @PostMapping("qr") - public AjaxResult qrPay(String orderMasterCode) { - OrderMaster orderMaster = orderMasterService.selectByCode(orderMasterCode); - if (orderMaster == null) { + public AjaxResult qrPay(Long orderMasterId) { + OrderMaster om = orderMasterService.selectById(orderMasterId); + FinancialMaster fm = financialMasterService.selectByOrderMasterId(orderMasterId); + if (om == null || fm == null) { return AjaxResult.error("订单不存在"); } Map map; + String payMoney = fm.getPayMoney().setScale(2, BigDecimal.ROUND_UNNECESSARY).toString(); + // TODO 这里需要补充商品标题和商品描述信息 + PayParam payParam = PayParam.createDelayPay(om.getCode(), payMoney, "商品标题", "商品描述信息"); try { - // TODO 订单里需要补充支付金额、tittle、简要描述、分账信息、description - PayParam payParam = new PayParam(orderMaster.getCode(), - "orderMaster.get支付金额", "orderMaster.getTittle()", "orderMaster.get商品描述信息"); - map = adapayService.alipayQrPay(orderMaster.getDeptId(), payParam, payCallback, null, null, null); + map = adapayService.alipayQrPay(om.getDeptId(), payParam, null, null, null); } catch (BaseAdaPayException e) { - logger.error("获取微信用户信息失败", e); - return AjaxResult.error(); + logger.error("创建支付失败", e); + return AjaxResult.error("网络不佳 请稍后再试"); } return AjaxResult.success(map); } 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 afc53d96..769cf91d 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,15 +1,12 @@ package com.ghy.web.controller.pay; -import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.AdapayService; -import com.ghy.common.adapay.callback.PayCallback; import com.ghy.common.adapay.model.PayParam; import com.ghy.common.adapay.model.WxpayExpend; import com.ghy.common.config.WxConfig; import com.ghy.common.core.controller.BaseController; import com.ghy.common.core.domain.AjaxResult; import com.ghy.common.utils.ExceptionUtil; -import com.ghy.common.utils.WxUtils; import com.ghy.order.domain.OrderMaster; import com.ghy.order.service.OrderMasterService; import com.huifu.adapay.core.exception.BaseAdaPayException; @@ -33,8 +30,6 @@ public class WxPayController extends BaseController { private AdapayService adapayService; @Resource private OrderMasterService orderMasterService; - @Resource - private PayCallback payCallback; /** * 微信小程序支付 @@ -56,7 +51,7 @@ public class WxPayController extends BaseController { // TODO 订单里需要补充支付金额、tittle、简要描述、分账信息、description PayParam payParam = new PayParam(orderMaster.getCode(), "0.01", "工圈子测试", "工圈子测试描述"); - map = adapayService.wxLitePay(orderMaster.getDeptId(), payParam, payCallback, expend, null, null); + map = adapayService.wxLitePay(orderMaster.getDeptId(), payParam, expend, null, null); } catch (BaseAdaPayException e) { logger.error("获取微信用户信息失败", e); return AjaxResult.error(); @@ -88,7 +83,7 @@ public class WxPayController extends BaseController { expend.setOpenId(openId); Map map; PayParam payParam = new PayParam(orderMaster.getCode(), "0.01", "工圈子测试", "工圈子测试描述"); - map = adapayService.wxPubPay(orderMaster.getDeptId(), payParam, payCallback, expend, null, null); + map = adapayService.wxPubPay(orderMaster.getDeptId(), payParam, expend, null, null); return AjaxResult.success(map); } catch (Exception e) { e.printStackTrace(); diff --git a/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java b/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java deleted file mode 100644 index 39e9a5e7..00000000 --- a/ghy-admin/src/main/java/com/ghy/web/core/AfterPay.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ghy.web.core; - -import com.ghy.common.adapay.callback.PayCallback; -import com.ghy.common.adapay.model.AdapayStatusEnum; -import com.ghy.common.adapay.model.PayReply; -import com.ghy.order.service.OrderMasterService; -import com.ghy.payment.service.FinancialMasterService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.annotation.Resource; - -/** - * 用户支付后 - */ -@Configuration -public class AfterPay { - - private static final Logger logger = LoggerFactory.getLogger(AfterPay.class); - - @Resource - FinancialMasterService financialMasterService; - - @Bean - public PayCallback payCallback() { - return new PayCallback() { - @Override - public void onReply(PayReply reply) { - if (AdapayStatusEnum.succeeded.code.equals(reply.getStatus())) { - // TODO 保存支付结果到 adapay_callback_log 表 - - // 修改财务单状态为支付成功 - financialMasterService.paySucceeded(reply.getOrderNo(), reply.getPayChannel()); - } else { - logger.warn("支付失败:{}", reply); - } - } - }; - } -} 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 new file mode 100644 index 00000000..a4fd984e --- /dev/null +++ b/ghy-admin/src/main/java/com/ghy/web/core/adapay/DrawCashCallback.java @@ -0,0 +1,23 @@ +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/InitAdapay.java b/ghy-admin/src/main/java/com/ghy/web/core/adapay/InitAdapay.java similarity index 97% rename from ghy-admin/src/main/java/com/ghy/web/core/InitAdapay.java rename to ghy-admin/src/main/java/com/ghy/web/core/adapay/InitAdapay.java index 78e9c6a9..a33df13a 100644 --- a/ghy-admin/src/main/java/com/ghy/web/core/InitAdapay.java +++ b/ghy-admin/src/main/java/com/ghy/web/core/adapay/InitAdapay.java @@ -1,4 +1,4 @@ -package com.ghy.web.core; +package com.ghy.web.core.adapay; import com.ghy.common.adapay.AdapayConfig; import com.ghy.common.adapay.AdapayProperties; 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 new file mode 100644 index 00000000..ae348465 --- /dev/null +++ b/ghy-admin/src/main/java/com/ghy/web/core/adapay/PayCallback.java @@ -0,0 +1,62 @@ +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.setId(response.getLong("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 new file mode 100644 index 00000000..1e88dd40 --- /dev/null +++ b/ghy-admin/src/main/java/com/ghy/web/core/adapay/RefundCallback.java @@ -0,0 +1,23 @@ +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/AdapayService.java b/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java index 4c7b5114..3066ce91 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java @@ -1,9 +1,9 @@ package com.ghy.common.adapay; import com.alibaba.fastjson.JSONObject; -import com.ghy.common.adapay.callback.DrawCashCallback; -import com.ghy.common.adapay.callback.PayCallback; -import com.ghy.common.adapay.callback.RefundCallback; +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; @@ -20,9 +20,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import javax.validation.constraints.NotNull; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * @author HH 2022/3/25 @@ -32,6 +30,12 @@ public class AdapayService { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Resource + private IPayCallback payCallback; + @Resource + private IDrawCashCallback drawCashCallback; + @Resource + private IRefundCallback refundCallback; @Resource private AdapayProperties adapayProperties; @@ -46,7 +50,7 @@ public class AdapayService { * @param confirmAmt [必填] String(14) 确认金额,必须大于0,保留两位小数点,如0.10、100.05等。必须小于等于原支付金额-已确认金额-已撤销金额 * @return 成功时同步返回一个包含 支付确认对象的JSON https://docs.adapay.tech/api/trade.html#id54 */ - public Map paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo, @NotNull String confirmAmt) throws BaseAdaPayException { + public JSONObject paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo, @NotNull String confirmAmt) throws BaseAdaPayException { return paymentConfirm(deptId, paymentId, orderNo, confirmAmt, null, null, null); } @@ -64,17 +68,17 @@ public class AdapayService { * @param description String(128) 附加说明 * @return 成功时同步返回一个包含 支付确认对象的JSON https://docs.adapay.tech/api/trade.html#id54 */ - public Map paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo, - @NotNull String confirmAmt, List divMembers, - String feeMode, String description) throws BaseAdaPayException { - Map confirmParams = new HashMap<>(); + public JSONObject paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo, + @NotNull String confirmAmt, List divMembers, + String feeMode, String description) throws BaseAdaPayException { + JSONObject confirmParams = new JSONObject(); confirmParams.put("payment_id", paymentId); confirmParams.put("order_no", orderNo); confirmParams.put("confirm_amt", confirmAmt); confirmParams.put("div_members", divMembers); confirmParams.put("fee_mode", feeMode); confirmParams.put("description", description); - return PaymentConfirm.create(confirmParams, deptId.toString()); + return (JSONObject) PaymentConfirm.create(confirmParams, deptId.toString()); } /** @@ -94,12 +98,12 @@ public class AdapayService { * @param divMembers 分账对象信息列表,最多仅支持7个分账方 * @return 成功时同步返回交易结果的 JSON */ - public Map balancePay(@NotNull Long deptId, @NotNull String orderNo, @NotNull String outMemberId, - @NotNull String inMemberId, @NotNull String transAmt, @NotNull String goodsTitle, - @NotNull String goodsDesc, String payMode, Collection divMembers) throws BaseAdaPayException { + public JSONObject balancePay(@NotNull Long deptId, @NotNull String orderNo, @NotNull String outMemberId, + @NotNull String inMemberId, @NotNull String transAmt, @NotNull String goodsTitle, + @NotNull String goodsDesc, String payMode, Collection divMembers) throws BaseAdaPayException { // 获取商户的appId String appId = AdapayConfig.getAppId(deptId); - Map balanceParam = new HashMap<>(10); + JSONObject balanceParam = new JSONObject(); balanceParam.put("app_id", appId); balanceParam.put("adapay_func_code", "settle_accounts.balancePay"); balanceParam.put("order_no", orderNo); @@ -112,7 +116,7 @@ public class AdapayService { if (!CollectionUtils.isEmpty(divMembers)) { balanceParam.put("div_members", divMembers); } - return AdapayCommon.requestAdapay(balanceParam, deptId.toString()); + return (JSONObject) AdapayCommon.requestAdapay(balanceParam, deptId.toString()); } /** @@ -133,14 +137,14 @@ public class AdapayService { * @param areaCode 银行账户开户银行所在地区编码(省市编码),银行账户类型为对公时必填,省市编码详见area.json * @return 成功时同步返回一个包含 SettleAccount对象 的 JSON。 */ - public Map createSettleAccount(@NotNull Long deptId, @NotNull String memberId, @NotNull String cardId, - @NotNull String cardName, @NotNull String bankAcctType, String certId, String telNo, - String bankCode, String provCode, String areaCode) throws BaseAdaPayException { + public JSONObject createSettleAccount(@NotNull Long deptId, @NotNull String memberId, @NotNull String cardId, + @NotNull String cardName, @NotNull String bankAcctType, String certId, String telNo, + String bankCode, String provCode, String areaCode) throws BaseAdaPayException { // 获取商户的appId String appId = AdapayConfig.getAppId(deptId); // 结算账户信息 参见结算账户信息(AccountInfo)对象 https://docs.adapay.tech/api/appendix.html#accountinfo - Map accountInfo = new HashMap<>(9); + JSONObject accountInfo = new JSONObject(); switch (bankAcctType) { case "1": @@ -164,13 +168,13 @@ public class AdapayService { accountInfo.put("prov_code", provCode); accountInfo.put("area_code", areaCode); - Map settleCountParams = new HashMap<>(4); + JSONObject settleCountParams = new JSONObject(); settleCountParams.put("member_id", memberId); settleCountParams.put("app_id", appId); // 目前仅支持:bank_account(银行卡) settleCountParams.put("channel", "bank_account"); settleCountParams.put("account_info", accountInfo); - return SettleAccount.create(settleCountParams, deptId.toString()); + return (JSONObject) SettleAccount.create(settleCountParams, deptId.toString()); } /** @@ -183,11 +187,11 @@ public class AdapayService { * @param certId [必填]证件号 * @return 成功时同步返回一个包含Member对象的JSON */ - public Map createMember(@NotNull Long deptId, @NotNull String memberId, @NotNull String telNo, - @NotNull String username, @NotNull String certId) throws BaseAdaPayException { + public JSONObject createMember(@NotNull Long deptId, @NotNull String memberId, @NotNull String telNo, + @NotNull String username, @NotNull String certId) throws BaseAdaPayException { // 获取商户的appId String appId = AdapayConfig.getAppId(deptId); - Map memberParams = new HashMap<>(); + JSONObject memberParams = new JSONObject(); memberParams.put("member_id", memberId); memberParams.put("app_id", appId); memberParams.put("tel_no", telNo); @@ -197,14 +201,13 @@ public class AdapayService { // 接口功能号 memberParams.put("adapay_func_code", "members.realname"); memberParams.put("cert_id", certId); - return AdapayCommon.requestAdapay(memberParams, deptId.toString()); + return (JSONObject) AdapayCommon.requestAdapay(memberParams, deptId.toString()); } /** * 对指定商户或者商户下用户的结算账户可用余额发起主动取现操作,金额从账户中提到绑定的结算银行卡中 * * @param deptId [必填]商户ID - * @param callback [必填项]处理提现结果的接口 * @param orderNo [必填项]请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 * @param cashType [必填项]取现类型:T1-T+1取现;D1-D+1取现;D0-即时取现。 * @param cashAmt [必填项]取现金额,必须大于0,人民币为元,保留两位小数点,如"0.10"、"100.05"等 @@ -213,16 +216,15 @@ public class AdapayService { * @param feeMode 手续费收取模式:O-商户手续费账户扣取手续费,I-交易金额中扣取手续费;值为空时,默认值为I; * @return https://docs.adapay.tech/api/wallet.html#cash-response */ - public Map drawCash(@NotNull Long deptId, DrawCashCallback callback, String orderNo, String cashType, String cashAmt, - String memberId, String remark, String feeMode) throws BaseAdaPayException { + public JSONObject drawCash(@NotNull Long deptId, String orderNo, String cashType, String cashAmt, + String memberId, String remark, String feeMode) throws BaseAdaPayException { // 获取商户的appId String appId = AdapayConfig.getAppId(deptId); - Assert.notNull(callback, "callback is null!"); Assert.hasText(orderNo, "orderNo is blank!"); Assert.hasText(cashType, "cashType is blank!"); Assert.hasText(cashAmt, "cashAmt is blank!"); Assert.hasText(memberId, "memberId is blank!"); - Map cashParam = new HashMap<>(5); + JSONObject cashParam = new JSONObject(); cashParam.put("order_no", orderNo); cashParam.put("app_id", appId); cashParam.put("cash_type", cashType); @@ -231,35 +233,35 @@ public class AdapayService { cashParam.put("notify_url", adapayProperties.getNotifyUrl()); cashParam.put("remark", remark); cashParam.put("fee_mode", feeMode); - DrawCashReplyMapping.putCallback(orderNo, callback); - return Drawcash.create(cashParam, deptId.toString()); + DrawCashReplyMapping.putCallback(orderNo, drawCashCallback); + return (JSONObject) Drawcash.create(cashParam, deptId.toString()); } /** * 支付宝正扫支付 */ - public Map alipayQrPay(@NotNull Long deptId, PayParam payParam, PayCallback callback, - AlipayExpend expend, DeviceInfo deviceInfo, - Collection divMembers) throws BaseAdaPayException { - return pay(deptId, "alipay_qr", payParam, callback, expend, deviceInfo, divMembers); + public JSONObject alipayQrPay(@NotNull Long deptId, PayParam payParam, + AlipayExpend expend, DeviceInfo deviceInfo, + Collection divMembers) throws BaseAdaPayException { + return pay(deptId, "alipay_qr", payParam, expend, deviceInfo, divMembers); } /** * 微信公众号支付 */ - public Map wxPubPay(@NotNull Long deptId, PayParam payParam, PayCallback callback, - WxpayExpend expend, DeviceInfo deviceInfo, - Collection divMembers) throws BaseAdaPayException { - return pay(deptId, "wx_pub", payParam, callback, expend, deviceInfo, divMembers); + public JSONObject wxPubPay(@NotNull Long deptId, PayParam payParam, + WxpayExpend expend, DeviceInfo deviceInfo, + Collection divMembers) throws BaseAdaPayException { + return pay(deptId, "wx_pub", payParam, expend, deviceInfo, divMembers); } /** * 微信小程序支付 */ - public Map wxLitePay(@NotNull Long deptId, PayParam payParam, PayCallback callback, - WxpayExpend expend, DeviceInfo deviceInfo, - Collection divMembers) throws BaseAdaPayException { - return pay(deptId, "wx_lite", payParam, callback, expend, deviceInfo, divMembers); + public JSONObject wxLitePay(@NotNull Long deptId, PayParam payParam, + WxpayExpend expend, DeviceInfo deviceInfo, + Collection divMembers) throws BaseAdaPayException { + return pay(deptId, "wx_lite", payParam, expend, deviceInfo, divMembers); } /** @@ -268,15 +270,14 @@ public class AdapayService { * @param deptId [必填]商户ID * @param payChannel [必填项]支付渠道,详见 https://docs.adapay.tech/api/appendix.html#id2 * @param payParam [必填项]支付参数 - * @param callback [必填项]处理支付结果的回调接口 * @param expend 支付渠道额外参数 https://docs.adapay.tech/api/appendix.html#expend * @param deviceInfo 前端设备信息 https://docs.adapay.tech/api/appendix.html#deviceinfo * @param divMembers 分账对象信息列表 https://docs.adapay.tech/api/appendix.html#divmembers * @return 同步返回一个 支付对象,详见 https://docs.adapay.tech/api/trade.html#id2 */ - public Map pay(@NotNull Long deptId, @NotNull String payChannel, @NotNull PayParam payParam, - @NotNull PayCallback callback, Expend expend, DeviceInfo deviceInfo, - Collection divMembers) throws BaseAdaPayException { + public JSONObject pay(@NotNull Long deptId, @NotNull String payChannel, @NotNull PayParam payParam, + Expend expend, DeviceInfo deviceInfo, + Collection divMembers) throws BaseAdaPayException { // 获取商户的appId String appId = AdapayConfig.getAppId(deptId); JSONObject paymentParams = payParam.toJSONObject(); @@ -286,9 +287,11 @@ public class AdapayService { paymentParams.put("div_members", divMembers); paymentParams.put("device_info", deviceInfo); paymentParams.put("expend", expend); - PayReplyMapping.putCallback(payParam.getOrderNo(), callback); logger.debug("paymentParams: {}", paymentParams.toJSONString()); - return Payment.create(paymentParams, deptId.toString()); + JSONObject response = (JSONObject) Payment.create(paymentParams, deptId.toString()); + payCallback.onResponse(response); + PayReplyMapping.putCallback(payParam.getOrderNo(), payCallback); + return response; } /** @@ -300,23 +303,21 @@ public class AdapayService { * 若返回码是“order_id_not_exists 订单记录不存在”,既超过退款期限,无法退款成功。 * * @param deptId [必填]商户ID - * @param callback [必填项]处理退款结果的回调接口 * @param paymentId [必填项]支付确认对象的id * @param refundOrderNo [必填项]订单号 * @param refundAmt [必填项]退款金额,若退款金额小于原交易金额,则认为是部分退款,必须大于0,保留两位小数点,如0.10、100.05等 * @return 同步返回一个 退款对象 https://docs.adapay.tech/api/trade.html#create-refund-params */ - public Map refund(@NotNull Long deptId, @NotNull RefundCallback callback, @NotNull String paymentId, - @NotNull String refundOrderNo, @NotNull String refundAmt) throws BaseAdaPayException { - Assert.notNull(callback, "callback is null!"); + public JSONObject refund(@NotNull Long deptId, @NotNull String paymentId, + @NotNull String refundOrderNo, @NotNull String refundAmt) throws BaseAdaPayException { Assert.hasText(paymentId, "paymentId is blank!"); Assert.hasText(refundOrderNo, "refundOrderNo is blank!"); Assert.hasText(refundAmt, "refundAmt is blank!"); - Map refundParams = new HashMap<>(4); + JSONObject refundParams = new JSONObject(); refundParams.put("refund_amt", refundAmt); refundParams.put("refund_order_no", refundOrderNo); - RefundReplyMapping.putCallback(paymentId, callback); - return Refund.create(paymentId, refundParams, deptId.toString()); + RefundReplyMapping.putCallback(paymentId, refundCallback); + return (JSONObject) Refund.create(paymentId, refundParams, deptId.toString()); } /** @@ -334,13 +335,13 @@ public class AdapayService { * @param expend 扩展域 * @return 关单的结果将通过一个 JSON 同步返回 https://docs.adapay.tech/api/trade.html#close-payment-response */ - public Map close(@NotNull Long deptId, String paymentId, String reason, String expend) throws BaseAdaPayException { + public JSONObject close(@NotNull Long deptId, String paymentId, String reason, String expend) throws BaseAdaPayException { Assert.hasText(paymentId, "paymentId is blank!"); - Map paymentParams = new HashMap<>(4); + JSONObject paymentParams = new JSONObject(); paymentParams.put("payment_id", paymentId); paymentParams.put("reason", reason); paymentParams.put("expend", expend); - return Payment.close(paymentParams, deptId.toString()); + return (JSONObject) Payment.close(paymentParams, deptId.toString()); } /** @@ -351,11 +352,11 @@ public class AdapayService { * @param memberId [必填]商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 * @return 成功时同步返回一个包含 Member对象的JSON。 */ - public Map queryMember(@NotNull Long deptId, @NotNull String memberId) throws BaseAdaPayException { - Map memberParams = new HashMap<>(2); + public JSONObject queryMember(@NotNull Long deptId, @NotNull String memberId) throws BaseAdaPayException { + JSONObject memberParams = new JSONObject(); memberParams.put("member_id", memberId); memberParams.put("app_id", AdapayConfig.getAppId(deptId)); - return Member.query(memberParams, deptId.toString()); + return (JSONObject) Member.query(memberParams, deptId.toString()); } } \ No newline at end of file diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/DrawCashCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IDrawCashCallback.java similarity index 67% rename from ghy-common/src/main/java/com/ghy/common/adapay/callback/DrawCashCallback.java rename to ghy-common/src/main/java/com/ghy/common/adapay/callback/IDrawCashCallback.java index 2b806668..ba9e04b2 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/DrawCashCallback.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IDrawCashCallback.java @@ -7,8 +7,8 @@ import com.ghy.common.adapay.model.DrawCashReply; * * @author HH 2022/4/1 */ -public interface DrawCashCallback { +public interface IDrawCashCallback { - void onReply(DrawCashReply reply); + void onCallback(DrawCashReply reply); } diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/PayCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IPayCallback.java similarity index 51% rename from ghy-common/src/main/java/com/ghy/common/adapay/callback/PayCallback.java rename to ghy-common/src/main/java/com/ghy/common/adapay/callback/IPayCallback.java index 373b739e..7ef8091e 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/PayCallback.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IPayCallback.java @@ -1,5 +1,6 @@ package com.ghy.common.adapay.callback; +import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.model.PayReply; /** @@ -7,7 +8,9 @@ import com.ghy.common.adapay.model.PayReply; * * @author HH 2022/3/25 */ -public interface PayCallback { +public interface IPayCallback { - void onReply(PayReply reply); + 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/RefundCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IRefundCallback.java similarity index 68% rename from ghy-common/src/main/java/com/ghy/common/adapay/callback/RefundCallback.java rename to ghy-common/src/main/java/com/ghy/common/adapay/callback/IRefundCallback.java index 7f327bb2..a8e1cb58 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/callback/RefundCallback.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/callback/IRefundCallback.java @@ -7,7 +7,7 @@ import com.ghy.common.adapay.model.RefundReply; * * @author HH 2022/3/29 */ -public interface RefundCallback { +public interface IRefundCallback { - void onReply(RefundReply reply); + 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 index 8537d78b..abbbd4f5 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 @@ -1,7 +1,7 @@ package com.ghy.common.adapay.callback.mapping; import com.alibaba.fastjson.JSON; -import com.ghy.common.adapay.callback.DrawCashCallback; +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; @@ -20,19 +20,19 @@ public class DrawCashReplyMapping { * key: orderNo * value: 处理支付结果的回调接口 */ - private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); + private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); public static void putReply(Event event) { String data = event.getData(); DrawCashReply reply = JSON.parseObject(data, DrawCashReply.class); Assert.hasText(reply.getOrderNo(), "orderNo is blank !!!"); - DrawCashCallback callback = PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo()); + IDrawCashCallback callback = PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo()); if (callback != null) { - callback.onReply(reply); + callback.onCallback(reply); } } - public static void putCallback(String orderNo, DrawCashCallback callback) { + 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 index 8eabfdb8..dc110c9c 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 @@ -2,8 +2,10 @@ 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.PayCallback; +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; @@ -15,24 +17,29 @@ import java.util.concurrent.ConcurrentHashMap; */ 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); + private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); public static void putReply(Event event) { String data = event.getData(); PayReply payment = JSON.parseObject(data, PayReply.class); Assert.hasText(payment.getOrderNo(), "orderNo is blank !!!"); - PayCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo()); + payment.setPayTime(event.getCreatedTime()); + IPayCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo()); if (callback != null) { - callback.onReply(payment); + callback.onCallback(payment); + } else { + logger.warn("PayCallback don't exist! {}", payment); } } - public static void putCallback(String orderNo, PayCallback callback) { + 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 index 3d3b13b0..8899a4a0 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 @@ -2,7 +2,7 @@ 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.RefundCallback; +import com.ghy.common.adapay.callback.IRefundCallback; import com.ghy.common.adapay.model.RefundReply; import org.springframework.util.Assert; @@ -20,19 +20,19 @@ public class RefundReplyMapping { * key: orderNo * value: 处理支付结果的回调接口 */ - private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); + private final static ConcurrentHashMap PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024); public static void putReply(Event event) { String data = event.getData(); RefundReply payment = JSON.parseObject(data, RefundReply.class); Assert.hasText(payment.getPaymentId(), "paymentId is blank !!!"); - RefundCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getPaymentId()); + IRefundCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getPaymentId()); if (callback != null) { - callback.onReply(payment); + callback.onCallback(payment); } } - public static void putCallback(String paymentId, RefundCallback callback) { + 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/model/PayReply.java b/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReply.java index a2e961c0..892a5512 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReply.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReply.java @@ -21,6 +21,10 @@ public class PayReply { */ @JSONField(name = "created_time") private Long createdTime; + /** + * 支付时间 + */ + private long payTime; /** * 必填,订单号 */ diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/model/PaymentDTO.java b/ghy-common/src/main/java/com/ghy/common/adapay/model/PaymentDTO.java new file mode 100644 index 00000000..e5631a30 --- /dev/null +++ b/ghy-common/src/main/java/com/ghy/common/adapay/model/PaymentDTO.java @@ -0,0 +1,26 @@ +package com.ghy.common.adapay.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.huifu.adapay.model.Payment; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class PaymentDTO extends Payment { + + /** + * 用户账单上的商户订单号 + */ + @JSONField(name = "party_order_id") + private String partyOrderId; + /** + * 当前交易状态 + */ + private String status; + + /** + * 支付时间 + */ + private Long payTime; +} 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 new file mode 100644 index 00000000..54e4de3c --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/PaymentMapper.java @@ -0,0 +1,15 @@ +package com.ghy.payment.mapper; + +import com.huifu.adapay.model.Payment; + +/** + * 支付记录 Mapper + * + * @author HH 2022/5/27 + */ +public interface PaymentMapper { + + int insertPayment(Payment payment); + + int updatePayment(Payment payment); +} 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 1d4e3d2a..969f75ef 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 @@ -1,5 +1,6 @@ package com.ghy.payment.service; +import com.ghy.common.adapay.model.PaymentDTO; import com.ghy.payment.domain.FinancialMaster; import java.util.List; @@ -61,4 +62,18 @@ public interface FinancialMasterService { * @param orderMasterId 主订单ID */ FinancialMaster selectByOrderMasterId(Long orderMasterId); + + /** + * 保存一条支付记录 + * + * @param payment 支付对象 + */ + int insertPayment(PaymentDTO payment); + + /** + * 更新一条支付记录 + * + * @param payment 支付对象 + */ + int updatePayment(PaymentDTO payment); } 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 7765a612..7a56fedf 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 @@ -1,9 +1,12 @@ package com.ghy.payment.service.impl; +import com.ghy.common.adapay.model.PaymentDTO; import com.ghy.common.core.text.Convert; import com.ghy.payment.domain.FinancialMaster; import com.ghy.payment.mapper.FinancialMasterMapper; +import com.ghy.payment.mapper.PaymentMapper; import com.ghy.payment.service.FinancialMasterService; +import com.huifu.adapay.model.Payment; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +40,8 @@ public class FinancialMasterServiceImpl implements FinancialMasterService { .appendValue(DAY_OF_MONTH, 2).appendValue(HOUR_OF_DAY, 2) .appendValue(MINUTE_OF_HOUR, 2).appendValue(SECOND_OF_MINUTE, 2).toFormatter(); + @Resource + private PaymentMapper paymentMapper; @Resource private FinancialMasterMapper financialMasterMapper; @@ -95,4 +100,14 @@ public class FinancialMasterServiceImpl implements FinancialMasterService { return financialMasterMapper.selectByOrderMasterId(orderMasterId); } + @Override + public int insertPayment(PaymentDTO payment) { + return paymentMapper.insertPayment(payment); + } + + @Override + public int updatePayment(PaymentDTO payment) { + return paymentMapper.updatePayment(payment); + } + } diff --git a/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml b/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml new file mode 100644 index 00000000..127b9495 --- /dev/null +++ b/ghy-payment/src/main/resources/mapper/payment/PaymentMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + 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 + + + + INSERT INTO adapay_pay_log( + `id`, + `order_no`, + `prod_mode`, + `app_id`, + `pay_channel`, + `pay_amt`, + `party_order_id`, + `query_url`, + `status`, + created_time + )VALUES( + #{id}, + #{orderNo}, + #{prodMode}, + #{appId}, + #{payChannel}, + #{payAmt}, + #{partyOrderId}, + #{queryUrl}, + #{status}, + SYSDATE() + ) + + + + UPDATE adapay_pay_log + + status = #{status}, + pay_time = #{payTime}, + update_time = SYSDATE() + + WHERE id = #{id} + + + \ No newline at end of file