fix: resolve public dulupay callback origin
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-04-27 20:55:37 +08:00
parent 7b69e7dcee
commit 55bed5087c

View File

@ -29,6 +29,36 @@ function buildOutTradeNo() {
return `DP${Date.now()}${random}`.slice(0, 64);
}
function normalizeBaseUrl(value?: string | null) {
const raw = String(value || "").trim();
if (!raw) return "";
try {
const parsed = new URL(raw);
return `${parsed.protocol}//${parsed.host}`;
} catch {
return "";
}
}
function resolvePublicOrigin(request: NextRequest) {
const fromEnv =
normalizeBaseUrl(process.env.AUTH_URL) ||
normalizeBaseUrl(process.env.NEXTAUTH_URL);
if (fromEnv) return fromEnv;
const forwardedHost = request.headers.get("x-forwarded-host");
const host = request.headers.get("host");
const resolvedHost = String(forwardedHost || host || "").trim();
if (!resolvedHost) {
return new URL(request.url).origin;
}
const forwardedProto = request.headers.get("x-forwarded-proto");
const protocol = String(forwardedProto || "").trim() || "https";
return `${protocol}://${resolvedHost}`;
}
export async function POST(request: NextRequest) {
try {
const session = await auth();
@ -99,7 +129,7 @@ export async function POST(request: NextRequest) {
const amountCents = Math.round(amount * 100);
const payType = body.payType || dulupayConfig.defaultType || "alipay";
const defaultOrigin = new URL(request.url).origin;
const defaultOrigin = resolvePublicOrigin(request);
const notifyUrl =
dulupayConfig.notifyUrl || `${defaultOrigin}/api/payment/dulupay/notify`;
const returnUrl = dulupayConfig.returnUrl || `${defaultOrigin}/`;