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

调用Crypto.com私有接口遇INVALID_NONCE错误求助(附代码)

解决Crypto.com私有接口INVALID_NONCE错误

关于nonce的核心要求

你的理解是对的:nonce必须是严格递增的唯一值。Crypto.com的私有API对nonce的要求是,每次请求的nonce必须大于之前所有请求使用过的nonce,不能出现回退或重复的情况。

你代码中的问题

当前的nonce生成逻辑存在明显缺陷:

var nonce = Math.floor(new Date().setSeconds(new Date().getSeconds() - 10) / 1000);
nonce += 1;

这段代码基于当前时间减10秒生成nonce,会导致两个关键问题:

  • 若两次请求间隔小于1秒,生成的nonce可能重复;
  • 若本地时间出现波动,或者请求延迟,新生成的nonce可能比之前请求用过的数值更小,直接触发INVALID_NONCE错误。

正确的nonce实现方式

1. 使用持久化递增计数器

将nonce的起始值设为当前Unix时间戳(秒级),之后每次请求都在上一次的基础上加1,并且把这个值存储在持久化位置(比如脚本属性、数据库),确保每次运行都能拿到比上次更大的数值。

以Google Apps Script为例的修改示例:

function getOrderStatus() {
  // 从脚本属性获取上次保存的nonce,无初始值则用当前时间戳初始化
  var scriptProperties = PropertiesService.getScriptProperties();
  var lastNonce = scriptProperties.getProperty('last_nonce');
  var nonce;
  
  if (!lastNonce) {
    nonce = Math.floor(Date.now() / 1000);
  } else {
    nonce = parseInt(lastNonce) + 1;
  }
  // 保存更新后的nonce
  scriptProperties.setProperty('last_nonce', nonce.toString());

  var payload = {
    "id": orderId,
    "method": "private/get-order-detail",
    "params": {
      "order_id": orderId
    },
    "nonce": nonce
  };
  // 后续签名、请求逻辑保持不变...
}

2. 额外注意事项

  • 确保本地运行环境的时间与NTP服务器同步,避免因时间偏差导致nonce不符合API要求;
  • 重试请求时必须使用新的nonce,不能复用之前用过的值;
  • 确认请求头的Timestamp和payload中的nonce是同一个值,你的代码当前这点是正确的,需保持一致。

内容的提问来源于stack exchange,提问作者utphx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:47:02