feat: 自动分账/自动完结/自动同步状态功能实现

This commit is contained in:
bootx
2024-12-17 22:27:27 +08:00
parent aa6505e5ae
commit b5d10f1ead
16 changed files with 193 additions and 68 deletions

View File

@@ -1,14 +1,20 @@
# CHANGELOG
## [v3.0.0.beta3] 2024-12-05
- 新增: 增加支付宝分账功能
- 新增: 支付宝分账功能
- 新增: 分账发起和分账完结功能
- 新增: 增加分账接收方配置功能
## [v3.0.0.beta3] 2024-12-22
- 新增: 支持支付宝分账功能
- 新增: 支持微信分账功能
- 新增: 支持分账发起和分账完结功能
- 新增: 支持分账接收方配置功能
- 新增: 支持支付订单自动分账功能
- 新增: 自动同步分账订单状态功能
- 新增: 分账回调通知和分账消息通知功能
- 新增: 自动完结分账订单功能
- 新增: 分账同步功能
- 优化: 调整分账接收者和分账组配置立即
- 优化: 升级wxjava4.6.9.B并处理证书配置问题
- 优化: 调整分账接收者和分账组配置逻辑
- fix: 修复微信v2当面付发起失败问题
- fix sm3签名校验问题
- fix SDK参数和返回对象与接口不一致修改
- fix: 修复微信v2分账参数未设置问题
- fix: sm3签名校验问题
- fix: SDK参数和返回对象与接口不一致修改
## [v3.0.0.beta2] 2024-12-05
- 新增: 增加PC收银台功能

View File

@@ -16,13 +16,12 @@
- [x] 分账接口开发
- [x] 支付宝
- [x] 微信
- [ ] 分账扩展能力
- [ ] 自动分账
- [ ] 自动完
- [ ] 自动同步状态
- [x] 分账扩展能力
- [x] 自动分账
- [x] 自动完
- [x] 自动同步状态
- [x] 分账消息通知和回调
- [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成
- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况
- [x] 支付订单新增待支付状态
## 3.0.0.beta2 收银台
- [x] 收银台功能
@@ -47,7 +46,8 @@
- [x] 一个应用支持多码牌
- [x] 码牌不再使用应用号作为标识, 使用独立的编码
- [x] 码牌H5页面对接
- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面
- [x] 分账配置/分账组/分账接收方合并为一个tabs页面
- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况
## 3.0.0.beta1 收银台
- [x] 收银台功能
- [x] 收银台配置

View File

@@ -17,7 +17,6 @@ import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService;
import org.dromara.daxpay.channel.wechat.util.WechatPayUtil;
import org.dromara.daxpay.core.enums.AllocDetailResultEnum;
import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum;
import org.dromara.daxpay.core.enums.AllocationStatusEnum;
import org.dromara.daxpay.core.exception.ConfigErrorException;
import org.dromara.daxpay.core.exception.OperationFailException;
import org.dromara.daxpay.core.util.PayUtil;
@@ -37,6 +36,7 @@ import java.util.stream.Collectors;
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO;
import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID;
import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*;
/**
* 微信分账V3版本接口
@@ -112,7 +112,7 @@ public class WeChatPayAllocationV3Service {
ProfitSharingService sharingService = wxPayService.getProfitSharingService();
// 根据订单状态判断 使用ID还是分账号
String outOrderNo;
if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){
if (List.of(PROCESSING.getCode(),ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){
outOrderNo = allocOrder.getAllocNo();
} else {
outOrderNo = String.valueOf(allocOrder.getId());

View File

@@ -45,7 +45,7 @@ public class UniAllocationController {
@Operation(summary = "发起分账接口")
@PostMapping("/start")
public DaxResult<AllocationResult> start(@RequestBody AllocationParam param){
return DaxRes.ok(allocationService.allocation(param));
return DaxRes.ok(allocationService.start(param));
}
@Operation(summary = "分账完结接口")

View File

@@ -17,7 +17,7 @@ import java.util.Optional;
@Slf4j
@Repository
@RequiredArgsConstructor
public class AllocConfigManger extends BaseManager<AllocConfigMapper, AllocConfig> {
public class AllocConfigManager extends BaseManager<AllocConfigMapper, AllocConfig> {
/**
* 判断是都已经存在数据

View File

@@ -11,6 +11,7 @@ import org.dromara.daxpay.service.param.allocation.AllocConfigParam;
import org.dromara.daxpay.service.result.allocation.AllocConfigResult;
import java.math.BigDecimal;
import java.util.Objects;
/**
* 分账配置
@@ -36,6 +37,14 @@ public class AllocConfig extends MchAppBaseEntity implements ToResult<AllocConfi
private Integer delayTime;
public Boolean getAutoFinish() {
return Objects.equals(autoFinish, true);
}
public Boolean getAutoAlloc() {
return Objects.equals(autoAlloc, true);
}
/**
* 创建对象
*/

View File

@@ -5,6 +5,9 @@ import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.service.code.DaxPayCode;
import org.dromara.daxpay.service.service.allocation.AllocationService;
import org.dromara.daxpay.service.service.allocation.AllocationSyncService;
import org.dromara.daxpay.service.service.order.pay.PayOrderService;
import org.springframework.stereotype.Service;
/**
@@ -16,13 +19,18 @@ import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AllocationEventService {
private final AllocationSyncService syncService;
private final AllocationService allocationService;
private final PayOrderService payOrderService;
/**
* 自动分账 参数为订单号
*/
@DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_START)
public void start(DelayJobEvent<Long> event) {
payOrderService.autoAllocation(event.getMessage());
log.info("分账开始,订单号:{}", event.getMessage());
}
@@ -31,11 +39,16 @@ public class AllocationEventService {
*/
@DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_SYNC)
public void sync(DelayJobEvent<Long> event) {
syncService.sync(event.getMessage());
log.info("分账同步,订单号:{}", event.getMessage());
}
/**
* 分账完结
*/
@DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_FINISH)
public void finish(DelayJobEvent<Long> event) {
log.info("分账完成,订单号:{}", event.getMessage());
allocationService.autoFinish(event.getMessage());
log.info("分账完结,订单号:{}", event.getMessage());
}
}

View File

@@ -49,8 +49,8 @@ public class TradeOrderEventService {
Optional<PayOrder> orderOpt = payOrderManager.findById(event.getMessage());
if (orderOpt.isPresent()) {
PayOrder payOrder = orderOpt.get();
// 不是支付中不需要进行同步
if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode())|| payOrder.getStatus().equals(PayStatusEnum.TIMEOUT.getCode())) {
// 不是支付中和支付超时不需要进行同步
if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode()) || payOrder.getStatus().equals(PayStatusEnum.TIMEOUT.getCode())) {
paymentAssistService.initMchApp(payOrder.getAppId());
paySyncService.syncPayOrder(payOrder);
}

View File

@@ -7,7 +7,7 @@ import cn.hutool.core.bean.copier.CopyOptions;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert;
import org.dromara.daxpay.service.dao.config.AllocConfigManger;
import org.dromara.daxpay.service.dao.config.AllocConfigManager;
import org.dromara.daxpay.service.entity.allocation.AllocConfig;
import org.dromara.daxpay.service.param.allocation.AllocConfigParam;
import org.dromara.daxpay.service.result.allocation.AllocConfigResult;
@@ -22,36 +22,36 @@ import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AllocConfigService {
private final AllocConfigManger allocConfigManger;
private final AllocConfigManager allocConfigManager;
/**
* 新增
*/
public void save(AllocConfigParam param) {
// 判断是否已经存在
if (allocConfigManger.existsByAppId(param.getAppId())){
if (allocConfigManager.existsByAppId(param.getAppId())){
throw new RepetitiveOperationException("该应用已存在收银台配置");
}
AllocConfig entity = AllocConfigConvert.CONVERT.toEntity(param);
allocConfigManger.save(entity);
allocConfigManager.save(entity);
}
/**
* 修改
*/
public void update(AllocConfigParam param) {
AllocConfig config = allocConfigManger.findById(param.getId())
AllocConfig config = allocConfigManager.findById(param.getId())
.orElseThrow(() -> new DataNotExistException("分账配置不存在"));
BeanUtil.copyProperties(param, config, CopyOptions.create().ignoreNullValue());
allocConfigManger.updateById(config);
allocConfigManager.updateById(config);
}
/**
* 根据AppId查询
*/
public AllocConfigResult findByAppId(String appId) {
return allocConfigManger.findByAppId(appId).map(AllocConfig::toResult)
return allocConfigManager.findByAppId(appId).map(AllocConfig::toResult)
.orElse(new AllocConfigResult().setAutoAlloc(false));
}

View File

@@ -2,12 +2,14 @@ package org.dromara.daxpay.service.service.allocation;
import cn.bootx.platform.core.exception.DataNotExistException;
import cn.bootx.platform.core.exception.RepetitiveOperationException;
import cn.bootx.platform.starter.redis.delay.service.DelayJobService;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.core.enums.AllocationResultEnum;
import org.dromara.daxpay.core.enums.AllocationStatusEnum;
import org.dromara.daxpay.core.enums.PayStatusEnum;
import org.dromara.daxpay.core.exception.DataErrorException;
import org.dromara.daxpay.core.exception.TradeStatusErrorException;
import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam;
@@ -16,9 +18,12 @@ import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam
import org.dromara.daxpay.core.result.allocation.AllocationResult;
import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult;
import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo;
import org.dromara.daxpay.service.code.DaxPayCode;
import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert;
import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager;
import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager;
import org.dromara.daxpay.service.dao.config.AllocConfigManager;
import org.dromara.daxpay.service.entity.allocation.AllocConfig;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
@@ -35,6 +40,7 @@ import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import static org.dromara.daxpay.core.enums.AllocationStatusEnum.ALLOC_END;
@@ -54,7 +60,6 @@ public class AllocationService {
private final AllocDetailManager allocOrderDetailManager;
private final LockTemplate lockTemplate;
private final PaymentAssistService paymentAssistService;
@@ -62,13 +67,18 @@ public class AllocationService {
private final AllocOrderQueryService allocOrderQueryService;
private final AllocOrderService allocOrderService;
private final MerchantNoticeService merchantNoticeService;
private final DelayJobService delayJobService;
private final AllocConfigManager allocConfigManager;
/**
* 开启分账 多次请求只会分账一次
* 优先级 分账接收方列表 > 分账组编号 > 默认分账组
*/
public AllocationResult allocation(AllocationParam param) {
public AllocationResult start(AllocationParam param) {
// 判断是否已经有分账订单
var allocOrder = allocationOrderManager.findByBizAllocNo(param.getBizAllocNo(), param.getAppId()).orElse(null);
if (Objects.nonNull(allocOrder)){
@@ -77,14 +87,14 @@ public class AllocationService {
} else {
// 首次分账
PayOrder payOrder = allocOrderQueryService.getAndCheckPayOrder(param);
return this.allocation(param, payOrder);
return this.start(param, payOrder);
}
}
/**
* 开启分账 优先级 分账接收方列表 > 分账组编号 > 默认分账组
*/
public AllocationResult allocation(AllocationParam param, PayOrder payOrder) {
public AllocationResult start(AllocationParam param, PayOrder payOrder) {
LockInfo lock = lockTemplate.lock("payment:allocation:" + payOrder.getId(),10000,200);
if (Objects.isNull(lock)){
throw new RepetitiveOperationException("分账发起处理中,请勿重复操作");
@@ -120,9 +130,10 @@ public class AllocationService {
// 失败
order.setStatus(AllocationStatusEnum.ALLOC_FAILED.getCode())
.setErrorMsg(e.getMessage());
// TODO 返回异常处理
}
allocationOrderManager.updateById(order);
// 注册两分钟后的分账同步事件
delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_ALLOC_SYNC, 2*60*1000L);
return new AllocationResult()
.setAllocNo(order.getAllocNo())
.setBizAllocNo(order.getBizAllocNo())
@@ -132,6 +143,25 @@ public class AllocationService {
}
}
/**
* 注册自动分账事件
*/
public void registerAutoAlloc(PayOrder payOrder) {
// 订单是否完成
if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){
return;
}
// 是否开启自动分账
if (payOrder.getAllocation() && payOrder.getAutoAllocation()){
AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null);
if (Objects.nonNull(allocConfig)&&allocConfig.getAutoAlloc()){
// 注册定时执行的分账完结任务, 如果未设置默认为一天后进行分账
Integer delayTime = Optional.ofNullable(allocConfig.getDelayTime()).orElse(24*60);
delayJobService.registerByTransaction(payOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_START, delayTime*60*1000L);
}
}
}
/**
* 分账重试
*/
@@ -190,6 +220,22 @@ public class AllocationService {
}
}
/**
* 自动分账完结
*/
public void autoFinish(Long id) {
AllocOrder allocOrder = allocationOrderManager.findById(id).orElse(null);
if (Objects.isNull(allocOrder)){
log.warn("分账完结自动处理失败,分账单不存在:{}", id);
return;
}
if (!Arrays.asList(ALLOC_END.getCode(),FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) {
log.warn("忽略分账完结自动处理,分账单状态不正确:{}", allocOrder.getStatus());
return;
}
paymentAssistService.initMchApp(allocOrder.getAppId());
this.finish(allocOrder);
}
/**
* 分账完结

View File

@@ -2,6 +2,7 @@ package org.dromara.daxpay.service.service.allocation;
import cn.bootx.platform.core.exception.DataNotExistException;
import cn.bootx.platform.core.exception.RepetitiveOperationException;
import cn.bootx.platform.starter.redis.delay.service.DelayJobService;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import lombok.RequiredArgsConstructor;
@@ -13,9 +14,12 @@ import org.dromara.daxpay.core.enums.TradeTypeEnum;
import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam;
import org.dromara.daxpay.core.result.allocation.AllocSyncResult;
import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo;
import org.dromara.daxpay.service.code.DaxPayCode;
import org.dromara.daxpay.service.common.local.PaymentContextLocal;
import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager;
import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager;
import org.dromara.daxpay.service.dao.config.AllocConfigManager;
import org.dromara.daxpay.service.entity.allocation.AllocConfig;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail;
import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder;
import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord;
@@ -50,6 +54,8 @@ public class AllocationSyncService {
private final LockTemplate lockTemplate;
private final PaymentAssistService paymentAssistService;
private final MerchantNoticeService merchantNoticeService;
private final AllocConfigManager allocConfigManager;
private final DelayJobService delayJobService;
/**
* 分账同步
@@ -101,6 +107,7 @@ public class AllocationSyncService {
if (Objects.isNull(lock)){
throw new RepetitiveOperationException("分账同步中,请勿重复操作");
}
String beforeStatus = allocOrder.getStatus();
try {
List<AllocDetail> detailList = allocOrderDetailManager.findAllByOrderId(allocOrder.getId());
// 获取分账策略
@@ -114,7 +121,7 @@ public class AllocationSyncService {
this.saveRecord(allocOrder, allocSyncResultBo);
// 根据订单明细更新订单的状态和处理结果
allocOrder.setErrorMsg(null).setErrorCode(null);
this.updateOrderStatus(allocOrder, detailList);
this.updateOrderStatus(allocOrder, detailList,beforeStatus);
} finally {
lockTemplate.releaseLock(lock);
}
@@ -123,49 +130,58 @@ public class AllocationSyncService {
/**
* 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态
*/
private void updateOrderStatus(AllocOrder allocOrder, List<AllocDetail> details){
private void updateOrderStatus(AllocOrder allocOrder, List<AllocDetail> details, String beforeStatus){
// 如果是分账结束或失败, 不更新状态
String status = allocOrder.getStatus();
// 如果是分账结束或失败, 不进行对订单进行处理
List<String> list = Arrays.asList(AllocationStatusEnum.FINISH.getCode(), AllocationStatusEnum.FINISH_FAILED.getCode());
if (!list.contains(status)){
// 判断明细状态. 获取成功和失败的
long successCount = details.stream()
.map(AllocDetail::getResult)
.filter(AllocDetailResultEnum.SUCCESS.getCode()::equals)
.count();
long failCount = details.stream()
.map(AllocDetail::getResult)
.filter(AllocDetailResultEnum.FAIL.getCode()::equals)
.count();
if (list.contains(status)) {
return;
}
// 判断明细状态. 获取成功和失败的
long successCount = details.stream()
.map(AllocDetail::getResult)
.filter(AllocDetailResultEnum.SUCCESS.getCode()::equals)
.count();
long failCount = details.stream()
.map(AllocDetail::getResult)
.filter(AllocDetailResultEnum.FAIL.getCode()::equals)
.count();
// 成功和失败都为0 表示进行中
if (successCount == 0 && failCount == 0){
allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode())
.setResult(AllocationResultEnum.ALL_PENDING.getCode());
// 成功和失败都为0 表示进行中
if (successCount == 0 && failCount == 0){
allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode())
.setResult(AllocationResultEnum.ALL_PENDING.getCode());
} else {
if (failCount == details.size()){
// 全部失败
allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode())
.setResult(AllocationResultEnum.ALL_FAILED.getCode());
} else if (successCount == details.size()){
// 全部成功
allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode())
.setResult(AllocationResultEnum.ALL_SUCCESS.getCode());
} else {
if (failCount == details.size()){
// 全部失败
allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode())
.setResult(AllocationResultEnum.ALL_FAILED.getCode());
} else if (successCount == details.size()){
// 全部成功
allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode())
.setResult(AllocationResultEnum.ALL_SUCCESS.getCode());
} else {
// 部分成功
allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode())
.setResult(AllocationResultEnum.PART_SUCCESS.getCode());
}
// 部分成功
allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode())
.setResult(AllocationResultEnum.PART_SUCCESS.getCode());
}
}
allocOrderDetailManager.updateAllById(details);
allocationOrderManager.updateById(allocOrder);
// 如果状态为分账完成, 发送通知
if (Objects.equals(AllocationStatusEnum.FINISH.getCode(), allocOrder.getStatus())){
// 如果状态为分账处理完成, 且与类型发生了变动, 发送通知
if (Objects.equals(AllocationStatusEnum.ALLOC_END.getCode(), allocOrder.getStatus())
&& !Objects.equals(beforeStatus, AllocationStatusEnum.ALLOC_END.getCode())){
// 注册通知 多次同步会产生多次变动, 注意处理多次推送通知的问题
merchantNoticeService.registerAllocNotice(allocOrder, details);
// 是否开启自动完结
AllocConfig allocConfig = allocConfigManager.findByAppId(allocOrder.getAppId()).orElse(null);
if (Objects.nonNull(allocConfig)&& allocConfig.getAutoFinish()){
// 注册一分钟后的分账完结任务
delayJobService.registerByTransaction(allocOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_FINISH, 60 * 1000L);
}
}
}

View File

@@ -1,19 +1,23 @@
package org.dromara.daxpay.service.service.order.pay;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.daxpay.core.exception.TradeNotExistException;
import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam;
import org.dromara.daxpay.core.util.TradeNoGenerateUtil;
import org.dromara.daxpay.service.dao.config.AllocConfigManager;
import org.dromara.daxpay.service.dao.order.pay.PayOrderManager;
import org.dromara.daxpay.service.entity.allocation.AllocConfig;
import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.dromara.daxpay.service.service.allocation.AllocationService;
import org.dromara.daxpay.service.service.assist.PaymentAssistService;
import org.dromara.daxpay.service.service.trade.pay.PayCloseService;
import org.dromara.daxpay.service.service.trade.pay.PaySyncService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* 支付订单服务
* @author xxm
@@ -24,12 +28,17 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor
public class PayOrderService {
private final PayOrderManager payOrderManager;
private final PaySyncService paySyncService;
private final PaymentAssistService paymentAssistService;
private final PayCloseService payCloseService;
private final AllocationService allocationService;
private final AllocConfigManager allocConfigManager;
/**
* 同步
*/
@@ -69,7 +78,22 @@ public class PayOrderService {
AllocationParam param = new AllocationParam()
.setBizAllocNo("B"+TradeNoGenerateUtil.allocation());
param.setAppId(payOrder.getAppId());
allocationService.allocation(param, payOrder);
allocationService.start(param, payOrder);
}
/**
* 自动分账
*/
public void autoAllocation(Long id){
PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在"));
// 是否开启自动完结
AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null);
if (Objects.nonNull(allocConfig)){
paymentAssistService.initMchApp(payOrder.getAppId());
AllocationParam param = new AllocationParam()
.setBizAllocNo("B"+TradeNoGenerateUtil.allocation());
param.setAppId(payOrder.getAppId());
allocationService.start(param, payOrder);
}
}
}

View File

@@ -7,6 +7,7 @@ import org.dromara.daxpay.service.common.context.CallbackLocal;
import org.dromara.daxpay.service.common.local.PaymentContextLocal;
import org.dromara.daxpay.service.dao.order.pay.PayOrderManager;
import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.dromara.daxpay.service.service.allocation.AllocationService;
import org.dromara.daxpay.service.service.notice.MerchantNoticeService;
import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService;
import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService;
@@ -39,6 +40,7 @@ public class PayCallbackService {
private final TradeFlowRecordService tradeFlowRecordService;
private final MerchantNoticeService merchantNoticeService;
private final AllocationService allocationService;
/**
* 支付统一回调处理
@@ -105,6 +107,7 @@ public class PayCallbackService {
payOrderManager.updateById(payOrder);
tradeFlowRecordService.savePay(payOrder);
merchantNoticeService.registerPayNotice(payOrder);
allocationService.registerAutoAlloc(payOrder);
}
/**

View File

@@ -8,6 +8,7 @@ import org.dromara.daxpay.core.result.trade.pay.PayResult;
import org.dromara.daxpay.service.bo.trade.PayResultBo;
import org.dromara.daxpay.service.dao.order.pay.PayOrderManager;
import org.dromara.daxpay.service.entity.order.pay.PayOrder;
import org.dromara.daxpay.service.service.allocation.AllocationService;
import org.dromara.daxpay.service.service.notice.MerchantNoticeService;
import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService;
import org.dromara.daxpay.service.strategy.AbsPayStrategy;
@@ -38,6 +39,7 @@ public class PayService {
private final PayOrderManager payOrderManager;
private final TradeFlowRecordService tradeFlowRecordService;
private final MerchantNoticeService merchantNoticeService;
private final AllocationService allocationService;
/**
* 支付入口
@@ -145,6 +147,7 @@ public class PayService {
if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){
tradeFlowRecordService.savePay(payOrder);
merchantNoticeService.registerPayNotice(payOrder);
allocationService.registerAutoAlloc(payOrder);
}
return payAssistService.buildResult(payOrder,result);
}
@@ -197,6 +200,7 @@ public class PayService {
if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){
tradeFlowRecordService.savePay(payOrder);
merchantNoticeService.registerPayNotice(payOrder);
allocationService.registerAutoAlloc(payOrder);
}
return payAssistService.buildResult(payOrder, payResultBo);
}

View File

@@ -108,7 +108,6 @@ public class RefundCallbackService {
// 更新订单和退款相关订单
payOrderManager.updateById(payOrder);
refundOrderManager.updateById(refundOrder);
// 记录流水
tradeFlowRecordService.saveRefund(refundOrder);
// 发送通知

View File

@@ -13,4 +13,9 @@ import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AllocationSyncTaskService {
/**
* 分账同步
*/
}