diff --git a/src/__tests__/lib/alipay/sign.test.ts b/src/__tests__/lib/alipay/sign.test.ts index 74c17e8..5be2995 100644 --- a/src/__tests__/lib/alipay/sign.test.ts +++ b/src/__tests__/lib/alipay/sign.test.ts @@ -44,11 +44,16 @@ describe('Alipay RSA2 Sign', () => { expect(sign1).toBe(sign2); }); - it('should filter out sign and sign_type fields', () => { - const paramsWithSign = { ...testParams, sign: 'old_sign', sign_type: 'RSA2' }; + it('should filter out sign field but keep sign_type', () => { + const paramsWithSign = { ...testParams, sign: 'old_sign' }; const sign1 = generateSign(testParams, privateKey); const sign2 = generateSign(paramsWithSign, privateKey); expect(sign1).toBe(sign2); + + // sign_type should be included in signing + const paramsWithSignType = { ...testParams, sign_type: 'RSA2' }; + const sign3 = generateSign(paramsWithSignType, privateKey); + expect(sign3).not.toBe(sign1); }); it('should filter out empty values', () => { diff --git a/src/lib/alipay/client.ts b/src/lib/alipay/client.ts index acc1aee..7004b9e 100644 --- a/src/lib/alipay/client.ts +++ b/src/lib/alipay/client.ts @@ -51,7 +51,7 @@ export function pageExecute( params.sign = generateSign(params, env.ALIPAY_PRIVATE_KEY); - const query = new URLSearchParams({ ...params, sign_type: 'RSA2' }).toString(); + const query = new URLSearchParams(params).toString(); return `${GATEWAY}?${query}`; } @@ -72,7 +72,6 @@ export async function execute( }; params.sign = generateSign(params, env.ALIPAY_PRIVATE_KEY); - params.sign_type = 'RSA2'; const response = await fetch(GATEWAY, { method: 'POST', diff --git a/src/lib/alipay/sign.ts b/src/lib/alipay/sign.ts index 5b51e48..d1c025c 100644 --- a/src/lib/alipay/sign.ts +++ b/src/lib/alipay/sign.ts @@ -14,9 +14,7 @@ function formatPublicKey(key: string): string { /** 生成 RSA2 签名 */ export function generateSign(params: Record, privateKey: string): string { const filtered = Object.entries(params) - .filter( - ([key, value]) => key !== 'sign' && key !== 'sign_type' && value !== '' && value !== undefined && value !== null, - ) + .filter(([key, value]) => key !== 'sign' && value !== '' && value !== undefined && value !== null) .sort(([a], [b]) => a.localeCompare(b)); const signStr = filtered.map(([key, value]) => `${key}=${value}`).join('&'); @@ -29,9 +27,7 @@ export function generateSign(params: Record, privateKey: string) /** 用支付宝公钥验证签名 */ export function verifySign(params: Record, alipayPublicKey: string, sign: string): boolean { const filtered = Object.entries(params) - .filter( - ([key, value]) => key !== 'sign' && key !== 'sign_type' && value !== '' && value !== undefined && value !== null, - ) + .filter(([key, value]) => key !== 'sign' && value !== '' && value !== undefined && value !== null) .sort(([a], [b]) => a.localeCompare(b)); const signStr = filtered.map(([key, value]) => `${key}=${value}`).join('&');