fix 同步通知接收路径, 对账差错状态, 订单号生成工具类重命名, 一些注释相关的微调

This commit is contained in:
DaxPay
2024-06-28 18:02:15 +08:00
parent 7737c7efc2
commit da60b73edd
22 changed files with 101 additions and 52 deletions

View File

@@ -18,7 +18,7 @@ import cn.daxpay.single.service.core.payment.close.service.PayCloseService;
import cn.daxpay.single.service.core.payment.sync.service.PaySyncService;
import cn.daxpay.single.service.dto.order.pay.PayOrderDto;
import cn.daxpay.single.service.param.order.PayOrderQuery;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@@ -91,7 +91,7 @@ public class PayOrderController {
public ResResult<Void> allocation(String orderNo){
AllocationParam param = new AllocationParam();
param.setOrderNo(orderNo);
param.setBizAllocNo(OrderNoGenerateUtil.allocation());
param.setBizAllocNo(TradeNoGenerateUtil.allocation());
allocationService.allocation(param);
return Res.ok();
}

View File

@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 支付宝支付参数
* @author xxm
* @since 2021/2/27
*/

View File

@@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
@Schema(title = "统一下单响应参数")
@Schema(title = "统一支付响应参数")
public class PayResult extends PaymentCommonResult {
/** 商户订单号 */

View File

@@ -1,19 +1,19 @@
package cn.daxpay.single.core.util;
import cn.hutool.core.date.DatePattern;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicLong;
/**
* 各类型订单号审查工具类
* 各类型订单号生成工具类
* @author yxc
* @since 2024/4/15
*/
@Slf4j
public class OrderNoGenerateUtil {
public class TradeNoGenerateUtil {
private static final AtomicLong ATOMIC_LONG = new AtomicLong();
private final static long ORDER_MAX_LIMIT = 999999L;
@@ -29,7 +29,7 @@ public class OrderNoGenerateUtil {
*/
public static String pay() {
StringBuilder orderNo = new StringBuilder();
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss"));
String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER);
long id = ATOMIC_LONG.incrementAndGet();
orderNo.append(env).append("P").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT));
return orderNo.toString();
@@ -40,7 +40,7 @@ public class OrderNoGenerateUtil {
*/
public static String refund() {
StringBuilder orderNo = new StringBuilder();
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss"));
String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER);
long id = ATOMIC_LONG.incrementAndGet();
orderNo.append(env).append("R").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT));
return orderNo.toString();
@@ -51,7 +51,7 @@ public class OrderNoGenerateUtil {
*/
public static String transfer() {
StringBuilder orderNo = new StringBuilder();
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss"));
String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER);
long id = ATOMIC_LONG.incrementAndGet();
orderNo.append(env).append("T").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT));
return orderNo.toString();
@@ -62,7 +62,7 @@ public class OrderNoGenerateUtil {
*/
public static String allocation() {
StringBuilder orderNo = new StringBuilder();
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss"));
String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER);
long id = ATOMIC_LONG.incrementAndGet();
orderNo.append(env).append("A").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT));
return orderNo.toString();
@@ -73,7 +73,7 @@ public class OrderNoGenerateUtil {
*/
public static String reconciliation() {
StringBuilder orderNo = new StringBuilder();
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss"));
String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER);
long id = ATOMIC_LONG.incrementAndGet();
orderNo.append(env).append("C").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT));
return orderNo.toString();
@@ -84,7 +84,7 @@ public class OrderNoGenerateUtil {
*/
public static String repair() {
StringBuilder orderNo = new StringBuilder();
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss"));
String dateStr = LocalDateTime.now().format(DatePattern.PURE_DATETIME_FORMATTER);
long id = ATOMIC_LONG.incrementAndGet();
orderNo.append(env).append("X").append(dateStr).append(machineNo).append(String.format("%06d", Math.abs(id) % ORDER_MAX_LIMIT));
return orderNo.toString();

View File

@@ -27,20 +27,20 @@ public class PayReturnController {
private final PayReturnService payReturnService;
@Operation(summary = "支付宝同步跳转通知")
@GetMapping("/pay/alipay")
@GetMapping("/alipay")
public ModelAndView alipay(AliPayReturnParam param){
String url = payReturnService.alipay(param);
return new ModelAndView("redirect:" + url);
}
@Operation(summary = "微信同步跳转通知")
@GetMapping("/pay/wechat")
@GetMapping("/wechat")
public ModelAndView wechat(){
return null;
}
@Operation(summary = "云闪付同步跳转通知")
@PostMapping("/pay/union")
@PostMapping("/union")
public ModelAndView union(UnionPayReturnParam param){
String url = payReturnService.union(param);
return new ModelAndView("redirect:" + url);

View File

@@ -1,6 +1,6 @@
package cn.daxpay.single.service.configuration;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.Setter;
@@ -27,12 +27,12 @@ public class DaxPayProperties {
public void setMachineNo(String machineNo) {
this.machineNo = machineNo;
OrderNoGenerateUtil.setMachineNo(machineNo);
TradeNoGenerateUtil.setMachineNo(machineNo);
}
public void setEnv(String env) {
this.env = env;
OrderNoGenerateUtil.setEnv(env);
TradeNoGenerateUtil.setEnv(env);
}
public String getFrontH5Url() {

View File

@@ -7,7 +7,7 @@ import cn.daxpay.single.core.code.AllocOrderStatusEnum;
import cn.daxpay.single.core.code.PayOrderAllocStatusEnum;
import cn.daxpay.single.core.param.payment.allocation.AllocReceiverParam;
import cn.daxpay.single.core.param.payment.allocation.AllocationParam;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import cn.daxpay.single.service.core.order.allocation.dao.AllocOrderDetailManager;
import cn.daxpay.single.service.core.order.allocation.dao.AllocationOrderManager;
import cn.daxpay.single.service.core.order.allocation.entity.AllocOrder;
@@ -159,7 +159,7 @@ public class AllocOrderService {
.setBizOrderNo(payOrder.getBizOrderNo())
.setOutOrderNo(payOrder.getOutOrderNo())
.setTitle(payOrder.getTitle())
.setAllocNo(OrderNoGenerateUtil.allocation())
.setAllocNo(TradeNoGenerateUtil.allocation())
.setBizAllocNo(param.getBizAllocNo())
.setChannel(payOrder.getChannel())
.setDescription(param.getDescription())

View File

@@ -8,7 +8,7 @@ import cn.daxpay.single.service.core.order.refund.entity.RefundOrder;
import cn.daxpay.single.service.core.payment.common.service.PaymentAssistService;
import cn.daxpay.single.service.core.payment.refund.service.RefundService;
import cn.daxpay.single.service.param.order.PayOrderRefundParam;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import cn.hutool.extra.servlet.ServletUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -45,7 +45,7 @@ public class RefundOrderService {
RefundParam refundParam = new RefundParam();
refundParam.setOrderNo(param.getOrderNo());
refundParam.setBizRefundNo(OrderNoGenerateUtil.refund());
refundParam.setBizRefundNo(TradeNoGenerateUtil.refund());
refundParam.setAmount(param.getAmount());
refundParam.setReason(param.getReason());
refundParam.setReqTime(LocalDateTime.now());

View File

@@ -10,7 +10,7 @@ import cn.daxpay.single.core.exception.AmountExceedLimitException;
import cn.daxpay.single.core.exception.TradeStatusErrorException;
import cn.daxpay.single.core.param.payment.pay.PayParam;
import cn.daxpay.single.core.result.pay.PayResult;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import cn.daxpay.single.core.util.PayUtil;
import cn.daxpay.single.service.common.context.PayLocal;
import cn.daxpay.single.service.common.context.PlatformLocal;
@@ -60,7 +60,7 @@ public class PayAssistService {
// 构建支付订单对象
PayOrder order = new PayOrder()
.setBizOrderNo(payParam.getBizOrderNo())
.setOrderNo(OrderNoGenerateUtil.pay())
.setOrderNo(TradeNoGenerateUtil.pay())
.setTitle(payParam.getTitle())
.setDescription(payParam.getDescription())
.setStatus(PayStatusEnum.PROGRESS.getCode())

View File

@@ -1,5 +1,6 @@
package cn.daxpay.single.service.core.payment.pay.service;
import cn.daxpay.single.core.exception.TradeProcessingException;
import cn.daxpay.single.core.param.payment.pay.PayParam;
import cn.daxpay.single.core.result.pay.PayResult;
import cn.daxpay.single.service.common.context.PayLocal;
@@ -57,8 +58,8 @@ public class PayService {
// 加锁
LockInfo lock = lockTemplate.lock("payment:pay:" + bizOrderNo,10000,200);
if (Objects.isNull(lock)){
payResult.setMsg("正在支付中,请勿重复支付");
return payResult;
log.warn("正在支付中,请勿重复支付");
throw new TradeProcessingException("正在支付中,请勿重复支付");
}
try {
// 查询并检查订单

View File

@@ -20,7 +20,6 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT
/**
* 支付宝支付
* 注意: channelOrder对象需要单独处理, 直接获取会空指针
* @author xxm
* @since 2021/2/27
*/

View File

@@ -147,7 +147,7 @@ public class ReconcileAssistService {
ReconcileOutTrade outDetail = outDetailMap.get(localTrade.getTradeNo());
if (Objects.isNull(outDetail)){
ReconcileDiff diffRecord = new ReconcileDiff()
.setDiffType(ReconcileDiffTypeEnum.LOCAL_NOT_EXISTS.getCode())
.setDiffType(ReconcileDiffTypeEnum.REMOTE_NOT_EXISTS.getCode())
.setTradeNo(localTrade.getTradeNo())
.setReconcileId(reconcileOrder.getId())
.setReconcileNo(reconcileOrder.getReconcileNo())

View File

@@ -5,7 +5,7 @@ import cn.bootx.platform.common.core.util.CollUtil;
import cn.bootx.platform.common.core.util.LocalDateTimeUtil;
import cn.daxpay.single.core.code.PayChannelEnum;
import cn.daxpay.single.core.exception.OperationFailException;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import cn.daxpay.single.service.code.ReconcileFileTypeEnum;
import cn.daxpay.single.service.code.ReconcileResultEnum;
import cn.daxpay.single.service.common.local.PaymentContextLocal;
@@ -79,7 +79,7 @@ public class ReconcileService {
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public ReconcileOrder create(LocalDate date, String channel) {
ReconcileOrder order = new ReconcileOrder()
.setReconcileNo(OrderNoGenerateUtil.reconciliation())
.setReconcileNo(TradeNoGenerateUtil.reconciliation())
.setChannel(channel)
.setDate(date);
reconcileOrderManager.save(order);

View File

@@ -8,7 +8,7 @@ import cn.bootx.platform.common.core.exception.ValidationFailedException;
import cn.daxpay.single.core.exception.TradeStatusErrorException;
import cn.daxpay.single.core.param.payment.refund.RefundParam;
import cn.daxpay.single.core.result.pay.RefundResult;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import cn.daxpay.single.core.util.PaySignUtil;
import cn.daxpay.single.service.common.context.ErrorInfoLocal;
import cn.daxpay.single.service.common.context.PlatformLocal;
@@ -81,7 +81,7 @@ public class RefundAssistService {
.setOrderNo(payOrder.getOrderNo())
.setBizOrderNo(payOrder.getBizOrderNo())
.setOutOrderNo(payOrder.getOutOrderNo())
.setRefundNo(OrderNoGenerateUtil.refund())
.setRefundNo(TradeNoGenerateUtil.refund())
.setBizRefundNo(refundParam.getBizRefundNo())
.setChannel(payOrder.getChannel())
.setStatus(RefundStatusEnum.PROGRESS.getCode())

View File

@@ -17,7 +17,7 @@ import cn.daxpay.single.service.core.payment.repair.result.RefundRepairResult;
import cn.daxpay.single.service.core.record.flow.service.TradeFlowRecordService;
import cn.daxpay.single.service.core.record.repair.entity.PayRepairRecord;
import cn.daxpay.single.service.core.record.repair.service.PayRepairRecordService;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import lombok.RequiredArgsConstructor;
@@ -80,7 +80,7 @@ public class RefundRepairService {
}
// 设置修复ID并保存修复记录
repairResult.setRepairNo(OrderNoGenerateUtil.repair());
repairResult.setRepairNo(TradeNoGenerateUtil.repair());
// 支付修复记录
PayRepairRecord payRepairRecord = this.payRepairRecord(payOrder, repairType, repairResult);
// 退款修复记录

View File

@@ -7,7 +7,7 @@ import cn.daxpay.single.service.common.context.ErrorInfoLocal;
import cn.daxpay.single.service.common.local.PaymentContextLocal;
import cn.daxpay.single.service.core.order.transfer.dao.TransferOrderManager;
import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -32,7 +32,7 @@ public class TransferAssistService {
public TransferOrder createOrder(TransferParam param) {
// 创建转账订单
TransferOrder transferOrder = new TransferOrder()
.setTransferNo(OrderNoGenerateUtil.transfer())
.setTransferNo(TradeNoGenerateUtil.transfer())
.setAmount(param.getAmount())
.setBizTransferNo(param.getBizTransferNo())
.setChannel(param.getChannel())

View File

@@ -1,6 +1,6 @@
package cn.daxpay.single.service.func;
import cn.daxpay.single.core.param.payment.pay.PayCancelParam;
import cn.daxpay.single.core.code.PayChannelEnum;
/**
* 支付相关策略标识接口
@@ -11,7 +11,7 @@ public interface PayStrategy {
/**
* 策略标识
* @see PayCancelParam
* @see PayChannelEnum
*/
String getChannel();
}

View File

@@ -4,7 +4,7 @@ import cn.daxpay.single.core.param.payment.allocation.AllocationParam;
import cn.daxpay.single.service.core.order.pay.dao.PayOrderManager;
import cn.daxpay.single.service.core.order.pay.entity.PayOrder;
import cn.daxpay.single.service.core.payment.allocation.service.AllocationService;
import cn.daxpay.single.core.util.OrderNoGenerateUtil;
import cn.daxpay.single.core.util.TradeNoGenerateUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
@@ -28,7 +28,7 @@ public class AllocationAutoStartTask implements Job {
public void execute(JobExecutionContext jobExecutionContext) {
for (PayOrder payOrder : payOrderManager.findAutoAllocation()) {
AllocationParam param = new AllocationParam();
param.setBizAllocNo(OrderNoGenerateUtil.allocation());
param.setBizAllocNo(TradeNoGenerateUtil.allocation());
try {
allocationService.allocation(param, payOrder);
} catch (Exception e) {