调用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
相关产品推荐
相关产品推荐

