const ZPAY_PID = process.env.ZPAY_PID || "2025121809351743"; const ZPAY_KEY = process.env.ZPAY_KEY || "tpEi7wWIWI2kXiYVTpIG6j7it0mjVW89"; const ZPAY_QUERY_URL = process.env.ZPAY_QUERY_URL || "https://zpayz.cn/api.php"; const ZPAY_QUERY_TIMEOUT_MS = Number( process.env.ZPAY_QUERY_TIMEOUT_MS || 5000 ); export type ZPayStatusResult = { ok: boolean; paid: boolean; status?: string; error?: string; url: string; }; export async function queryZPayOrderStatus( orderId: string, timeoutMs = ZPAY_QUERY_TIMEOUT_MS ): Promise { const normalizedOrderId = orderId.trim(); if (!normalizedOrderId || !ZPAY_PID || !ZPAY_KEY) { return null; } const url = new URL(ZPAY_QUERY_URL); url.searchParams.set("act", "order"); url.searchParams.set("pid", ZPAY_PID); url.searchParams.set("key", ZPAY_KEY); url.searchParams.set("out_trade_no", normalizedOrderId); try { const res = await fetch(url.toString(), { cache: "no-store", signal: AbortSignal.timeout(timeoutMs), }); const data = await res.json().catch(() => ({})); const code = String(data?.code || "").trim(); const status = String(data?.status || "").trim(); return { ok: res.ok, paid: res.ok && code === "1" && status === "1", status, url: url.toString(), error: res.ok && code === "1" ? undefined : String(data?.msg || `status=${res.status}`), }; } catch (error) { return { ok: false, paid: false, url: url.toString(), error: error instanceof Error ? error.message : String(error), }; } }