You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:55:19