调用Cashfree支付网关创建订阅报ERR_INVALID_ARG_TYPE错误如何解决
报错原因与排查方案
TypeError [ERR_INVALID_ARG_TYPE]是Node.js的标准类型错误,本质是调用内置方法时,第一个入参不符合「字符串/Buffer/Uint8Array」的要求,实际传入了未序列化的JS对象。针对Cashfree支付网关的接入场景,优先排查以下三个高频出错点:
1. 签名生成逻辑
Cashfree接口要求请求前生成校验签名,计算签名的载荷必须是序列化后的JSON字符串,如果你直接把未处理的JS对象传入加密方法,就会触发该错误。
- 错误示例:
const crypto = require('crypto') const hmac = crypto.createHmac('sha256', YOUR_CASHFREE_SECRET) hmac.update(requestBody) // requestBody是未序列化的对象,此处触发报错
- 修正写法:
const crypto = require('crypto') const hmac = crypto.createHmac('sha256', YOUR_CASHFREE_SECRET) hmac.update(JSON.stringify(requestBody)) // 先转字符串再传入
2. 发起API请求的逻辑
如果你用Node.js内置的http/https模块发请求给Cashfree,request.write()方法要求入参是字符串/Buffer,直接传对象也会报错。
- 错误示例:
const req = https.request(cashfreeOptions, (res) => { /* 响应处理 */ }) req.write(requestBody) // 直接传对象触发报错
- 修正写法:
const req = https.request(cashfreeOptions, (res) => { /* 响应处理 */ }) req.write(JSON.stringify(requestBody)) // 先序列化再传入
3. 后端参数接收逻辑
确认你的Express/Koa服务已经配置了JSON解析中间件,避免拿到未解析的请求体对象直接做后续处理。如果用的是Express,要确保代码里已经加上:
app.use(express.json())
快速定位技巧
在报错堆栈指向的代码行前后,打印对应入参的类型和值:console.log(typeof 入参变量, 入参变量),可以直接定位到哪个参数没有做类型转换,针对性修正即可。
内容的提问来源于stack exchange,提问作者Ayaz Alam
相关产品推荐
相关产品推荐

