Gate.io APIv4认证请求签名报INVALID_SIGNATURE错误求助
常见错误排查点
- 请求方法大小写不匹配:签名用的请求方法必须是全大写(如GET、POST),如果传入的是小写的method也会导致签名错误。
- Query参数未填充到签名串:你当前代码里签名串的第三个参数固定写了空字符串,只有无任何Query参数的请求才能这么写。如果是带Query的GET/DELETE类请求,需要将所有Query参数按key的ASCII码升序排序后拼接成
key1=value1&key2=value2的格式填入该位置,不能留空。 - JSON编码参数不匹配:PHP默认
json_encode会自动转义斜杠,和Gate.io要求的Payload格式不一致,会导致Payload哈希校验失败。需要给json_encode增加JSON_UNESCAPED_SLASHES参数,同时保证签名时生成的JSON字符串和实际发请求时携带的Body完全一致,不要签名和发请求时分别做两次JSON编码。 - 请求路径拼接错误:检查
$fullPath是否和你实际请求的接口路径完全一致,比如不要多前缀、少斜杠,常见错误是把域名的host部分也拼进了路径,或者路径多了/api/v4之外的多余前缀。 - 时间戳误差超限:Gate.io要求签名用的秒级Unix时间戳和服务器时间误差不能超过5s,请确认你的运行环境已经开启NTP时间同步,同时时间戳是秒级不是毫秒级。
- 请求头参数不匹配:请求头里携带的
KEY、Timestamp必须和你签名时用的API_KEY、$timestamp完全一致,同时POST请求需要携带Content-Type: application/json请求头。
修正后的签名函数参考
function signature($method, $url, $query = [], $body = [], $timestamp) { // 处理Query参数 $queryStr = ''; if (!empty($query)) { ksort($query); $queryStr = http_build_query($query); } // 处理Body,保证和发请求的Body完全一致 $bodyStr = is_array($body) ? json_encode($body, JSON_UNESCAPED_SLASHES) : $body; // 确认路径和实际请求路径完全一致 $fullPath = $url; $fmt = "%s\n%s\n%s\n%s\n%s"; $hashedPayload = hash("sha512", $bodyStr); $signatureString = sprintf( $fmt, strtoupper($method), $fullPath, $queryStr, $hashedPayload, $timestamp ); $signature = hash_hmac("sha512", $signatureString, $this->SECRET_KEY); return $signature; }
内容的提问来源于stack exchange,提问作者Marek Tesař
相关产品推荐
相关产品推荐

