调用Binance API遇1101错误:Symbol参数值重复排查求助
问题排查:Binance API调用出现"Duplicate values for parameter 'symbol'"错误
调用Binance的/api/v3/order/test接口时收到错误响应:
{"code":-1101,"msg":"Duplicate values for parameter 'symbol'."}
但代码中symbol参数既不是数组也没有重复值,相关代码如下:
$apiKey = ''; $apiSecret = ''; $url = 'https://api.binance.com/api/v3/order/test'; $data = [ 'symbol' => 'BTCUSDT', 'side' => self::SIDE_BUY, 'type' => 'MARKET', 'quantity' => 0.01, ]; $timestamp = time()*1000; //get current timestamp in milliseconds $query_str = []; $query_str = $data; $query_str['timestamp'] = $timestamp; $query_str = http_build_query($query_str); $signature = hash_hmac('sha256', $query_str, $apiSecret); $query_str .= "&signature=" . $signature; //Decide content type $content_type = ["Content-Type: application/x-www-form-urlencoded","X-MBX-APIKEY: ".$apiKey]; // Final url $url .= '?' . $query_str; $ch = @curl_init(); @curl_setopt($ch, CURLOPT_HEADER, false); @curl_setopt($ch, CURLOPT_URL, $url); @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @curl_setopt($ch, CURLOPT_HTTPHEADER, $content_type); @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); @curl_setopt($ch, CURLOPT_TIMEOUT, 10); @curl_setopt($ch, CURLOPT_POSTFIELDS, $query_str); $response = @curl_exec($ch); $http_code = @curl_getinfo($ch, CURLINFO_HTTP_CODE); @curl_close($ch);
问题原因
你代码里的核心错误是同时在URL查询参数和POST请求体中传递了包含symbol的完整参数串:
- 代码执行
$url .= '?' . $query_str;后,URL会带上所有参数(包括symbol) - 又通过
CURLOPT_POSTFIELDS将同一个query_str作为POST表单数据发送 - Binance服务器会从两个位置获取到重复的
symbol参数,因此返回重复参数错误
解决方法
按照Binance API规范,选择一种参数传递方式即可,推荐使用POST方式传递参数,修改步骤如下:
- 移除URL拼接参数的代码,保持原始API地址:
// 删掉这行:$url .= '?' . $query_str;
- 显式指定curl使用POST请求(虽然设置
CURLOPT_POSTFIELDS会默认触发POST,但显式声明更清晰):
@curl_setopt($ch, CURLOPT_POST, true);
修改后的关键代码片段:
// 保持原始URL,不拼接参数 $url = 'https://api.binance.com/api/v3/order/test'; // ... 签名生成逻辑保持不变 ... $ch = @curl_init(); @curl_setopt($ch, CURLOPT_HEADER, false); @curl_setopt($ch, CURLOPT_URL, $url); @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @curl_setopt($ch, CURLOPT_HTTPHEADER, $content_type); @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); @curl_setopt($ch, CURLOPT_TIMEOUT, 10); @curl_setopt($ch, CURLOPT_POST, true); // 显式指定POST请求 @curl_setopt($ch, CURLOPT_POSTFIELDS, $query_str); $response = @curl_exec($ch); // ... 后续处理逻辑不变 ...
内容的提问来源于stack exchange,提问作者Kaloyan Nikolov
相关产品推荐
相关产品推荐

