perf 支付/退款/转账商户订单号查询时根据AppId做隔离

This commit is contained in:
DaxPay
2024-10-08 19:27:44 +08:00
parent 01de34a3a2
commit a74c8e79a7
27 changed files with 56 additions and 99 deletions

View File

@@ -12,7 +12,7 @@
</p>
# Dromara Dax-Pay(开源支付系统-单商户版)
> **`multi-xxx` 相关分支为多商户版本, `single-xxx` 相关分支为单商户版本**
> **`multi-xxx` 相关分支为多商户版本, `single-xxx` 相关分支为单商户版本**, **目前都在最后阶段的开发中, 尽请期待**
## ❗使用须知

View File

@@ -4,8 +4,8 @@
- [x] 增加延时队列的可视页面
- [ ] 增加首页驾驶舱功能
- [ ] 定时同步任务频次不要太高, 预防产生过多的数据
- [ ] 转账接收方类型优化
- [ ] 支付/退款/转账商户订单号根据AppId做隔离
- [x] 转账接收方类型优化
- [x] 支付/退款/转账商户订单号查询时根据AppId做隔离
- [ ] 云闪付支付通道对接
- [ ] 分账功能
- [x] 分账接收方配置

View File

@@ -72,7 +72,7 @@ public class AliPayConfigService {
public void save(AliPayConfigParam param) {
AliPayConfig entity = AlipayConfigConvert.CONVERT.toEntity(param);
ChannelConfig channelConfig = entity.toChannelConfig();
// 判断商户应用下是否存在该配置
// 判断商户应用下是否存在该配置
if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){
throw new DataErrorException("该应用下已存在支付宝配置, 请勿重新添加");
}

View File

@@ -63,7 +63,7 @@ public class UnionPayConfigService {
public void save(UnionPayConfigParam param) {
UnionPayConfig entity = UnionPayConfigConvert.CONVERT.toEntity(param);
ChannelConfig channelConfig = entity.toChannelConfig();
// 判断商户应用下是否存在该配置
// 判断商户应用下是否存在该配置
if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){
throw new DataErrorException("该应用下已存在云闪付配置, 请勿重新添加");
}

View File

@@ -65,7 +65,7 @@ public class WechatPayConfigService {
public void save(WechatPayConfigParam param) {
WechatPayConfig entity = WechatPayConfigConvert.CONVERT.toEntity(param);
ChannelConfig channelConfig = entity.toChannelConfig();
// 判断商户应用下是否存在该配置
// 判断商户应用下是否存在该配置
if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){
throw new DataErrorException("该应用下已存在微信配置, 请勿重新添加");
}

View File

@@ -12,7 +12,7 @@ import java.lang.annotation.*;
*
* 注解实现的功能(按先后顺序): <br/>
* 1. 参数校验
* 2. 商户应用信息初始化
* 2. 商户应用信息初始化
* 3. 终端信息初始化
* 4. 参数签名校验
* 5. 参数请求时间校验

View File

@@ -49,13 +49,6 @@ public class TransferOrderController {
return Res.ok(queryService.findByTransferNo(transferNo));
}
@RequestPath("根据商户转账号查询")
@Operation(summary = "根据商户转账号查询")
@GetMapping("/findByBizTransferNo")
public Result<TransferOrderVo> findByBizTransferNo(String bizTransferNo){
return Res.ok(queryService.findByBizTransferNo(bizTransferNo));
}
@RequestPath("查询单条")
@Operation(summary = "查询单条")
@GetMapping("/findById")

View File

@@ -34,12 +34,4 @@ public class MerchantCallbackTaskManager extends BaseManager<MerchantCallbackTas
QueryWrapper<MerchantCallbackTask> generator = QueryGenerator.generator(query);
return this.page(mpPage, generator);
}
/**
* 获取数据, 不过滤租户
*/
@IgnoreTenant
public Optional<MerchantCallbackTask> findByIdNotTenant(Long taskId) {
return this.findById(taskId);
}
}

View File

@@ -34,11 +34,4 @@ public class MerchantNotifyTaskManager extends BaseManager<MerchantNotifyTaskMap
return this.page(mpPage, generator);
}
/**
* 获取数据, 不经过租户
*/
@IgnoreTenant
public Optional<MerchantNotifyTask> findByIdNotTenant(Long taskId) {
return this.findById(taskId);
}
}

View File

@@ -40,8 +40,11 @@ public class PayOrderManager extends BaseManager<PayOrderMapper, PayOrder> {
/**
* 根据商户订单号查询
*/
public Optional<PayOrder> findByBizOrderNo(String bizOrderNo) {
return findByField(PayOrder::getBizOrderNo,bizOrderNo);
public Optional<PayOrder> findByBizOrderNo(String bizOrderNo, String appId) {
return lambdaQuery()
.eq(PayOrder::getBizOrderNo,bizOrderNo)
.eq(PayOrder::getAppId,appId)
.oneOpt();
}
/**
@@ -81,7 +84,7 @@ public class PayOrderManager extends BaseManager<PayOrderMapper, PayOrder> {
*/
public BigDecimal getTotalAmount(PayOrderQuery query){
QueryWrapper<PayOrder> generator = QueryGenerator.generator(query);
// 商户应用AppId
// 商户应用AppId
generator.eq(MpUtil.getColumnName(PayOrder::getStatus), PayStatusEnum.SUCCESS.getCode());
return baseMapper.getTotalAmount(generator);
}
@@ -97,11 +100,4 @@ public class PayOrderManager extends BaseManager<PayOrderMapper, PayOrder> {
.list();
}
/**
* 查询订单, 不过滤租户
*/
@IgnoreTenant
public Optional<PayOrder> findByIdNotTenant(Long id) {
return this.findById(id);
}
}

View File

@@ -50,8 +50,11 @@ public class RefundOrderManager extends BaseManager<RefundOrderMapper, RefundOrd
/**
* 根据商户退款号查询
*/
public Optional<RefundOrder> findByBizRefundNo(String bizRefundNo) {
return findByField(RefundOrder::getBizRefundNo, bizRefundNo);
public Optional<RefundOrder> findByBizRefundNo(String bizRefundNo, String appId) {
return lambdaQuery()
.eq(RefundOrder::getBizRefundNo,bizRefundNo)
.eq(RefundOrder::getAppId,appId)
.oneOpt();
}
/**
@@ -92,12 +95,4 @@ public class RefundOrderManager extends BaseManager<RefundOrderMapper, RefundOrd
generator.eq(MpUtil.getColumnName(RefundOrder::getStatus), RefundStatusEnum.SUCCESS.getCode());
return baseMapper.getTotalAmount(generator);
}
/**
* 查询订单, 不过滤租户
*/
public Optional<RefundOrder> findByIdNotTenant(Long id) {
return findById(id);
}
}

View File

@@ -62,8 +62,11 @@ public class TransferOrderManager extends BaseManager<TransferOrderMapper, Trans
/**
* 根据商户转账号查询
*/
public Optional<TransferOrder> findByBizTransferNo(String bizTransferNo) {
return findByField(TransferOrder::getBizTransferNo, bizTransferNo);
public Optional<TransferOrder> findByBizTransferNo(String bizTransferNo, String appId) {
return lambdaQuery()
.eq(TransferOrder::getBizTransferNo, bizTransferNo)
.eq(TransferOrder::getAppId, appId)
.oneOpt();
}
/**
@@ -75,10 +78,4 @@ public class TransferOrderManager extends BaseManager<TransferOrderMapper, Trans
return baseMapper.getTotalAmount(generator);
}
/**
* 查询订单, 不过滤租户
*/
public Optional<TransferOrder> findByIdNotTenant(Long id) {
return findById(id);
}
}

View File

@@ -58,19 +58,19 @@ public class PayOrderQueryService {
/**
* 根据商户订单号查询
*/
public Optional<PayOrder> findByBizOrderNo(String bizOrderNo) {
return payOrderManager.findByBizOrderNo(bizOrderNo);
public Optional<PayOrder> findByBizOrderNo(String bizOrderNo, String appId) {
return payOrderManager.findByBizOrderNo(bizOrderNo, appId);
}
/**
* 根据订单号或商户订单号查询
*/
public Optional<PayOrder> findByBizOrOrderNo(String orderNo, String bizOrderNo) {
public Optional<PayOrder> findByBizOrOrderNo(String orderNo, String bizOrderNo, String appId) {
if (Objects.nonNull(orderNo)){
return this.findByOrderNo(orderNo);
}
if (Objects.nonNull(bizOrderNo)){
return this.findByBizOrderNo(bizOrderNo);
return this.findByBizOrderNo(bizOrderNo,appId);
}
return Optional.empty();
}
@@ -84,7 +84,7 @@ public class PayOrderQueryService {
throw new ValidationFailedException("业务号或支付单ID不能都为空");
}
// 查询支付单
return this.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNoeNo())
return this.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNoeNo(),param.getAppId())
.map(PayOrderConvert.CONVERT::toResult)
.orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
}

View File

@@ -30,7 +30,7 @@ public class PayOrderService {
*/
public void sync(Long id) {
PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(payOrder.getAppId());
paySyncService.syncPayOrder(payOrder);
}
@@ -40,7 +40,7 @@ public class PayOrderService {
*/
public void close(Long id) {
PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(payOrder.getAppId());
payCloseService.closeOrder(payOrder,false);
}
@@ -50,7 +50,7 @@ public class PayOrderService {
*/
public void cancel(Long id) {
PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(payOrder.getAppId());
payCloseService.closeOrder(payOrder,true);
}

View File

@@ -62,11 +62,11 @@ public class RefundOrderQueryService {
/**
* 根据退款号和商户退款号查询
*/
public Optional<RefundOrder> findByBizOrRefundNo(String refundNo, String bizRefundNo) {
public Optional<RefundOrder> findByBizOrRefundNo(String refundNo, String bizRefundNo, String appId) {
if (StrUtil.isNotBlank(refundNo)){
return refundOrderManager.findByRefundNo(refundNo);
} else if (StrUtil.isNotBlank(bizRefundNo)){
return refundOrderManager.findByBizRefundNo(bizRefundNo);
return refundOrderManager.findByBizRefundNo(bizRefundNo,appId);
} else {
return Optional.empty();
}
@@ -81,7 +81,7 @@ public class RefundOrderQueryService {
throw new ValidationFailedException("退款号或商户退款号不能都为空");
}
// 查询退款单
RefundOrder refundOrder = this.findByBizOrRefundNo(param.getRefundNo(), param.getBizRefundNo())
RefundOrder refundOrder = this.findByBizOrRefundNo(param.getRefundNo(), param.getBizRefundNo(), param.getAppId())
.orElseThrow(() -> new TradeNotExistException("退款订单不存在"));
return RefundOrderConvert.CONVERT.toResult(refundOrder);

View File

@@ -54,7 +54,7 @@ public class RefundOrderService {
var payOrder = payOrderManager.findByOrderNo(param.getOrderNo())
.orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(payOrder.getAppId());
String ip = Optional.ofNullable(WebServletUtil.getRequest())
@@ -78,7 +78,7 @@ public class RefundOrderService {
public void sync(Long id) {
RefundOrder refundOrder = refundOrderManager.findById(id)
.orElseThrow(() -> new TradeNotExistException("退款订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(refundOrder.getAppId());
// 同步退款订单状态
refundSyncService.syncRefundOrder(refundOrder);
@@ -90,7 +90,7 @@ public class RefundOrderService {
public void retry(Long id) {
RefundOrder refundOrder = refundOrderManager.findById(id)
.orElseThrow(() -> new TradeNotExistException("退款订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(refundOrder.getAppId());
String ip = Optional.ofNullable(WebServletUtil.getRequest())
@@ -115,7 +115,7 @@ public class RefundOrderService {
public void close(Long id) {
RefundOrder refundOrder = refundOrderManager.findById(id)
.orElseThrow(() -> new TradeNotExistException("退款订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(refundOrder.getAppId());
if (!Objects.equals(refundOrder.getStatus(), RefundStatusEnum.FAIL.getCode())) {
throw new TradeStatusErrorException("只有失败状态的才可以关闭退款");

View File

@@ -59,23 +59,14 @@ public class TransferOrderQueryService {
}
/**
* 根据转账号查询
*/
public TransferOrderVo findByBizTransferNo(String bizTransferNo){
return transferOrderManager.findByBizTransferNo(bizTransferNo).map(TransferOrder::toResult)
.orElseThrow(() -> new DataNotExistException("转账订单信息不存在"));
}
/**
* 根据转账号和商户转账号查询
*/
public Optional<TransferOrder> findByBizOrTransferNo(String transferNo, String bizTransferNo) {
public Optional<TransferOrder> findByBizOrTransferNo(String transferNo, String bizTransferNo,String appId) {
if (StrUtil.isNotBlank(transferNo)){
return transferOrderManager.findByTransferNo(transferNo);
} else if (StrUtil.isNotBlank(bizTransferNo)){
return transferOrderManager.findByBizTransferNo(bizTransferNo);
return transferOrderManager.findByBizTransferNo(bizTransferNo,appId);
} else {
return Optional.empty();
}
@@ -91,7 +82,7 @@ public class TransferOrderQueryService {
throw new ValidationFailedException("转账号或商户转账号不能都为空");
}
// 查询转账单
TransferOrder transferOrder = this.findByBizOrTransferNo(param.getTransferNo(), param.getBizTransferNo())
TransferOrder transferOrder = this.findByBizOrTransferNo(param.getTransferNo(), param.getBizTransferNo(), param.getAppId())
.orElseThrow(() -> new TradeNotExistException("转账订单不存在"));
return TransferOrderConvert.CONVERT.toResult(transferOrder);

View File

@@ -41,7 +41,7 @@ public class TransferOrderService {
public void sync(Long id) {
var transferOrder = transferOrderManager.findById(id)
.orElseThrow(() -> new TradeNotExistException("转账订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(transferOrder.getAppId());
// 同步转账订单状态
transferSyncService.syncTransferOrder(transferOrder);
@@ -53,7 +53,7 @@ public class TransferOrderService {
public void retry(Long id) {
var transferOrder = transferOrderManager.findById(id)
.orElseThrow(() -> new TradeNotExistException("转账订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(transferOrder.getAppId());
String ip = Optional.ofNullable(WebServletUtil.getRequest())
@@ -77,7 +77,7 @@ public class TransferOrderService {
public void close(Long id) {
var transferOrder = transferOrderManager.findById(id)
.orElseThrow(() -> new TradeNotExistException("转账订单不存在"));
// 初始化商户应用
// 初始化商户应用
paymentAssistService.initMchApp(transferOrder.getAppId());
// 更新订单状态
if (!Objects.equals(TransferStatusEnum.FAIL.getCode(), transferOrder.getStatus())){

View File

@@ -99,7 +99,7 @@ public class ReconcileStatementService {
if (statement.isDownOrUpload()){
throw new OperationFailException("对账单文件已经下载或上传");
}
// 初始化对商户应用上下文
// 初始化对商户应用上下文
paymentAssistService.initMchApp(statement.getAppId());
// 构建对账策略

View File

@@ -94,9 +94,9 @@ public class PayAssistService {
/**
* 校验支付状态,支付成功则返回,支付失败则抛出对应的异常
*/
public PayOrder getOrderAndCheck(String bizOrderNo) {
public PayOrder getOrderAndCheck(PayParam param) {
// 根据订单查询支付记录
PayOrder payOrder = payOrderQueryService.findByBizOrderNo(bizOrderNo)
PayOrder payOrder = payOrderQueryService.findByBizOrderNo(param.getBizOrderNo(), param.getAppId())
.orElse(null);
if (Objects.nonNull(payOrder)) {
// 待支付

View File

@@ -46,7 +46,7 @@ public class PayCloseService {
* 关闭支付
*/
public void close(PayCloseParam param){
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo())
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getAppId())
.orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
this.closeOrder(payOrder, param.isUseCancel());

View File

@@ -55,7 +55,7 @@ public class PayService {
}
try {
// 查询并检查订单
PayOrder payOrder = payAssistService.getOrderAndCheck(payParam.getBizOrderNo());
PayOrder payOrder = payAssistService.getOrderAndCheck(payParam);
// 走首次下单逻辑还是重复下档逻辑
if (Objects.isNull(payOrder)){
return this.firstPay(payParam);

View File

@@ -59,7 +59,7 @@ public class PaySyncService {
*/
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public PaySyncResult sync(PaySyncParam param) {
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo())
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getAppId())
.orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
// 执行订单同步逻辑
return this.syncPayOrder(payOrder);

View File

@@ -76,7 +76,7 @@ public class RefundService {
}
try {
// 判断是否是首次发起退款
Optional<RefundOrder> refund = refundOrderManager.findByBizRefundNo(param.getBizRefundNo());
Optional<RefundOrder> refund = refundOrderManager.findByBizRefundNo(param.getBizRefundNo(), param.getAppId());
if (refund.isPresent()){
return this.repeatRefund(refund.get(),param);
} else {
@@ -93,7 +93,7 @@ public class RefundService {
private RefundResult firstRefund(RefundParam param) {
// 获取支付订单
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo())
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getAppId())
.orElseThrow(() -> new DataNotExistException("支付订单不存在"));
// 检查退款参数
refundAssistService.checkAndParam(param, payOrder);
@@ -146,7 +146,7 @@ public class RefundService {
throw new TradeStatusErrorException("只有失败状态的才可以重新发起退款");
}
// 获取支付订单
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(refundOrder.getOrderNo(), refundOrder.getBizOrderNo())
PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(refundOrder.getOrderNo(), refundOrder.getBizOrderNo(), refundOrder.getAppId())
.orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
AbsRefundStrategy refundStrategy = PaymentStrategyFactory.create(refundOrder.getChannel(), AbsRefundStrategy.class);
// 设置退款订单对象

View File

@@ -52,7 +52,7 @@ public class RefundSyncService {
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public RefundSyncResult sync(RefundSyncParam param){
// 先获取退款单
RefundOrder refundOrder = refundOrderQueryService.findByBizOrRefundNo(param.getRefundNo(), param.getBizRefundNo())
RefundOrder refundOrder = refundOrderQueryService.findByBizOrRefundNo(param.getRefundNo(), param.getBizRefundNo(),param.getAppId())
.orElseThrow(() -> new TradeNotExistException("未查询到退款订单"));
return this.syncRefundOrder(refundOrder);
}

View File

@@ -57,7 +57,7 @@ public class TransferService {
}
try {
// 判断是否是首次发起转账
var transferOrder = transferOrderManager.findByBizTransferNo(param.getBizTransferNo());
var transferOrder = transferOrderManager.findByBizTransferNo(param.getBizTransferNo(), param.getAppId());
if (transferOrder.isPresent()){
return this.repeatTransfer(transferOrder.get(),param);
} else {

View File

@@ -53,7 +53,7 @@ public class TransferSyncService {
* 转账同步接口
*/
public TransferSyncResult sync(TransferSyncParam param) {
TransferOrder transferOrder = transferOrderService.findByBizOrTransferNo(param.getTransferNo(), param.getBizTransferNo())
TransferOrder transferOrder = transferOrderService.findByBizOrTransferNo(param.getTransferNo(), param.getBizTransferNo(),param.getAppId())
.orElseThrow(() -> new TradeNotExistException("退款订单不存在"));
// 执行订单同步逻辑
return this.syncTransferOrder(transferOrder);