mirror of
https://gitee.com/dromara/dax-pay.git
synced 2025-10-14 22:00:25 +00:00
feat 多卡支付适配
This commit is contained in:
@@ -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";
|
||||
|
||||
|
@@ -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()
|
||||
|
@@ -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 {
|
||||
|
@@ -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)
|
||||
|
@@ -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());
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
||||
// 对同步结果处理
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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: {
|
Reference in New Issue
Block a user