This commit is contained in:
eric
2026-03-26 11:22:55 -05:00
parent 17768ba033
commit 8c865cf0e8
4 changed files with 89 additions and 55 deletions

View File

@@ -36,7 +36,7 @@ type RecoveryResult = {
};
const PAYJS_CHECK_BY_EMAIL_TIMEOUT =
Number(process.env.PAYJSAPI_CHECK_BY_EMAIL_TIMEOUT) || 5000;
Number(process.env.PAYJSAPI_CHECK_BY_EMAIL_TIMEOUT) || 20000;
const PAYJS_CHECK_BY_EMAIL_RETRIES =
Math.max(0, Number(process.env.PAYJSAPI_CHECK_BY_EMAIL_RETRIES) || 1);
@@ -49,6 +49,13 @@ function resolvePayApiUrl(request: NextRequest): string {
).replace(/\/$/, "");
}
function getLocalPayApiUrl(): string {
return (
process.env.PAYMENT_API_INTERNAL_URL?.trim() ||
"http://127.0.0.1:8007"
).replace(/\/$/, "");
}
async function checkVipByEmailFromPayjsapi(
request: NextRequest,
email: string,
@@ -57,8 +64,13 @@ async function checkVipByEmailFromPayjsapi(
): Promise<PayjsVipEmailResult | null> {
const payConfig = getPaymentConfig();
const primaryUrl = resolvePayApiUrl(request);
const localUrl = getLocalPayApiUrl();
const candidates = Array.from(
new Set([primaryUrl, payConfig.apiUrl].map((x) => (x || "").trim().replace(/\/$/, "")).filter(Boolean))
new Set(
[localUrl, primaryUrl, payConfig.apiUrl]
.map((x) => (x || "").trim().replace(/\/$/, ""))
.filter(Boolean)
)
);
for (const apiUrl of candidates) {
@@ -280,29 +292,29 @@ export async function POST(request: NextRequest) {
loginError = error instanceof Error ? error.message : "登录失败";
}
let payjsResult: PayjsVipEmailResult | null = await checkVipByEmailFromPayjsapi(
request,
email,
password,
requestedAnonymousUserId || undefined
);
// PB 登录失败时,尝试使用 payjsapi 返回的 token/record 兜底恢复
if (!authData && payjsResult?.vip && payjsResult.token && payjsResult.record?.id) {
console.log("[check-by-email] fallback by payjsapi token email=%s", email);
return NextResponse.json({
ok: true,
vip: true,
token: payjsResult.token,
record: payjsResult.record,
effectiveUserId: payjsResult.record.id,
anonymousUserId: payjsResult.anonymousUserId ?? null,
memosAccount: payjsResult.anonymousUserId ?? null,
source: "payjsapi_token_fallback",
});
}
let payjsResult: PayjsVipEmailResult | null = null;
if (!authData) {
payjsResult = await checkVipByEmailFromPayjsapi(
request,
email,
password,
requestedAnonymousUserId || undefined
);
// PB 登录失败时,尝试使用 payjsapi 返回的 token/record 兜底恢复
if (payjsResult?.vip && payjsResult.token && payjsResult.record?.id) {
console.log("[check-by-email] fallback by payjsapi token email=%s", email);
return NextResponse.json({
ok: true,
vip: true,
token: payjsResult.token,
record: payjsResult.record,
effectiveUserId: payjsResult.record.id,
anonymousUserId: payjsResult.anonymousUserId ?? null,
memosAccount: payjsResult.anonymousUserId ?? null,
source: "payjsapi_token_fallback",
});
}
const msg = loginError || "登录失败";
return NextResponse.json(
{ ok: false, vip: false, error: msg },
@@ -316,6 +328,14 @@ export async function POST(request: NextRequest) {
});
if (!adminToken) {
// 管理员 token 获取失败时,降级到 payjsapi 结果,避免直接 500
if (!payjsResult) {
payjsResult = await checkVipByEmailFromPayjsapi(
request,
email,
password,
requestedAnonymousUserId || undefined
);
}
if (payjsResult?.vip) {
return NextResponse.json({
ok: true,
@@ -349,14 +369,12 @@ export async function POST(request: NextRequest) {
);
if (!recovery.vip) {
if (!payjsResult) {
payjsResult = await checkVipByEmailFromPayjsapi(
request,
email,
password,
requestedAnonymousUserId || undefined
);
}
payjsResult = await checkVipByEmailFromPayjsapi(
request,
email,
password,
requestedAnonymousUserId || undefined
);
recovery = await resolveRecovery(
adminToken,
email,