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:
daxpay
2026-08-05 11:02:25 +08:00
parent 7fabc67fce
commit 4cb6eb0397
3 changed files with 31 additions and 5 deletions

View File

@@ -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;
}

View File

@@ -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)) {

View File

@@ -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) {