PowerShell调用Binance测试下单API失败,请求协助排查
排查Binance测试订单API的PowerShell调用问题
我帮你梳理下代码里的几个关键问题,这些都是导致调用失败的核心原因:
1. 参数字符串的转义错误
你在构建$apimessage时用了&(HTML实体转义),但Binance的签名计算需要基于原始的参数分隔符&,转义后的字符串会直接导致签名不匹配,服务器验证不通过。
2. API密钥的解码错误
Binance的API密钥是纯ASCII字符串,不是Base64编码的。你用[Convert]::FromBase64String($apisecret)去解析密钥,会导致HMAC计算用错密钥,这也是签名失败的重要原因。应该直接把密钥字符串转成ASCII字节数组。
3. 签名的输出格式错误
Binance要求签名是HMACSHA256计算后的十六进制字符串,而不是Base64编码。你当前用[Convert]::ToBase64String($signature)生成的签名格式完全不符合平台要求。
修正后的完整代码
下面是修复后的PowerShell脚本,我标注了关键修改点:
$apiKey = "你的API密钥" $unixEpochStart = Get-Date -Date "01/01/1970" $now = Get-Date # 计算精确的毫秒级时间戳(确保是整数) $timestamp = [Math]::Floor((New-TimeSpan -Start $unixEpochStart -End $now.ToUniversalTime()).TotalMilliseconds) # 用原始&分隔参数,不要转义 $apimessage = "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=$timestamp" $apisecret = "你的API密钥" # 直接将API密钥转成ASCII字节数组,不要用Base64解码 $hmacsha = New-Object System.Security.Cryptography.HMACSHA256 $hmacsha.Key = [Text.Encoding]::ASCII.GetBytes($apisecret) $signatureBytes = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($apimessage)) # 将签名字节数组转成十六进制字符串(Binance要求的格式) $signature = [BitConverter]::ToString($signatureBytes) -replace '-', '' # 构建正确的请求URI $uri = "https://api.binance.com/api/v3/order/test?$apimessage&signature=$signature" $header = @{ "X-MBX-APIKEY" = $apiKey } # 发起请求,捕获错误以便排查 try { $response = Invoke-RestMethod -Method Post -Uri $uri -Headers $header -Verbose Write-Host "请求成功:" $response } catch { Write-Host "请求失败:" $_.Exception.Message # 输出详细的错误响应,方便进一步排查 Write-Host "错误详情:" $_.ErrorDetails.Message }
额外注意事项
- 确保你的API密钥已经开启了交易权限(虽然是测试订单,但也需要API密钥有对应的权限)。
- 时间戳要和Binance服务器时间同步,如果本地时间偏差过大,会触发
recvWindow超时错误,建议开启本地时间同步。 recvWindow的取值不要超过60000(60秒),Binance平台有这个限制。
内容的提问来源于stack exchange,提问作者Mihail Stacanov
相关产品推荐
相关产品推荐

