|
@@ -25,6 +25,9 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
+import org.redisson.api.RLock;
|
|
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
|
|
+
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
@@ -33,6 +36,7 @@ import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 威富通支付服务
|
|
* 威富通支付服务
|
|
@@ -66,6 +70,19 @@ public class WFTOrderService {
|
|
|
@Resource
|
|
@Resource
|
|
|
private UserRefundsOrderInfoMapper userRefundsOrderInfoMapper;
|
|
private UserRefundsOrderInfoMapper userRefundsOrderInfoMapper;
|
|
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private RedissonClient redissonClient;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 退款分布式锁key前缀
|
|
|
|
|
+ */
|
|
|
|
|
+ private static final String REFUND_LOCK_KEY = "lock:refund:user:";
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 退款锁过期时间(秒)
|
|
|
|
|
+ */
|
|
|
|
|
+ private static final long REFUND_LOCK_EXPIRE = 60;
|
|
|
|
|
+
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 创建商户订单号
|
|
* 创建商户订单号
|
|
@@ -785,19 +802,49 @@ public class WFTOrderService {
|
|
|
*/
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public String refundOrder(Long userId, Integer type) throws Exception {
|
|
public String refundOrder(Long userId, Integer type) throws Exception {
|
|
|
|
|
+ // 获取分布式锁,防止同一用户并发退款
|
|
|
|
|
+ String lockKey = REFUND_LOCK_KEY + userId;
|
|
|
|
|
+ RLock lock = redissonClient.getLock(lockKey);
|
|
|
|
|
|
|
|
- //查询账户余额
|
|
|
|
|
|
|
+ boolean locked = false;
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 尝试获取锁,等待0秒,锁过期时间60秒
|
|
|
|
|
+ locked = lock.tryLock(0, REFUND_LOCK_EXPIRE, TimeUnit.SECONDS);
|
|
|
|
|
+ if (!locked) {
|
|
|
|
|
+ log.warn("用户:{}退款操作正在进行中,请勿重复提交", userId);
|
|
|
|
|
+ throw new BusinessException("退款操作正在进行中,请勿重复提交");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return doRefundOrder(userId, type);
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ // 释放锁
|
|
|
|
|
+ if (locked && lock.isHeldByCurrentThread()) {
|
|
|
|
|
+ lock.unlock();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 执行退款逻辑(内部方法)
|
|
|
|
|
+ */
|
|
|
|
|
+ private String doRefundOrder(Long userId, Integer type) throws Exception {
|
|
|
|
|
+ // 查询账户余额
|
|
|
UserAccount userAccount =
|
|
UserAccount userAccount =
|
|
|
userAccountService.getOne(Wrappers.<UserAccount>lambdaQuery().eq(UserAccount::getUserId, userId).last("limit 1"));
|
|
userAccountService.getOne(Wrappers.<UserAccount>lambdaQuery().eq(UserAccount::getUserId, userId).last("limit 1"));
|
|
|
|
|
+ if (userAccount == null) {
|
|
|
|
|
+ log.warn("用户:{}账户不存在", userId);
|
|
|
|
|
+ throw new BusinessException("账户信息异常,请联系客服处理");
|
|
|
|
|
+ }
|
|
|
log.info("用户:{},申请退款:{}", userId, userAccount.getBalance());
|
|
log.info("用户:{},申请退款:{}", userId, userAccount.getBalance());
|
|
|
- if (userAccount.getBalance().compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
|
- return "账户余额为 0";
|
|
|
|
|
|
|
+ if (userAccount.getBalance().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
+ return "账户余额不足,无法退款";
|
|
|
}
|
|
}
|
|
|
BigDecimal refundMoney = userAccount.getBalance();
|
|
BigDecimal refundMoney = userAccount.getBalance();
|
|
|
|
|
|
|
|
- //查询一年内已支付且可退款的所有券订单(已支付和部分退款状态)
|
|
|
|
|
|
|
+ // 查询一年内已支付且可退款的所有券订单(已支付和部分退款状态)
|
|
|
List<UserOrderInfo> userOrderInfoList = userOrderInfoMapper.selectList(Wrappers.<UserOrderInfo>lambdaQuery()
|
|
List<UserOrderInfo> userOrderInfoList = userOrderInfoMapper.selectList(Wrappers.<UserOrderInfo>lambdaQuery()
|
|
|
.eq(UserOrderInfo::getUserId, userId)
|
|
.eq(UserOrderInfo::getUserId, userId)
|
|
|
|
|
+ .ne(UserOrderInfo::getOrderType, 3) // 不为渠道方订单
|
|
|
.in(UserOrderInfo::getOrderStatus, SystemConstants.STATUS_TWO, SystemConstants.STATUS_FIVE)
|
|
.in(UserOrderInfo::getOrderStatus, SystemConstants.STATUS_TWO, SystemConstants.STATUS_FIVE)
|
|
|
.between(UserOrderInfo::getCreateTime, LocalDateTime.now().minusYears(1), LocalDateTime.now())
|
|
.between(UserOrderInfo::getCreateTime, LocalDateTime.now().minusYears(1), LocalDateTime.now())
|
|
|
.orderByDesc(UserOrderInfo::getCreateTime) // 按创建时间降序,优先退近期订单
|
|
.orderByDesc(UserOrderInfo::getCreateTime) // 按创建时间降序,优先退近期订单
|
|
@@ -808,7 +855,7 @@ public class WFTOrderService {
|
|
|
throw new BusinessException("无法进行退款操作,请联系客服处理!");
|
|
throw new BusinessException("无法进行退款操作,请联系客服处理!");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //查询是否存在正在充电的订单
|
|
|
|
|
|
|
+ // 查询是否存在正在充电的订单
|
|
|
List<ChargeOrderInfo> chargeOrderInfoList = chargeOrderInfoMapper.selectList(Wrappers.<ChargeOrderInfo>lambdaQuery()
|
|
List<ChargeOrderInfo> chargeOrderInfoList = chargeOrderInfoMapper.selectList(Wrappers.<ChargeOrderInfo>lambdaQuery()
|
|
|
.eq(ChargeOrderInfo::getUserId, userId)
|
|
.eq(ChargeOrderInfo::getUserId, userId)
|
|
|
.in(ChargeOrderInfo::getStatus, SystemConstants.STATUS_ONE, SystemConstants.STATUS_TWO)
|
|
.in(ChargeOrderInfo::getStatus, SystemConstants.STATUS_ONE, SystemConstants.STATUS_TWO)
|
|
@@ -819,69 +866,135 @@ public class WFTOrderService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
for (UserOrderInfo userOrderInfo : userOrderInfoList) {
|
|
for (UserOrderInfo userOrderInfo : userOrderInfoList) {
|
|
|
- if (refundMoney.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
|
|
|
+ if (refundMoney.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
// 处理退款金额为null的情况,默认为0
|
|
// 处理退款金额为null的情况,默认为0
|
|
|
BigDecimal alreadyRefundMoney = userOrderInfo.getRefundMoney() == null ? BigDecimal.ZERO : userOrderInfo.getRefundMoney();
|
|
BigDecimal alreadyRefundMoney = userOrderInfo.getRefundMoney() == null ? BigDecimal.ZERO : userOrderInfo.getRefundMoney();
|
|
|
BigDecimal canRefundMoney = userOrderInfo.getOrderMoney().subtract(alreadyRefundMoney);
|
|
BigDecimal canRefundMoney = userOrderInfo.getOrderMoney().subtract(alreadyRefundMoney);
|
|
|
|
|
|
|
|
- if (canRefundMoney.compareTo(refundMoney) >= 0) {
|
|
|
|
|
- //可退款金额大于等于待退款金额,则直接退全部待退款金额
|
|
|
|
|
- Long refundOrderId = refundOrder(userOrderInfo, refundMoney, "账户退款", type);
|
|
|
|
|
-
|
|
|
|
|
- //计算本次退款后的累计退款金额
|
|
|
|
|
- BigDecimal totalRefundMoney = alreadyRefundMoney.add(refundMoney);
|
|
|
|
|
- boolean isFullRefund = totalRefundMoney.compareTo(userOrderInfo.getOrderMoney()) >= 0;
|
|
|
|
|
-
|
|
|
|
|
- //账户变动及日志记录
|
|
|
|
|
- userAccountService.updateAccountBalanceAndLog(
|
|
|
|
|
- userId,
|
|
|
|
|
- refundMoney,
|
|
|
|
|
- SystemConstants.CHANGE_TYPE_REDUCE,
|
|
|
|
|
- SystemConstants.ACCOUNT_LOG_REFUND_NOTE,
|
|
|
|
|
- refundOrderId
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- //修改订单状态(判断是全额退款还是部分退款)
|
|
|
|
|
- if (isFullRefund) {
|
|
|
|
|
- // 退款金额等于或大于订单金额,全额退款
|
|
|
|
|
- userOrderInfo.setOrderStatus(SystemConstants.STATUS_FOUR);
|
|
|
|
|
- } else {
|
|
|
|
|
- // 退款金额小于订单金额,部分退款
|
|
|
|
|
- userOrderInfo.setOrderStatus(SystemConstants.STATUS_FIVE);
|
|
|
|
|
- }
|
|
|
|
|
- userOrderInfoMapper.updateById(userOrderInfo);
|
|
|
|
|
- refundMoney = BigDecimal.ZERO;
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
- if (canRefundMoney.compareTo(refundMoney) < 0) {
|
|
|
|
|
- //退款金额小于订单金额,则先退订单金额
|
|
|
|
|
- refundOrder(userOrderInfo, canRefundMoney, "账户退款", type);
|
|
|
|
|
- //账户变动及日志记录(减少账户余额)
|
|
|
|
|
- userAccountService.updateAccountBalanceAndLog(
|
|
|
|
|
- userId,
|
|
|
|
|
- canRefundMoney,
|
|
|
|
|
- SystemConstants.CHANGE_TYPE_REDUCE,
|
|
|
|
|
- SystemConstants.ACCOUNT_LOG_REFUND_NOTE,
|
|
|
|
|
- userOrderInfo.getId()
|
|
|
|
|
- );
|
|
|
|
|
- //修改订单状态(判断是全额退款还是部分退款)
|
|
|
|
|
- BigDecimal totalRefundMoney = alreadyRefundMoney.add(canRefundMoney);
|
|
|
|
|
- if (totalRefundMoney.compareTo(userOrderInfo.getOrderMoney()) >= 0) {
|
|
|
|
|
- // 退款金额等于订单金额,全额退款
|
|
|
|
|
- userOrderInfo.setOrderStatus(SystemConstants.STATUS_FOUR);
|
|
|
|
|
- } else {
|
|
|
|
|
- // 退款金额小于订单金额,部分退款
|
|
|
|
|
- userOrderInfo.setOrderStatus(SystemConstants.STATUS_FIVE);
|
|
|
|
|
- }
|
|
|
|
|
- userOrderInfoMapper.updateById(userOrderInfo);
|
|
|
|
|
- refundMoney = refundMoney.subtract(canRefundMoney);
|
|
|
|
|
|
|
+ // 防止异常数据导致可退款金额为负
|
|
|
|
|
+ if (canRefundMoney.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
+ log.warn("订单:{}可退款金额异常,orderMoney={},refundMoney={}",
|
|
|
|
|
+ userOrderInfo.getOrderNo(), userOrderInfo.getOrderMoney(), alreadyRefundMoney);
|
|
|
|
|
+ continue;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 确定本次退款金额
|
|
|
|
|
+ BigDecimal thisRefundAmount = canRefundMoney.compareTo(refundMoney) >= 0 ? refundMoney : canRefundMoney;
|
|
|
|
|
+
|
|
|
|
|
+ // 调用支付接口退款
|
|
|
|
|
+ Long refundOrderId = executeRefund(userOrderInfo, thisRefundAmount, "账户退款", type);
|
|
|
|
|
+
|
|
|
|
|
+ // 账户变动及日志记录
|
|
|
|
|
+ userAccountService.updateAccountBalanceAndLog(
|
|
|
|
|
+ userId,
|
|
|
|
|
+ thisRefundAmount,
|
|
|
|
|
+ SystemConstants.CHANGE_TYPE_REDUCE,
|
|
|
|
|
+ SystemConstants.ACCOUNT_LOG_REFUND_NOTE,
|
|
|
|
|
+ refundOrderId
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // 计算本次退款后的累计退款金额并更新订单状态
|
|
|
|
|
+ BigDecimal totalRefundMoney = alreadyRefundMoney.add(thisRefundAmount);
|
|
|
|
|
+ boolean isFullRefund = totalRefundMoney.compareTo(userOrderInfo.getOrderMoney()) >= 0;
|
|
|
|
|
+
|
|
|
|
|
+ // 更新订单退款金额和状态
|
|
|
|
|
+ userOrderInfo.setRefundMoney(totalRefundMoney);
|
|
|
|
|
+ userOrderInfo.setRefundTime(LocalDateTime.now());
|
|
|
|
|
+ userOrderInfo.setOrderStatus(isFullRefund ? SystemConstants.STATUS_FOUR : SystemConstants.STATUS_FIVE);
|
|
|
|
|
+ userOrderInfoMapper.updateById(userOrderInfo);
|
|
|
|
|
+
|
|
|
|
|
+ refundMoney = refundMoney.subtract(thisRefundAmount);
|
|
|
}
|
|
}
|
|
|
return "账户退款,预计3个工作日内分一笔或多笔退还!到期如未收到,请联系客服处理!";
|
|
return "账户退款,预计3个工作日内分一笔或多笔退还!到期如未收到,请联系客服处理!";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 执行单笔退款(调用支付接口)
|
|
|
|
|
+ * 职责:只负责调用支付接口和记录退款订单,不负责更新原订单状态
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param userOrderInfo 原订单信息
|
|
|
|
|
+ * @param refundAmount 退款金额
|
|
|
|
|
+ * @param reason 退款原因
|
|
|
|
|
+ * @param type 退款类型
|
|
|
|
|
+ * @return 退款订单ID
|
|
|
|
|
+ */
|
|
|
|
|
+ private Long executeRefund(UserOrderInfo userOrderInfo, BigDecimal refundAmount, String reason, Integer type) throws Exception {
|
|
|
|
|
+ log.info("进入退款接口------>退款金额:{}", refundAmount);
|
|
|
|
|
+ log.info("执行操作的 原支付交易对应的商户订单号:{}", userOrderInfo.getOrderNo());
|
|
|
|
|
+
|
|
|
|
|
+ // 退款单号
|
|
|
|
|
+ String outRefundNo = createOrderNo("TK", userOrderInfo.getId());
|
|
|
|
|
+
|
|
|
|
|
+ // 创建退款订单记录
|
|
|
|
|
+ UserRefundsOrderInfo userRefundsOrderInfo = new UserRefundsOrderInfo();
|
|
|
|
|
+ userRefundsOrderInfo.setOrderId(userOrderInfo.getId());
|
|
|
|
|
+ userRefundsOrderInfo.setOrderNo(userOrderInfo.getOrderNo());
|
|
|
|
|
+ userRefundsOrderInfo.setUserId(userOrderInfo.getUserId());
|
|
|
|
|
+ userRefundsOrderInfo.setOutRefundNo(outRefundNo);
|
|
|
|
|
+ userRefundsOrderInfo.setReason(reason);
|
|
|
|
|
+ userRefundsOrderInfo.setAmount(refundAmount);
|
|
|
|
|
+ userRefundsOrderInfo.setType(type);
|
|
|
|
|
+ userRefundsOrderInfo.setCreateTime(LocalDateTime.now());
|
|
|
|
|
+
|
|
|
|
|
+ // 构建支付接口参数
|
|
|
|
|
+ SortedMap<String, String> params = new TreeMap<>();
|
|
|
|
|
+ if (ObjectUtil.isNotEmpty(userOrderInfo.getTransactionId())) {
|
|
|
|
|
+ params.put("transaction_id", userOrderInfo.getTransactionId());
|
|
|
|
|
+ params.put("out_trade_no", userOrderInfo.getOrderNo());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ params.put("out_trade_no", userOrderInfo.getOutTradeNo()); // 1.0的商户订单号
|
|
|
|
|
+ }
|
|
|
|
|
+ params.put("out_refund_no", outRefundNo);
|
|
|
|
|
+ params.put("attach", reason);
|
|
|
|
|
+ params.put("total_fee", amount_fee(userOrderInfo.getOrderMoney()));
|
|
|
|
|
+ params.put("refund_fee", amount_fee(refundAmount));
|
|
|
|
|
+ params.put("sign_type", "RSA_1_256");
|
|
|
|
|
+
|
|
|
|
|
+ // 调用支付接口
|
|
|
|
|
+ PayUtill payUtill = new PayUtill();
|
|
|
|
|
+ Map<String, String> refund = payUtill.refund(params, swiftpassConfig);
|
|
|
|
|
+ log.info("威富通退款接口返回数据:{}", refund);
|
|
|
|
|
+
|
|
|
|
|
+ // 检查退款调用结果
|
|
|
|
|
+ if (!Objects.equals(refund.get("status"), "0")) {
|
|
|
|
|
+ log.error("退款接口调用失败,订单:{}, 返回:{}", userOrderInfo.getOrderNo(), refund);
|
|
|
|
|
+ throw new BusinessException("退款失败,请稍后重试或联系客服");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("退款调用成功!");
|
|
|
|
|
+ String resultCode = refund.get("result_code");
|
|
|
|
|
+
|
|
|
|
|
+ if (Objects.equals(resultCode, "0")) {
|
|
|
|
|
+ // 退款成功
|
|
|
|
|
+ log.info("订单:{},退款成功!原因:{}", userOrderInfo.getOrderNo(), reason);
|
|
|
|
|
+ userRefundsOrderInfo.setStatus("SUCCESS");
|
|
|
|
|
+ userRefundsOrderInfo.setSuccessTime(LocalDateTime.now());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 退款处理中
|
|
|
|
|
+ log.info("订单:{},退款处理中", userOrderInfo.getOrderNo());
|
|
|
|
|
+ userRefundsOrderInfo.setStatus("PROCESSING");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 保存退款记录
|
|
|
|
|
+ userRefundsOrderInfo.setRefundId(refund.get("refund_id"));
|
|
|
|
|
+ userRefundsOrderInfo.setNotifyRequest(refund.toString());
|
|
|
|
|
+ userRefundsOrderInfo.setTransactionId(userOrderInfo.getTransactionId());
|
|
|
|
|
+ userRefundsOrderInfo.setAcceptedTime(LocalDateTime.now());
|
|
|
|
|
+ userRefundsOrderInfoMapper.insert(userRefundsOrderInfo);
|
|
|
|
|
+
|
|
|
|
|
+ // 异步查询退款状态
|
|
|
|
|
+ if (userRefundsOrderInfo.getRefundId() != null) {
|
|
|
|
|
+ executeTaskQueryRefundOrder(userRefundsOrderInfo, userRefundsOrderInfo.getRefundId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return userRefundsOrderInfo.getId();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 执行单笔订单退款(外部调用接口,包含订单状态更新)
|
|
|
|
|
+ */
|
|
|
public Long refundOrder(UserOrderInfo userOrderInfo, BigDecimal refundAmount, String reason, Integer type) throws Exception {
|
|
public Long refundOrder(UserOrderInfo userOrderInfo, BigDecimal refundAmount, String reason, Integer type) throws Exception {
|
|
|
log.info("进入退款接口------>退款金额:{}",refundAmount);
|
|
log.info("进入退款接口------>退款金额:{}",refundAmount);
|
|
|
log.info("执行操作的 原支付交易对应的商户订单号:{}", userOrderInfo.getOrderNo());
|
|
log.info("执行操作的 原支付交易对应的商户订单号:{}", userOrderInfo.getOrderNo());
|
|
@@ -1143,12 +1256,12 @@ public class WFTOrderService {
|
|
|
public static void main(String[] args) throws IOException {
|
|
public static void main(String[] args) throws IOException {
|
|
|
SortedMap<String, String> params = new TreeMap<>();
|
|
SortedMap<String, String> params = new TreeMap<>();
|
|
|
SwiftpassConfig swiftpassConfig = new SwiftpassConfig();
|
|
SwiftpassConfig swiftpassConfig = new SwiftpassConfig();
|
|
|
- params.put("transaction_id", "2301202603032024626904");//商户订单号
|
|
|
|
|
|
|
+ params.put("transaction_id", "2301202603232029350379");//商户订单号
|
|
|
// params.put("out_trade_no", "ZSWL20251127000000019417");//商户订单号
|
|
// params.put("out_trade_no", "ZSWL20251127000000019417");//商户订单号
|
|
|
- params.put("out_refund_no", "TK2301202603032024626904");//商户退款单号
|
|
|
|
|
|
|
+ params.put("out_refund_no", "TK2301202603232029350379");//商户退款单号
|
|
|
params.put("attach", "");//退款原因
|
|
params.put("attach", "");//退款原因
|
|
|
- params.put("total_fee", "5000");//原订单金额
|
|
|
|
|
- params.put("refund_fee", "2737");//退款金额
|
|
|
|
|
|
|
+ params.put("total_fee", "500");//原订单金额
|
|
|
|
|
+ params.put("refund_fee", "500");//退款金额
|
|
|
params.put("sign_type", "RSA_1_256");
|
|
params.put("sign_type", "RSA_1_256");
|
|
|
PayUtill payUtill = new PayUtill();
|
|
PayUtill payUtill = new PayUtill();
|
|
|
swiftpassConfig.setKey("f5131b3f07acb965a59041b690a29911");
|
|
swiftpassConfig.setKey("f5131b3f07acb965a59041b690a29911");
|