wechatPayV2.test.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import test from 'node:test';
  2. import assert from 'node:assert/strict';
  3. import {
  4. buildV2Sign,
  5. buildV2Xml,
  6. normalizeV2Fields,
  7. parseV2Xml,
  8. verifyV2Sign
  9. } from '../src/api/wechatServicePay/wechatPayV2.js';
  10. test('APIv2 签名与微信官方示例一致', () => {
  11. const fields = {
  12. appid: 'wxd930ea5d5a258f4f',
  13. body: 'test',
  14. device_info: '1000',
  15. mch_id: '10000100',
  16. nonce_str: 'ibuaiVcKdpRxkhJA'
  17. };
  18. assert.equal(
  19. buildV2Sign(fields, '192006250b4c09247ec02edce69f6a2d'),
  20. '9A0A8659F005D6984697E2CA0A9CF3B7'
  21. );
  22. });
  23. test('APIv2 验签兼容旧 XML 解析器产生的单元素数组', () => {
  24. const fields = {
  25. appid: ['wx-test'],
  26. mch_id: ['123456'],
  27. nonce_str: ['nonce-test'],
  28. result_code: ['SUCCESS']
  29. };
  30. fields.sign = [buildV2Sign(fields, 'test-key')];
  31. assert.equal(verifyV2Sign(fields, 'test-key'), true);
  32. assert.deepEqual(normalizeV2Fields(fields), {
  33. appid: 'wx-test',
  34. mch_id: '123456',
  35. nonce_str: 'nonce-test',
  36. result_code: 'SUCCESS',
  37. sign: fields.sign[0]
  38. });
  39. });
  40. test('APIv2 XML 可安全保留中文与特殊字符', () => {
  41. const original = {
  42. return_code: 'SUCCESS',
  43. return_msg: '秒过 & 新手包 <1元>',
  44. detail: '包含 ]]> 的内容'
  45. };
  46. assert.deepEqual(parseV2Xml(buildV2Xml(original)), original);
  47. });
  48. test('被修改的 APIv2 字段无法通过验签', () => {
  49. const fields = { appid: 'wx-test', total_fee: '100', nonce_str: 'nonce-test' };
  50. fields.sign = buildV2Sign(fields, 'test-key');
  51. fields.total_fee = '1';
  52. assert.equal(verifyV2Sign(fields, 'test-key'), false);
  53. });