调用Crypto.com C# REST API私有端点遇INVALID_NONCE错误求助
解决Crypto.com私有API的INVALID_NONCE错误(错误码10007)
针对你调用private/get-currency-networks接口时遇到的INVALID_NONCE错误,结合文档说明的“nonce与服务器时间差超30秒”原因,给出以下实操解决方法:
强制校准本地时间
本地机器/服务器时间偏差是最常见的原因,务必开启NTP同步:- Windows执行命令:
w32tm /resync强制同步时间 - Linux执行命令:
timedatectl set-ntp true或ntpd -q完成同步
同步后可以手动验证:调用Crypto.com的公开public/time接口获取服务器毫秒级时间戳,和本地DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()输出对比,差值必须控制在30秒内。
- Windows执行命令:
改用服务器时间作为nonce基准
避免依赖本地时间,先请求public/time获取服务器当前时间戳,以此为基础生成nonce:// 先实现获取服务器时间的方法 private long GetCryptoComServerTime() { using var client = new HttpClient(); var response = client.GetStringAsync("https://api.crypto.com/v2/public/time").Result; var json = JsonDocument.Parse(response); return json.RootElement.GetProperty("result").GetProperty("serverTime").GetInt64(); } // 生成nonce:基于服务器时间,确保每次请求递增 private static long _lastNonce; long GenerateNonce() { long serverTime = GetCryptoComServerTime(); return Interlocked.Max(ref _lastNonce, serverTime) + 1; }用
Interlocked.Max保证nonce不会因服务器时间回拨(极端情况)而递减,同时每次请求自动加1,避免重复。检查nonce与签名的一致性
确认签名计算时使用的nonce值,和最终请求体中的nonce字段完全一致,不能在签名后修改nonce,否则会导致签名验证失败同时触发nonce错误。确保nonce严格递增
即使时间校准正常,重复或递减的nonce也会触发错误。如果是并发请求场景,必须用线程安全的计数器(比如Interlocked.Increment)来维护nonce的递增逻辑,不能依赖本地时间的自然增长。
内容的提问来源于stack exchange,提问作者Mateus Lima Silveira
相关产品推荐
相关产品推荐

