Node.js中JSON.stringify导致CCBILL订阅ID数值被舍入问题
问题根源:JavaScript Number的精度限制
你的问题出在JavaScript Number类型的精度上限上:
- JavaScript的Number是双精度浮点数,最大安全整数是
2^53(即9007199254740992),而你的订阅ID0124058201000005323远大于这个值。当Node.js默认的JSON解析器把接口返回的大整数转成Number类型时,会自动丢失精度,导致数值被舍入。 - Postman能得到正确结果,是因为它默认会把超出安全范围的大整数保留为字符串类型,而非强制转成Number,所以不会出现精度丢失。
解决方案
针对你的Node.js代码,有两种可行的修复方式:
1. 自定义JSON解析的reviver函数
不需要额外安装依赖,直接在解析JSON时,指定reviver函数将subscriptionId强制转为字符串:
function chargeCCbill(authToken, sendData){ return fetch(`${ccBillBaseUrl}/transactions/payment-tokens/${sendData.paymentTokenId}`,{ method:'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${authToken}`, }, body:JSON.stringify(sendData) }) .then((subData) => subData.text()) // 先获取原始响应文本 .then((text) => JSON.parse(text, (key, value) => { // 对subscriptionId字段做特殊处理,转为字符串保留完整值 if (key === 'subscriptionId' && typeof value === 'number') { return value.toString(); } return value; })) .then((json)=>{ if(json.subscriptionId !== null && json.declineCode === null && json.approved === true ){ return {status:'success',subscriptionData:json} } else{ return {status:'fail',subscriptionData:json} } }) }
2. 使用专门处理大整数的JSON库
安装json-bigint库,它会自动识别并处理超出安全范围的大整数,可配置为存储为字符串或BigInt类型:
npm install json-bigint
修改代码如下:
const JSONbig = require('json-bigint')({ storeAsString: true }); // 配置为将大整数存储为字符串 function chargeCCbill(authToken, sendData){ return fetch(`${ccBillBaseUrl}/transactions/payment-tokens/${sendData.paymentTokenId}`,{ method:'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${authToken}`, }, body:JSON.stringify(sendData) }) .then((subData) => subData.text()) .then((text) => JSONbig.parse(text)) // 用json-bigint解析响应文本 .then((json)=>{ if(json.subscriptionId !== null && json.declineCode === null && json.approved === true ){ return {status:'success',subscriptionData:json} } else{ return {status:'fail',subscriptionData:json} } }) }
关于请求头的说明
那个可选的application/vnd.mcn.transaction-service.api.v.1+json请求头和当前问题无关——Postman没加也能正确获取结果,说明接口返回的订阅ID本身是正确的,只是Node.js默认的JSON解析器处理方式导致了精度丢失。
内容的提问来源于stack exchange,提问作者ttyagi3963
相关产品推荐
相关产品推荐

