@@ -80,13 +80,13 @@ const LTZF_FIELD_NAMES = [
8080 "callback_url" ,
8181] as const ;
8282type 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. 用户自定义签名字段配置(覆盖默认配置)
226222let 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+ */
276277function 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 */
310314export 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