From 855f141777ac1470d691b589b3a463fec4892cf2 Mon Sep 17 00:00:00 2001 From: HH Date: Fri, 1 Apr 2022 10:19:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=96=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/common/adapay/AdapayService.java | 56 ++++++++++++++- .../adapay/callback/DrawCashCallback.java | 13 ++++ .../callback/mapping/DrawCashMapping.java | 40 +++++++++++ .../callback/mapping/PayReplyMapping.java | 2 +- .../callback/mapping/RefundReplyMapping.java | 4 +- .../adapay/callback/model/DrawCashReply.java | 69 +++++++++++++++++++ 6 files changed, 179 insertions(+), 5 deletions(-) create mode 100644 ghy-common/src/main/java/com/ghy/common/adapay/callback/DrawCashCallback.java create mode 100644 ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashMapping.java create mode 100644 ghy-common/src/main/java/com/ghy/common/adapay/callback/model/DrawCashReply.java 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 69955ae9..f5cfa147 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,16 +1,20 @@ package com.ghy.common.adapay; +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.mapping.DrawCashMapping; import com.ghy.common.adapay.callback.mapping.PayReplyMapping; import com.ghy.common.adapay.callback.mapping.RefundReplyMapping; import com.ghy.common.adapay.callback.model.Expend; import com.ghy.common.adapay.callback.model.WxLiteExpend; import com.huifu.adapay.core.exception.BaseAdaPayException; +import com.huifu.adapay.model.Drawcash; import com.huifu.adapay.model.Payment; import com.huifu.adapay.model.Refund; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; import java.util.HashMap; import java.util.Map; @@ -24,17 +28,51 @@ public class AdapayService { AdapayProperties adapayProperties; + /** + * 对指定商户或者商户下用户的结算账户可用余额发起主动取现操作,金额从账户中提到绑定的结算银行卡中 + * + * @param callback [必填项]处理提现结果的接口 + * @param orderNo [必填项]请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 + * @param cashType [必填项]取现类型:T1-T+1取现;D1-D+1取现;D0-即时取现。 + * @param cashAmt [必填项]取现金额,必须大于0,人民币为元,保留两位小数点,如"0.10"、"100.05"等 + * @param memberId [必填项]用户对象的member_id,若是商户本身取现时,请传入0 + * @param remark 备注 + * @param feeMode 手续费收取模式:O-商户手续费账户扣取手续费,I-交易金额中扣取手续费;值为空时,默认值为I; + * @return https://docs.adapay.tech/api/wallet.html#cash-response + */ + public Map drawCash(DrawCashCallback callback, String orderNo, String cashType, String cashAmt, + String memberId, String remark, String feeMode) throws BaseAdaPayException { + 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); + cashParam.put("order_no", orderNo); + cashParam.put("app_id", adapayProperties.getAppId()); + cashParam.put("cash_type", cashType); + cashParam.put("cash_amt", cashAmt); + cashParam.put("member_id", memberId); + cashParam.put("notify_url", adapayProperties.getNotifyUrl()); + cashParam.put("remark", remark); + cashParam.put("fee_mode", feeMode); + DrawCashMapping.putCallback(orderNo, callback); + return Drawcash.create(cashParam); + } + /** * 支付宝正扫支付 */ - public Map alipayQrPay(PayCallback callback, WxLiteExpend expend, String orderNo, String payAmt, String goodsTittle, String goodsDesc, String description) throws BaseAdaPayException { + public Map alipayQrPay(PayCallback callback, WxLiteExpend expend, String orderNo, String payAmt, + String goodsTittle, String goodsDesc, String description) throws BaseAdaPayException { return pay(callback, PayChannelEnum.ALIPAY_QR.getCode(), expend, orderNo, payAmt, goodsTittle, goodsDesc, description); } /** * 微信小程序支付 */ - public Map wxLitePay(PayCallback callback, WxLiteExpend expend, String orderNo, String payAmt, String goodsTittle, String goodsDesc, String description) throws BaseAdaPayException { + public Map wxLitePay(PayCallback callback, WxLiteExpend expend, String orderNo, String payAmt, + String goodsTittle, String goodsDesc, String description) throws BaseAdaPayException { return pay(callback, PayChannelEnum.WX_LITE.getCode(), expend, orderNo, payAmt, goodsTittle, goodsDesc, description); } @@ -49,7 +87,14 @@ public class AdapayService { * @param description 订单附加说明 * @return 同步返回一个 支付对象,详见 https://docs.adapay.tech/api/trade.html#id2 */ - public Map pay(PayCallback callback, String payChannel, Expend expend, String orderNo, String payAmt, String goodsTittle, String goodsDesc, String description) throws BaseAdaPayException { + public Map pay(PayCallback callback, String payChannel, Expend expend, String orderNo, String payAmt, + String goodsTittle, String goodsDesc, String description) throws BaseAdaPayException { + Assert.notNull(callback, "callback is null!"); + Assert.hasText(orderNo, "orderNo is blank!"); + Assert.hasText(payAmt, "payAmt is blank!"); + Assert.hasText(goodsTittle, "goodsTittle is blank!"); + Assert.hasText(goodsDesc, "goodsDesc is blank!"); + Assert.hasText(payChannel, "payChannel is blank!"); Map paymentParams = new HashMap<>(16); paymentParams.put("app_id", adapayProperties.getAppId()); paymentParams.put("notify_url", adapayProperties.getNotifyUrl()); @@ -79,6 +124,10 @@ public class AdapayService { * @return 同步返回一个 退款对象 https://docs.adapay.tech/api/trade.html#create-refund-params */ public Map refund(RefundCallback callback, String paymentId, String refundOrderNo, String refundAmt) throws BaseAdaPayException { + Assert.notNull(callback, "callback is null!"); + Assert.hasText(paymentId, "paymentId is blank!"); + Assert.hasText(refundOrderNo, "refundOrderNo is blank!"); + Assert.hasText(refundAmt, "refundAmt is blank!"); Map refundParams = new HashMap<>(4); refundParams.put("refund_amt", refundAmt); refundParams.put("refund_order_no", refundOrderNo); @@ -101,6 +150,7 @@ public class AdapayService { * @return 关单的结果将通过一个 JSON 同步返回 https://docs.adapay.tech/api/trade.html#close-payment-response */ public Map close(String paymentId, String reason, String expend) throws BaseAdaPayException { + Assert.hasText(paymentId, "paymentId is blank!"); Map paymentParams = new HashMap<>(4); paymentParams.put("payment_id", paymentId); paymentParams.put("reason", reason); 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/DrawCashCallback.java new file mode 100644 index 00000000..ac523059 --- /dev/null +++ b/ghy-common/src/main/java/com/ghy/common/adapay/callback/DrawCashCallback.java @@ -0,0 +1,13 @@ +package com.ghy.common.adapay.callback; + +import com.ghy.common.adapay.callback.model.DrawCashReply; + +/** + * 处理提现结果的接口 + * + * @author HH 2022/4/1 + */ +public interface DrawCashCallback { + + void onReply(DrawCashReply reply); +} diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashMapping.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashMapping.java new file mode 100644 index 00000000..21ffae1a --- /dev/null +++ b/ghy-common/src/main/java/com/ghy/common/adapay/callback/mapping/DrawCashMapping.java @@ -0,0 +1,40 @@ +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.Event; +import com.ghy.common.adapay.callback.model.DrawCashReply; +import org.springframework.util.Assert; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * 提现结果匹配 + * + * @author HH 2022/4/1 + */ +public class DrawCashMapping { + + /** + * 临时保存支付结果 + * key: orderNo + * value: 处理支付结果的回调接口 + */ + 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()); + if (callback != null) { + callback.onReply(reply); + } + } + + public static void putCallback(String orderNo, DrawCashCallback 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 f7b8ce94..5c5430cb 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 @@ -9,7 +9,7 @@ import org.springframework.util.Assert; import java.util.concurrent.ConcurrentHashMap; /** - * 支付结果匹配池 + * 支付结果匹配 * * @author HH 2022/3/25 */ 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 75c3967a..569d7530 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 @@ -9,12 +9,14 @@ import org.springframework.util.Assert; import java.util.concurrent.ConcurrentHashMap; /** + * 退款结果匹配 + * * @author HH 2022/3/29 */ public class RefundReplyMapping { /** - * 临时保存支付结果 + * 临时保存退款结果 * key: orderNo * value: 处理支付结果的回调接口 */ diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/callback/model/DrawCashReply.java b/ghy-common/src/main/java/com/ghy/common/adapay/callback/model/DrawCashReply.java new file mode 100644 index 00000000..065ec1ec --- /dev/null +++ b/ghy-common/src/main/java/com/ghy/common/adapay/callback/model/DrawCashReply.java @@ -0,0 +1,69 @@ +package com.ghy.common.adapay.callback.model; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 提现后Adapay回调接口传过来的数据 + * + * @author HH 2022/4/1 + */ +@Data +public class DrawCashReply { + + /** + * 订单号 + */ + @JSONField(name = "order_no") + private String orderNo; + /** + * 控制台 主页面应用的app_id + */ + @JSONField(name = "app_id") + private String appId; + /** + * 取现金额,必须大于0,保留两位小数点,如"0.10"、"100.05"等 + */ + @JSONField(name = "cash_amt") + private String cashAmt; + /** + * 取现类型:T1-T+1取现;D1-D+1取现;D0-即时取现。 + */ + @JSONField(name = "cash_type") + private String cashType; + /** + * 取现对象创建时的 10 位时间戳 + */ + @JSONField(name = "created_time") + private String createdTime; + /** + * 取现手续费金额 + */ + @JSONField(name = "fee_amt") + private String feeAmt; + /** + * 由Adapay生成的取现对象 id + */ + private String id; + /** + * 取现对象,cash + */ + private String object; + /** + * 取现成功后的到账金额,值为取现金额 - 取现手续费金额。 + */ + @JSONField(name = "real_amt") + private String realAmt; + /** + * 状态 + * pending 交易处理中 + * succeeded 交易成功 + * failed 交易失败 + */ + private String status; + /** + * 是否 prod模式,true 是 prod模式,false 是 mock模式 + */ + @JSONField(name = "prod_mode") + private String prodMode; +}