feat 多卡支付适配

This commit is contained in:
xxm1995
2023-07-28 08:20:05 +08:00
parent 0fc65aad36
commit 7a53728982
9 changed files with 58 additions and 37 deletions

View File

@@ -17,6 +17,9 @@ public interface PayWayExtraCode {
/** 单张储值卡 */
String VOUCHER_NO = "voucher_no";
/** 多张储值卡 */
String VOUCHER_NO_LIST = "voucher_no_list";
/** 钱包ID */
String WALLET_ID = "wallet_id";

View File

@@ -21,7 +21,7 @@ import cn.bootx.platform.daxpay.param.cashier.CashierCombinationPayParam;
import cn.bootx.platform.daxpay.param.cashier.CashierSinglePayParam;
import cn.bootx.platform.daxpay.param.pay.PayParam;
import cn.bootx.platform.daxpay.param.pay.PayWayParam;
import cn.bootx.platform.daxpay.util.PayWaylUtil;
import cn.bootx.platform.daxpay.util.PayWayUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.ijpay.core.enums.SignType;
@@ -75,11 +75,12 @@ public class CashierService {
.setAmount(param.getAmount());
// 处理附加参数
HashMap<String, String> map = new HashMap<>(1);
HashMap<String, Object> map = new HashMap<>(1);
map.put(PayWayExtraCode.AUTH_CODE, param.getAuthCode());
map.put(PayWayExtraCode.OPEN_ID, param.getOpenId());
map.put(PayWayExtraCode.VOUCHER_NO, param.getVoucherNo());
String extraParamsJson = PayWaylUtil.buildExtraParamsJson(param.getPayChannel(), map);
map.put(PayWayExtraCode.VOUCHER_NO_LIST, param.getVoucherNoList());
String extraParamsJson = PayWayUtil.buildExtraParamsJson(param.getPayChannel(), map);
payWayParam.setExtraParamsJson(extraParamsJson);
PayParam payParam = new PayParam()

View File

@@ -11,7 +11,7 @@ import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo;
import cn.bootx.platform.daxpay.exception.payment.PayFailureException;
import cn.bootx.platform.daxpay.param.pay.PayWayParam;
import cn.bootx.platform.daxpay.param.channel.alipay.AliPayParam;
import cn.bootx.platform.daxpay.util.PayWaylUtil;
import cn.bootx.platform.daxpay.util.PayWayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.Method;
import com.alipay.api.AlipayApiException;
@@ -106,8 +106,8 @@ public class AliPayService {
model.setOutTradeNo(String.valueOf(payment.getId()));
model.setTotalAmount(amount.toPlainString());
// 过期时间
model.setTimeoutExpress(PayWaylUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWaylUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setProductCode(AliPayCode.QUICK_WAP_PAY);
model.setQuitUrl(aliPayParam.getReturnUrl());
@@ -137,8 +137,8 @@ public class AliPayService {
model.setProductCode(QUICK_MSECURITY_PAY);
model.setOutTradeNo(String.valueOf(payment.getId()));
// 过期时间
model.setTimeoutExpress(PayWaylUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWaylUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTotalAmount(amount.toPlainString());
try {
@@ -161,8 +161,8 @@ public class AliPayService {
model.setSubject(payment.getTitle());
model.setOutTradeNo(String.valueOf(payment.getId()));
// 过期时间
model.setTimeoutExpress(PayWaylUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWaylUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTotalAmount(amount.toPlainString());
// 目前仅支持FAST_INSTANT_TRADE_PAY
model.setProductCode(AliPayCode.FAST_INSTANT_TRADE_PAY);
@@ -192,8 +192,8 @@ public class AliPayService {
model.setTotalAmount(amount.toPlainString());
// 过期时间
model.setTimeoutExpress(PayWaylUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWaylUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
try {
AlipayTradePrecreateResponse response = AliPayApi.tradePrecreatePayToResponse(model,
@@ -219,8 +219,8 @@ public class AliPayService {
model.setAuthCode(aliPayParam.getAuthCode());
// 过期时间
model.setTimeoutExpress(PayWaylUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWaylUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime()));
payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime()));
model.setTotalAmount(amount.toPlainString());
try {

View File

@@ -15,7 +15,7 @@ import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo;
import cn.bootx.platform.daxpay.exception.payment.PayFailureException;
import cn.bootx.platform.daxpay.param.pay.PayWayParam;
import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam;
import cn.bootx.platform.daxpay.util.PayWaylUtil;
import cn.bootx.platform.daxpay.util.PayWayUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.StrUtil;
@@ -224,14 +224,14 @@ public class WeChatPayService {
private UnifiedOrderModel.UnifiedOrderModelBuilder buildParams(String amount, Payment payment,
WeChatPayConfig weChatPayConfig, String tradeType) {
// 过期时间
payment.setExpiredTime(PayWaylUtil.getPaymentExpiredTime(weChatPayConfig.getExpireTime()));
payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(weChatPayConfig.getExpireTime()));
return UnifiedOrderModel.builder()
.appid(weChatPayConfig.getWxAppId())
.mch_id(weChatPayConfig.getWxMchId())
.nonce_str(WxPayKit.generateStr())
.time_start(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN))
// 反正v2版本的超时时间无效
.time_expire(PayWaylUtil.getWxExpiredTime(weChatPayConfig.getExpireTime()))
.time_expire(PayWayUtil.getWxExpiredTime(weChatPayConfig.getExpireTime()))
.body(payment.getTitle())
.out_trade_no(String.valueOf(payment.getId()))
.total_fee(amount)

View File

@@ -24,7 +24,7 @@ import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException;
import cn.bootx.platform.daxpay.mq.PayEventSender;
import cn.bootx.platform.daxpay.param.pay.PayParam;
import cn.bootx.platform.daxpay.param.pay.PayWayParam;
import cn.bootx.platform.daxpay.util.PayWaylUtil;
import cn.bootx.platform.daxpay.util.PayWayUtil;
import cn.hutool.core.collection.CollectionUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -68,7 +68,7 @@ public class PayService {
// 检验参数
ValidationUtil.validateParam(payParam);
// 异步支付方式检查
PayWaylUtil.validationAsyncPayMode(payParam);
PayWayUtil.validationAsyncPayMode(payParam);
// 商户和应用信息检测
this.checkMchAndApp(payParam);
// 获取并校验支付状态
@@ -94,7 +94,7 @@ public class PayService {
}
// 1. 价格检测
PayWaylUtil.validationAmount(payParam.getPayWayList());
PayWayUtil.validationAmount(payParam.getPayWayList());
// 2. 创建支付记录
payment = this.createPayment(payParam);
@@ -139,7 +139,7 @@ public class PayService {
// 发起支付成功进行的执行方法
strategyList.forEach(AbsPayStrategy::doSuccessHandler);
// 所有支付方式都是同步时进行Payment处理
if (PayWaylUtil.isNotSync(payParam.getPayWayList())) {
if (PayWayUtil.isNotSync(payParam.getPayWayList())) {
// 修改payment支付状态为成功
paymentObj.setPayStatus(TRADE_SUCCESS);
paymentObj.setPayTime(LocalDateTime.now());

View File

@@ -59,7 +59,7 @@ public class PayExpiredTimeService {
// }
//
// // 3 拿到异步支付方法, 与支付网关进行同步
// PayWayParam asyncPayMode = PayWaylUtil.getAsyncPayModeParam(payParam);
// PayWayParam asyncPayMode = PayWayUtil.getAsyncPayModeParam(payParam);
// AbsPayStrategy syncPayStrategy = PayStrategyFactory.create(asyncPayMode);
// syncPayStrategy.initPayParam(payment, payParam);
// PaySyncResult paySyncResult = syncPayStrategy.doSyncPayStatusHandler();

View File

@@ -17,7 +17,7 @@ import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException;
import cn.bootx.platform.daxpay.mq.PayEventSender;
import cn.bootx.platform.daxpay.param.pay.PayParam;
import cn.bootx.platform.daxpay.param.pay.PayWayParam;
import cn.bootx.platform.daxpay.util.PayWaylUtil;
import cn.bootx.platform.daxpay.util.PayWayUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -101,7 +101,7 @@ public class PaySyncService {
}
// 拿到对应的支付方式
PayWayParam asyncPayMode = PayWaylUtil.getAsyncPayModeParam(payParam);
PayWayParam asyncPayMode = PayWayUtil.getAsyncPayModeParam(payParam);
AbsPayStrategy syncPayStrategy = PayStrategyFactory.create(asyncPayMode);
// 对同步结果处理

View File

@@ -5,6 +5,7 @@ import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.List;
/**
* 结算台发起支付参数
@@ -47,6 +48,9 @@ public class CashierSinglePayParam {
@Schema(description = "储值卡")
private String voucherNo;
@Schema(description = "储值卡")
private List<String> voucherNoList;
@Schema(description = "钱包ID")
private String walletId;

View File

@@ -1,6 +1,7 @@
package cn.bootx.platform.daxpay.util;
import cn.bootx.platform.common.core.util.BigDecimalUtil;
import cn.bootx.platform.common.core.util.CollUtil;
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
import cn.bootx.platform.daxpay.code.pay.PayChannelEnum;
import cn.bootx.platform.daxpay.code.pay.PayWayExtraCode;
@@ -13,6 +14,7 @@ import cn.bootx.platform.daxpay.param.channel.alipay.AliPayParam;
import cn.bootx.platform.daxpay.param.channel.voucher.VoucherPayParam;
import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.experimental.UtilityClass;
@@ -31,7 +33,7 @@ import java.util.Map;
* @since 2022/7/12
*/
@UtilityClass
public class PayWaylUtil {
public class PayWayUtil {
/**
* 获取支付宝的过期时间
@@ -80,31 +82,42 @@ public class PayWaylUtil {
* @param payChannel 支付通道编码
* @param map 支付方式扩展字段信息 key PayModelExtraCode中定义的
*/
public String buildExtraParamsJson(String payChannel, Map<String, String> map) {
public String buildExtraParamsJson(String payChannel, Map<String, Object> map) {
PayChannelEnum payChannelEnum = PayChannelEnum.findByCode(payChannel);
switch (payChannelEnum) {
case ALI: {
return JSONUtil.toJsonStr(new AliPayParam().setAuthCode(map.get(PayWayExtraCode.AUTH_CODE))
.setReturnUrl(map.get(PayWayExtraCode.RETURN_URL)));
return JSONUtil.toJsonStr(new AliPayParam().setAuthCode(MapUtil.getStr(map,PayWayExtraCode.AUTH_CODE))
.setReturnUrl(MapUtil.getStr(map,PayWayExtraCode.RETURN_URL)));
}
case WECHAT: {
return JSONUtil.toJsonStr(new WeChatPayParam().setOpenId(map.get(PayWayExtraCode.OPEN_ID))
.setAuthCode(map.get(PayWayExtraCode.AUTH_CODE)));
return JSONUtil.toJsonStr(new WeChatPayParam().setOpenId(MapUtil.getStr(map,PayWayExtraCode.OPEN_ID))
.setAuthCode(MapUtil.getStr(map,PayWayExtraCode.AUTH_CODE)));
}
case VOUCHER: {
String voucherNo = map.get(PayWayExtraCode.VOUCHER_NO);
String voucherNo = MapUtil.getStr(map,PayWayExtraCode.VOUCHER_NO);
@SuppressWarnings("unchecked")
List<String> voucherNos = MapUtil.get(map,PayWayExtraCode.VOUCHER_NO_LIST,List.class);
List<String> list = new ArrayList<>();
if (StrUtil.isNotBlank(voucherNo)) {
if (CollUtil.isNotEmpty(voucherNos)){
list.addAll(voucherNos);
}
else if (StrUtil.isNotBlank(voucherNo)) {
list.add(voucherNo);
}
return JSONUtil.toJsonStr(new VoucherPayParam().setCardNoList(list));
}
case WALLET: {
String walletId = map.get(PayWayExtraCode.WALLET_ID);
String userId = map.get(PayWayExtraCode.USER_ID);
WalletPayParam walletPayParam = new WalletPayParam()
.setWalletId(Long.valueOf(walletId))
.setUserId(Long.valueOf(userId));
String walletId = MapUtil.getStr(map,PayWayExtraCode.WALLET_ID);
String userId = MapUtil.getStr(map,PayWayExtraCode.USER_ID);
WalletPayParam walletPayParam = new WalletPayParam();
if (StrUtil.isNotBlank(walletId)){
walletPayParam.setWalletId(Long.valueOf(walletId));
}
if (StrUtil.isNotBlank(userId)){
walletPayParam.setUserId(Long.valueOf(userId));
}
return JSONUtil.toJsonStr(walletPayParam);
}
default: {