ai-chatbot/lib/payment/dulupay.ts
Your Name 6cac41f1c0
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
接入DuluPay充值闭环并统一升级弹窗比例
2026-02-14 15:25:36 +08:00

45 lines
1.2 KiB
TypeScript

import { createHash } from "node:crypto";
export function normalizeDulupayBaseUrl(baseUrl: string) {
const trimmed = String(baseUrl || "").trim();
if (!trimmed) return "https://www.dulupay.com";
return trimmed.replace(/\/+$/, "");
}
function toSignSource(
params: Record<string, string | number | null | undefined>,
key: string
) {
const payload = Object.entries(params)
.filter(
([name, value]) =>
name !== "sign" &&
name !== "sign_type" &&
value !== undefined &&
value !== null &&
String(value) !== ""
)
.sort(([a], [b]) => (a > b ? 1 : a < b ? -1 : 0))
.map(([name, value]) => `${name}=${value}`)
.join("&");
return `${payload}${key}`;
}
export function signDulupayV1(
params: Record<string, string | number | null | undefined>,
key: string
) {
return createHash("md5").update(toSignSource(params, key), "utf8").digest("hex");
}
export function verifyDulupayV1Sign(
params: Record<string, string>,
key: string
) {
const incomingSign = String(params.sign || "").trim().toLowerCase();
if (!incomingSign) return false;
const localSign = signDulupayV1(params, key);
return incomingSign === localSign;
}