import test from 'node:test'; import assert from 'node:assert/strict'; import { buildV2Sign, buildV2Xml, normalizeV2Fields, parseV2Xml, verifyV2Sign } from '../src/api/wechatServicePay/wechatPayV2.js'; test('APIv2 签名与微信官方示例一致', () => { const fields = { appid: 'wxd930ea5d5a258f4f', body: 'test', device_info: '1000', mch_id: '10000100', nonce_str: 'ibuaiVcKdpRxkhJA' }; assert.equal( buildV2Sign(fields, '192006250b4c09247ec02edce69f6a2d'), '9A0A8659F005D6984697E2CA0A9CF3B7' ); }); test('APIv2 验签兼容旧 XML 解析器产生的单元素数组', () => { const fields = { appid: ['wx-test'], mch_id: ['123456'], nonce_str: ['nonce-test'], result_code: ['SUCCESS'] }; fields.sign = [buildV2Sign(fields, 'test-key')]; assert.equal(verifyV2Sign(fields, 'test-key'), true); assert.deepEqual(normalizeV2Fields(fields), { appid: 'wx-test', mch_id: '123456', nonce_str: 'nonce-test', result_code: 'SUCCESS', sign: fields.sign[0] }); }); test('APIv2 XML 可安全保留中文与特殊字符', () => { const original = { return_code: 'SUCCESS', return_msg: '秒过 & 新手包 <1元>', detail: '包含 ]]> 的内容' }; assert.deepEqual(parseV2Xml(buildV2Xml(original)), original); }); test('被修改的 APIv2 字段无法通过验签', () => { const fields = { appid: 'wx-test', total_fee: '100', nonce_str: 'nonce-test' }; fields.sign = buildV2Sign(fields, 'test-key'); fields.total_fee = '1'; assert.equal(verifyV2Sign(fields, 'test-key'), false); });