Gate.io V4 API PHP下单遇Signature mismatch错误求助
Gate.io V4 API 创建订单「Signature mismatch」错误排查与修复
你遇到的签名不匹配问题,核心是签名字符串构造错误以及POST请求参数传递方式错误,以下是具体问题和修复方案:
关键错误点
- Hashed Payload 变量引用错误:代码中使用了未定义的
$payload变量,实际应该使用POST请求的JSON Body字符串$sBody来计算哈希。 - POST请求错误携带Query参数:创建订单的POST接口参数应放在请求Body中,而非URL Query,但你错误地将Body参数转为Query参数加入签名字符串,同时拼接到请求URL上,导致签名校验逻辑完全偏离要求。
- 请求Body传递错误:调用CURL请求时,错误地将Query字符串作为Body传递,实际应传递JSON格式的
$sBody。 - 缺少必要请求头:未添加
Content-Type: application/json头,服务器无法正确识别Body参数格式。
修正后的代码
<?php $key = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; $host = 'https://api.gateio.ws/api/v4'; $sResourcePath = "/spot/orders"; $sMethod = "POST"; // 构造POST请求Body参数 $aPayload = [ 'currency_pair' => "DOT_USDT", 'price' => "6.330033", 'account' => "spot", 'side' => "buy", 'amount' => "1", 'time_in_force' => "gtc" ]; $sBody = json_encode($aPayload); $aFullPath = parse_url($host . $sResourcePath); $fullPath = $aFullPath['path']; // 获取UTC秒级时间戳(需确保服务器时间与Gate.io服务器同步,偏差过大也会导致签名失败) $timestamp = time(); // 计算Body的SHA512哈希值 $hashedPayload = hash("sha512", $sBody); // POST请求的查询参数部分为空字符串 $signatureString = sprintf("%s\n%s\n%s\n%s\n%s", $sMethod, $fullPath, "", $hashedPayload, $timestamp); // 生成HMAC-SHA512签名 $signature = hash_hmac("sha512", $signatureString, $secret); // 构造请求头,必须包含Content-Type $aHeaders = [ "KEY: " . $key, "SIGN: " . $signature, "Timestamp: " . $timestamp, "Content-Type: application/json" ]; $aExtraParams['sHttpHeaders'] = $aHeaders; // POST请求URL无需拼接Query参数 $sSubmitUrl = $host . $sResourcePath; // 传递JSON格式的Body作为请求参数 $sPage = CURL::doRequest($sMethod, $sSubmitUrl, $sBody, $aExtraParams); $aPage = json_decode($sPage, true); echo "<pre>"; print_r($aPage); echo "</pre>"; ?>
额外注意事项
- 确保服务器时间与UTC时间同步,时间偏差超过30秒会触发签名校验失败。
- 所有参数的格式需严格匹配文档要求(比如价格、金额的字符串格式)。
- 签名字符串的顺序必须严格遵循:
请求方法\n接口路径\n查询参数\n哈希后的Body\n时间戳,POST请求的查询参数部分必须留空。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

