diff --git a/app/composables/useHjcPayStatus.ts b/app/composables/useHjcPayStatus.ts index 9890273..bd6736d 100644 --- a/app/composables/useHjcPayStatus.ts +++ b/app/composables/useHjcPayStatus.ts @@ -13,11 +13,11 @@ */ /** - * 支付码的有效期。 + * 支付码有效期的**兜底**值(从调用 `start` 的那一刻起算)。 * - * 微信 Native 默认 2 小时;支付宝当面付的超时由下单时的 `timeout_express` 决定。 - * 服务端都不下发过期时刻(`PaymentResponse` 不设 `expireTime`), - * 所以只能以「本次拿到支付码的时刻」本地计时;到点停止轮询并提示重新获取。 + * 优先用后端随订单下发的 `payDeadline`——那才是权威值,且与后端判定超时、渠道单失效 + * 是同一个时刻(见 ADR 0019),`start` 的第二个参数就是传它。 + * 拿不到到期时刻时才退回这个本地计时(例如购标流程里还没取到订单对象就被调用)。 */ export const HJC_PAY_QR_TTL_MS = 2 * 60 * 60 * 1000 @@ -143,14 +143,22 @@ export function useHjcPayStatus( } } - /** 开始(或重新开始)轮询,并重置 2 小时计时 */ - function start(no: string) { + /** + * 开始(或重新开始)轮询。 + * + * @param no 订单号 + * @param deadlineAtMs 该订单支付时限的到期时刻(毫秒)。**传后端下发的 `payDeadline`**—— + * 用本地倒计时代替它,两者会在边界上错开。不传则退回 {@link HJC_PAY_QR_TTL_MS} + */ + function start(no: string, deadlineAtMs?: number | null) { orderNo = no paid.value = false expired.value = false error.value = '' status.value = null - deadline = Date.now() + HJC_PAY_QR_TTL_MS + deadline = typeof deadlineAtMs === 'number' && Number.isFinite(deadlineAtMs) + ? deadlineAtMs + : Date.now() + HJC_PAY_QR_TTL_MS active = true pauseTimer() ensureTimer() diff --git a/app/pages/tender/orders/[id].vue b/app/pages/tender/orders/[id].vue index 74a7730..7d5635f 100644 --- a/app/pages/tender/orders/[id].vue +++ b/app/pages/tender/orders/[id].vue @@ -66,8 +66,12 @@ - -
+ +