Skip to content

Commit 7562468

Browse files
committed
fix(pay-gateway): 修复蓝兔支付支付签名问题(hotfix)
1 parent 14ef4f3 commit 7562468

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

.changeset/strong-tips-cry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@ethan-utils/pay-gateway": patch
3+
---
4+
5+
修复蓝兔支付支付签名问题(hotfix)

node-pkgs/pay-gateway/ltzf/index.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ const LTZF_FIELD_NAMES = [
8080
"callback_url",
8181
] as const;
8282
type LtzfFieldName = (typeof LTZF_FIELD_NAMES)[number];
83-
interface SignFieldWhitelistItem {
83+
interface SignFieldConfigItem {
8484
api: LtzfApiName;
8585
fields: LtzfFieldName[];
8686
}
8787

88-
// 2. 白名单配置
89-
const SIGN_FIELD_WHITELIST: SignFieldWhitelistItem[] = [
88+
// 2. 签名字段配置 - 定义每个API需要哪些字段参与签名
89+
const SIGN_FIELD_CONFIG: SignFieldConfigItem[] = [
9090
{
9191
api: "scanPay",
9292
fields: [
@@ -107,7 +107,6 @@ const SIGN_FIELD_WHITELIST: SignFieldWhitelistItem[] = [
107107
"body",
108108
"timestamp",
109109
"notify_url",
110-
"return_url",
111110
],
112111
},
113112
{
@@ -119,7 +118,6 @@ const SIGN_FIELD_WHITELIST: SignFieldWhitelistItem[] = [
119118
"body",
120119
"timestamp",
121120
"notify_url",
122-
"return_url",
123121
],
124122
},
125123
{
@@ -132,7 +130,6 @@ const SIGN_FIELD_WHITELIST: SignFieldWhitelistItem[] = [
132130
"openid",
133131
"timestamp",
134132
"notify_url",
135-
"return_url",
136133
],
137134
},
138135
{
@@ -144,7 +141,6 @@ const SIGN_FIELD_WHITELIST: SignFieldWhitelistItem[] = [
144141
"body",
145142
"timestamp",
146143
"notify_url",
147-
"return_url",
148144
],
149145
},
150146
{
@@ -222,7 +218,7 @@ const SIGN_FIELD_WHITELIST: SignFieldWhitelistItem[] = [
222218
},
223219
];
224220

225-
// 用户自定义签名字段过滤配置
221+
// 3. 用户自定义签名字段配置(覆盖默认配置)
226222
let userSignFilter: Record<string, string[]> = {};
227223

228224
// 统一未初始化报错信息
@@ -272,16 +268,24 @@ export function setLtzfApiConfig(config: LtzfConfig) {
272268
}
273269
}
274270

275-
// 通用签名参数过滤
271+
/**
272+
* 根据API类型过滤出需要参与签名的字段
273+
* @param params 完整的参数对象
274+
* @param api API类型
275+
* @returns 过滤后的签名参数对象
276+
*/
276277
function filterSignParams(params: Record<string, any>, api: string) {
277-
// 获取签名字段白名单
278+
// 获取该API需要参与签名的字段列表
278279
function getSignFields(api: string): string[] {
279280
if (userSignFilter[api]) return userSignFilter[api];
280-
const found = SIGN_FIELD_WHITELIST.find((item) => item.api === api);
281+
const found = SIGN_FIELD_CONFIG.find((item) => item.api === api);
281282
return found ? found.fields : [];
282283
}
284+
283285
const fields = getSignFields(api);
284286
const filtered: Record<string, any> = {};
287+
288+
// 只提取配置中指定的字段,且值不为空
285289
for (const key of fields) {
286290
if (
287291
params[key] !== undefined &&
@@ -303,28 +307,25 @@ function ensureLtzfConfig(): boolean {
303307
}
304308

305309
/**
306-
* 蓝兔支付签名算法封装
307-
* @param {Record<string, any>} params - 参与签名的参数对象
310+
* 蓝兔支付签名算法 - 纯粹的签名计算,不做字段过滤
311+
* @param {Record<string, any>} params - 已过滤的参与签名的参数对象
308312
* @returns {string} 签名字符串
309313
*/
310314
export function signParams(params: Record<string, any>): string {
311315
// 1. 确保配置已初始化
312316
ensureLtzfConfig();
313-
// 2. 排除 sign 字段,只参与必填参数
317+
// 2. 排序参数(排除sign字段和空值)
314318
const filtered = Object.fromEntries(
315319
Object.entries(params).filter(
316320
([k, v]) => k !== "sign" && v !== undefined && v !== null && v !== "",
317321
),
318322
);
319-
// 3. 排序参数
320323
const sortedKeys = Object.keys(filtered).sort();
321-
// 4. 拼接 key=value 形式
324+
// 3. 拼接 key=value 形式
322325
const paramString = sortedKeys.map((k) => `${k}=${filtered[k]}`).join("&");
323-
// 5. 根据配置获取密钥
324-
const key = ltzfConfig.key;
325-
// 6. 拼接密钥
326-
const stringToSign = `${paramString}&key=${key}`;
327-
// 7. MD5 加密并转大写
326+
// 4. 拼接密钥
327+
const stringToSign = `${paramString}&key=${ltzfConfig.key}`;
328+
// 5. MD5 加密并转大写
328329
return CryptoJS.MD5(stringToSign).toString().toUpperCase();
329330
}
330331

0 commit comments

Comments
 (0)