mirror of
https://gitee.com/dromara/dax-pay
synced 2026-08-10 14:56:06 +08:00
fix(adapay): 同步补全通道订单号、支付时间与原始快照
- 通道订单号: 回填汇付支付对象ID(paymentId), 修复 trade.outOrderNo 被覆盖为 null - 支付时间: 改用 end_time(支付成功时间), AdapayDateUtil 支持 14位 yyyyMMddHHmmss 解析 - 同步快照: 回填通道原始返回 JSON 至 pay_sync_record.sync_info - 透传订单号: 补全汇付流水号 hf_seq_id - 买家标识: 对齐商业版取顶层 open_id - 金额映射: 修正 totalAmount 错赋给 realAmount
This commit is contained in:
@@ -11,6 +11,9 @@ public class AdapaySyncResp {
|
||||
/// 商户订单号(回显)
|
||||
private String outTradeNo;
|
||||
|
||||
/// Adapay 支付对象 ID(通道订单号, 后续关单/退款的关键凭证)
|
||||
private String paymentId;
|
||||
|
||||
/// 统一交易状态(SUCCESS / PROGRESS / CLOSED)
|
||||
private String tradeStatus;
|
||||
|
||||
@@ -26,6 +29,12 @@ public class AdapaySyncResp {
|
||||
/// 买家标识
|
||||
private String buyerId;
|
||||
|
||||
/// 通道流水号(汇付 hf_seq_id)
|
||||
private String transOrderNo;
|
||||
|
||||
/// 通道原始返回 JSON 快照(用于同步流水记录)
|
||||
private String syncData;
|
||||
|
||||
/// 查询失败时的错误信息
|
||||
private String errorMsg;
|
||||
}
|
||||
|
||||
@@ -50,9 +50,14 @@ public class AdapaySyncService {
|
||||
/// 解析子应用响应
|
||||
private PaySyncResultBo toSyncResult(AdapaySyncResp resp) {
|
||||
PaySyncResultBo bo = new PaySyncResultBo();
|
||||
bo.setRealAmount(resp.getTotalAmount());
|
||||
// 通道订单号: Adapay 支付对象 ID, 核心层据此回写 PayTrade.outOrderNo
|
||||
bo.setOutOrderNo(resp.getPaymentId());
|
||||
bo.setAmount(resp.getTotalAmount());
|
||||
bo.setRealAmount(resp.getRealAmount());
|
||||
bo.setBuyerId(resp.getBuyerId());
|
||||
bo.setTransOrderNo(resp.getTransOrderNo());
|
||||
bo.setFinishTime(AdapayDateUtil.parse(resp.getPayTime()));
|
||||
bo.setSyncData(resp.getSyncData());
|
||||
|
||||
String tradeStatus = resp.getTradeStatus();
|
||||
if (StrUtil.isBlank(tradeStatus)) {
|
||||
|
||||
@@ -3,19 +3,27 @@ package cn.daxpay.open.channel.adapay.util;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
/// # Adapay 时间解析工具
|
||||
///
|
||||
/// Adapay 返回的 created_time 字段格式不统一(可能为毫秒时间戳或 ISO 字符串),
|
||||
/// 本工具统一解析为东八区 OffsetDateTime, 解析失败返回 null(由回调/同步兜底补全时间)。
|
||||
/// 统一解析汇付 Adapay 返回的时间字段为东八区 OffsetDateTime:
|
||||
/// - created_time: 13 位毫秒时间戳(支付对象创建时间, 下单/条码支付成功场景)
|
||||
/// - end_time: 14 位 yyyyMMddHHmmss(支付成功时间, 同步查询场景, 无时区字面量按东八区)
|
||||
/// - 其他: ISO 带时区字符串
|
||||
///
|
||||
/// 解析失败返回 null(由回调/同步兜底补全时间)。
|
||||
public final class AdapayDateUtil {
|
||||
|
||||
/// Adapay ISO 时间格式(带时区, 如 2026-07-06T11:15:48+08:00)
|
||||
private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
|
||||
|
||||
/// 支付成功时间格式(无时区, 如 20210706111548)
|
||||
private static final DateTimeFormatter PURE_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
|
||||
|
||||
private AdapayDateUtil() {
|
||||
}
|
||||
|
||||
@@ -25,10 +33,14 @@ public final class AdapayDateUtil {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
// 纯数字视为毫秒时间戳
|
||||
if (time.matches("\\d+")) {
|
||||
// 13 位毫秒时间戳(created_time)
|
||||
if (time.matches("\\d{13}")) {
|
||||
return OffsetDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(time)), ZoneOffset.ofHours(8));
|
||||
}
|
||||
// 14 位 yyyyMMddHHmmss(end_time, 无时区字面量, 按东八区解析)
|
||||
if (time.matches("\\d{14}")) {
|
||||
return LocalDateTime.parse(time, PURE_DATETIME_FORMATTER).atOffset(ZoneOffset.ofHours(8));
|
||||
}
|
||||
// ISO 带时区格式
|
||||
return OffsetDateTime.parse(time, ISO_FORMATTER);
|
||||
} catch (Exception e) {
|
||||
|
||||
Reference in New Issue
Block a user