diff --git a/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/client/resp/AdapaySyncResp.java b/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/client/resp/AdapaySyncResp.java index 57484e9d2..cee69c14e 100644 --- a/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/client/resp/AdapaySyncResp.java +++ b/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/client/resp/AdapaySyncResp.java @@ -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; } diff --git a/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/service/payment/sync/AdapaySyncService.java b/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/service/payment/sync/AdapaySyncService.java index 1142c1d82..2e74c3fa8 100644 --- a/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/service/payment/sync/AdapaySyncService.java +++ b/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/service/payment/sync/AdapaySyncService.java @@ -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)) { diff --git a/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/util/AdapayDateUtil.java b/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/util/AdapayDateUtil.java index eb055b52f..57ffafbb1 100644 --- a/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/util/AdapayDateUtil.java +++ b/daxpay-channel/daxpay-channel-adapay/src/main/java/cn/daxpay/open/channel/adapay/util/AdapayDateUtil.java @@ -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) {