- 支持
v3/global/merchant-service/images/{media_id}下载客诉图片功能;
- 修复
付款到银行卡及查询付款到银行卡结果接口无返回值数据签名请求路径错误问题;
- 优化
文件上传API功能,支持Axios的Automatic serialization to FormData用法,伪代码示例如下:
wxpay.v3.merchant.media.upload.post({
meta: JSON.stringify({ filename, sha256 }),
file: fs.createReadStream(localfilepath),
}, {
meta: { filename, sha256 },
headers: { 'Content-Type': 'multipart/form-data' },
});- 优化
Rsa.encrypt及Rsa.decrypt第三参数放弃支持RSA_PKCS1_PADDING填充方案; - 标记
Rsa.RSA_PKCS1_PADDING封装常量为废弃,下一主要版本将剔除;
- 支持
Hash.keyObjectFrom及Hash.md5第一个参数是KeyObject对象的用法;
- 隔离
APIv2和APIv3配置和客户端实例; - 重构
Transformer.signer以支持GET或POST请求自动签名; - 将初始化声明的
merchant{key,cert}移动到transformer.signer内部,当需要时,通过每个请求声明的security:true加载; - 修复文件流下载的
Transformer.parse(xml)异常问题; - 修复
Rsa.fromPkcs1(str,KEY_TYPE_PUBLIC)加载公钥异常问题; - 优化文档,
Q/A简单说明Rsa.from[Pkcs8|Pkcs1|Spki]加载公/私钥新机制;
- 调整
node最低版本要求至12,不再支持node10; - 调整依赖
@thenorthmemory/multipart及fast-xml-parser; - 调整依赖
axios版本到^1.8.2; - 废弃并删除
Aes.encrypt、Aes.decrypt方法; - 废弃并删除其他标记
@deprecated的方法及属性; - 调整
Aes.AesGcm.encrypt、Aes.AesGcm.decrypt参数顺序,遵循里式代换原则; - 调整
APIv2上已知请求无nonce_str及返回无sign内置化判断,优化return_code及/或result_code非SUCCESS时无需验签; - 调整
APIv2及APIv3接口请求返回异常时,Promise.reject从AssertError改成标准AxiosError,便于调试追踪问题; - 调整
new Wechatpay()从单例到实例,并显式露出async [get|post|put|patch|delete]方法,便于多商户实例应用使用; - 新增
wxpay.chain()实例方法,便于源URI末尾是delete单词的另类链构型; - 新增
Hash.isKeyObject、Hash.keyObjectFrom、Rsa.isKeyObject、Rsa.from[Pkcs8|Pkcs1|Spki]静态方法; - 新增
Rsa.from('file://', 'private'|'public')方式加载本地RSA公/私文件; - 优化
AxiosConfig<'secret'|privateKey'|'certs'>在实例后类型从BinaryLike调整成KeyObject,增强安全性;
针对APIv2的主要优化内容
APIv2的返回值验签与传输的载荷(XML)无关,本次优化:
- 内置了「忽略无签(
sign)可验」逻辑 - 「加强判断状态码(
return_code)/业务结果(result_code)非SUCCESS情形」,当数据校核异常时,载荷数据均以解析后的对象形式抛送AxiosError
针对APIv3的主要优化内容
APIv3的返回值验签与传输的载荷(JSON/binary)强相关,本次优化:
- 内置「按所请求的
URL,自动忽略下载行为(binary)的验签」逻辑,交由应用端自行验签,微信支付官方强烈建议商户对下载的数据进行验签 - 对于
HTTP状态码 20X区间时的客户端异常AxiosError.response.data标注为原始传输的载荷,有可能是JSON字符串,也可能是空字符串 - 对于
HTTP状态码 4XX/5XX时的异常AxiosError.response.data类型,其有可能是JSON解析后的对象,也可能是html字符串
注意:破坏性更新
从0.8几乎无需过多调整代码即可升级到0.9,仅在以下几个点上不兼容:
-
OpenAPI
chainable链末尾的大写GET/POST/PUT/PATCH/DELETE方法均已删除,请使用小写; -
标记为
@deprecated的方法及属性均已删除,请参照之前的废弃提示用同等原值代替; -
AesGcm加解密,参数顺序进行了调整,微信支付官方的webhook通知解密时需要格外注意,例如:
- AesGcm.decrypt(nonce, secret, ciphertext, aad);
+ AesGcm.decrypt(ciphertext, secret, nonce, aad);- 单例模式注册转换器打印日志方式,调整为实例方式,并且
.clientGetter仅在根级实例有效,例如:
- Wechatpay.client.v2.defaults.transformRequest.push(data => (console.log(data), data))
+ wxpay.client.v2.defaults.transformRequest.push(data => (console.log(data), data))- 优化README增加
微信支付公钥相关说明,备注pfx格式的商户API密钥在高版本nodejs上的额外转换说明;
- 针对
APIv3返回的HTTP status code非20x场景,不再尝试去验签,异常类型从AssertionError回退为AxiosError;
- 修正
Transformer.toObject类型标注错误; - 动态
uri_template参数类型标注,感谢 @taoliujun 报告此问题;
- 最后一版支持node10环境;
- 修正部分
dts类型标注; - homepage 调整到 https://wechatpay.js.org
- 升级依赖
axios@^0.28.0for the CVE-2023-45857;
- 取消对
axios/lib/utils的依赖。
- 升级依赖
axios@0.21.2-0.27,xml2js@0.5-0.6;
- 升级依赖
xml2js@^0.5.0for CVE-2023-0842;
- 修复多个
uri_template占位符变量,无法正确替换问题;
- 优化
README,增加v2版付款到零钱示例不验签使用方法; - 解决
CLI下初始化参数mchid必须是字符串类型的遗留问题;
- 修正
Hash.md5当给正确的key时,返回错误的签名值问题;
- 优化了一点点
类型声明; - 修正测试用例覆盖
axios@0.25.0的url非空字符串限定场景;
- 优化
Rsa.encrypt及Rsa.decrypt以支持Java的RSA/ECB/PKCS1Padding填充方案;
- 补充
Formatter遗漏的导出函数,感谢 @Nxys PR;
- 优化,严格限定初始化参数
mchid为字符串,避免带参请求远端接口时,被校验不通过情况; - 优化,
Aes,Rsa,Hash等类实现,支持通过解构语法仅获取封装的静态方法,例如{ sign } = require('./lib/rsa');
- 增加V2版合单支付中的
combine_mch_id校验能力支持;
- 当平台证书下载工具工作
异常时,捕获并打印出异常提示信息;- 当
商户证书序列号错误时,打印出商户证书序列号有误服务端返回信息; - 当
商户RSA私钥错误时,打印出错误的签名,验签失败服务端返回信息; - 当
APIv3密钥错误时,打印出Error: Invalid key length错误堆栈;
- 当
- 修正 #35 v2付款接口无法使用的问题 ,感谢 @Starrah 报告及PR修正;
- 新增
Hash.equals用来判断签名值是否相等;
- 改进
Formatter.nonce发生器算法; - 调整
Formatter.authorization字典排序,关键信息优先展示; - 修正 内置常量拼写错误,优化文档;
- 优化 APIv3
Decorator.jsonBased逻辑,平台证书certs配置项,排除掉配置项的商户serial序列号;
- 优化 APIv3
Decorator.responseVerifier,对于验签逻辑异常原样返回response{data,headers}结构,方便排查问题,相关 #28, #30; - 新增
OpenAPImock测试,使用nock驱动,覆盖 #28, #30 问题;
- 解决
index.d.ts上的AesEcb类型签名遗漏,感谢 @zhoulingfengofcd - 新增
aes-128-cbc/pkcs7padding加解密功能,AesCbc::encrypt与其他语言兼容,详情见 PR #29 感谢 @zhoulingfengofcd - 新增
AesCbc单元测试用例覆盖, 感谢 @zhoulingfengofcd - 调整文档,使用内置
Multipart类上传图片,使用form-data包的同学需要看下 PR #26 内置包与下游包功能实现上的异同,感谢 @wptad
- 解决
index.d.ts上的Iterator<Tuple>异常问题 - 暂时使用
// @ts-ignore: FIXEME备注上不准确的Proxy chain写法,欢迎熟悉这块的同学贡献解决方案
- 修正
Multipart#delete方法,其在删除多name的值时,存在bug - 增加测试用例覆盖
Multipart.delete
- 调整
Multipart#entries, keys, values严格遵从Iterator protocols,其返回值均为Array Iterator - 优化
Multipart#get方法的返回值,当且当无键时返回undefined - 增加测试用例覆盖
Multipart.FormData
- 完善
Multipart#set, delete, has, get, getAll, keys, values等方法
- 新增
Multipart类,不再peerDependency,form-data说明及用法见 #22
- 优化CLI,扩展
wxpay <uri>的-b参数为可变布尔量,兼容之前版本用法,以支持 #21
- 代码重构,
APIv2的返回数据默认强校验,特殊接口需给特殊transformResponse,相关见 #20 - 代码重构,删除了
interceptor.js包装文件,不再兼容0.1系列,返回数据默认强校验,特殊接口需给特殊transformResponse,相关见 #19
- 优化文档,
证书相关名词与官方文档保持一致 - 优化代码,使用ES6
Reflect.set代替param-reassign,性能更高 - 新增函数
Hash.hmac方法,广度支持Hash-based Message Authentication Code - 调整函数
Hash.hmacSha256为不推荐方法,内部改写为固定Hash.hmac调用 - 调整CLI
req <uri>成功调用仅返回{config, headers, data}数据结构
- 优化CLI,
wxpay crt下载平台证书仅在成功验签完成后写入文件 - 优化文档,
AesGcm解密示例 - 优化内部
chain逻辑,遵循RFC3986规范,baseURL支持带部分路径的海外接入点 - 优化代码
SonarQube检测结果3A+0.5%
- 优化CLI,
wxpay <uri>向前兼容以支持slash(/)结尾的请求,形如v3/applyment4sub/applyment/
- 优化CLI,
wxpay <uri>现在支持型如v2.pay.micropay,v3.pay.transactions.native调用 - 优化
README文档,适配最新CLI用法;增加APIv3消息通知QA章节;增加技术交流QQ群说明
- 优化CLI,可以直接
wxpay <uri>发起请求 - 优化
README文档,适配最新CLI用法
- 新增命令行方式与微信支付接口交互工具
- 调整可选依赖包为
peerDependencies,使用完整功能需手动安装form-data或/及yargs
- 使用最新版
eslint及eslint-config-airbnb-base - 增加
utils.merge依赖函数测试校验
- 支持APIv2版的俩账单下载,调用方法与APIv3类同;
- 增加测试用例覆盖,初始化参数
secret(for APIv2)如未设置,HMAC-SHA256数据签名时,可能引发 #14
- 优化
Wechatpay在多次实例化时赋值Symbol(CLIENT)异常问题,增加wechatpay.test.js测试用例覆盖
- 支持 企业微信-企业支付 链式调用,需要额外注入签名规则,见上述文档用法示例
- 文件名大小写问题 #11 感谢 @LiuXiaoZhuang 报告此问题
- 解决了一个
AES-GCM在Node10上的解密兼容性问题,程序在Node10上有可能崩溃,建议Node10用户升级至此版本
- 重构
Wechatpay类,同时支持 APIv2&v3's 链式调用 - 改变
Wechatpay.client返回值为Wechatpay.client.v3,Wechatpay.client.v2为xmlBased接口客户端 - 废弃
withEntities方法,其在链式多次调用时,有可能达不到预期,详情见 #10,感谢 @ali-pay 报告此问题 - README 文档中文化
- 完善补缺
tsd声明
- Typed and tips on
Wechatpayclass(#9), thanks @ipoa
- Upgrade Axios for the CVE-2020-28168
- Optim: Let
Aes.pkcs7.paddingstrictly following therfc2315spec - Optim: Better of the
Hash.md5andHash.hmacSha256 - Coding comments and README
- Optim: new param on
xmlBased({mchid}), while passed in, thenTransformer.signerdoing theassertwith the post data. - Feature: Customize the HTTP
User-Agent. - Refactor: Split
aes.jsas ofAes,AesGcmandAesEcbclasses foraes-256-ecb/pkcs7paddingalgo.
- Feature: The XML based API requests.
- Optim: Coding quality.
- Fix: #8
verfieron the204status case.
- Optim: Back compatible for
12.4.0<Node≧10.15.0.
- Feature:
OOPdeveloping style of the wechatpay APIv3.
- Optim: Toggle the
Nodejsversion ≧10.15.0. - Optim: Documentation and coding comments.
- Feature: definition of the
Typescript
- Optim: on
castCsvBill, drop thetrimon each rows - Optim: on
responsevalidation, checking ± 5 mins first then toRsa.verify - Optim: moved the
commanderoptional dependency, because it's only for theCLItool - Feature: shipped 99 tests(
npm test)
- Feature: billdownload and castCsvBill
- eslint enabled (
npm run lint)
- Chinese document
- Renew document and codes comments
- Feature: certificate downloader, deps on
commander
- Feature: media file upload, optional deps on
form-data
- Feature: Assert the response's timestamp ± 5 mins
- Refactor as CommonJS style(#6)
- Limits the communicating parameters(#7)
- Coding styles(#5)
- Coding comments and Document(#4, #3, #2, #1)
- Init ES2015+ style