VBA调用GDAX API发送POST请求时无法传入product_id报错
Fixing "Requires product_id" Error When Calling GDAX API via VBA
我之前也踩过这个一模一样的坑!GDAX(现在叫Coinbase Pro)的订单API对POST请求的格式要求特别严格,你看到的{"message":"Requires product_id"}错误,本质原因是服务器没能正确解析你发送的POST数据,而不是你没传product_id。
先聊聊你试过的几种方法为啥没用:
- 在URL后加
?product_id=BTC-EUR:这是GET请求的传参逻辑,POST订单的参数必须放在请求体里,服务器不会从URL里读取这个参数来创建订单。 - 直接在
Send后传"product_id=BTC-EUR":这是application/x-www-form-urlencoded格式的参数,但GDAX订单API只接受JSON格式的请求体,服务器根本识别不了。 - 构造了JSON字符串但没设置请求头:哪怕你传了正确的JSON,如果没告诉服务器“这是JSON数据”,它会把内容当成普通文本,自然找不到
product_id字段。
正确的解决步骤
核心就是给请求加上Content-Type: application/json请求头,同时确保JSON格式完全合规。这里给你一个完整的VBA代码示例:
Sub PlaceGDAXOrder() Dim httpRequest As WinHttp.WinHttpRequest.5.1 Dim requestBody As String Dim apiEndpoint As String ' 初始化HTTP请求对象 Set httpRequest = New WinHttp.WinHttpRequest.5.1 ' GDAX订单API的正确端点 apiEndpoint = "https://api.gdax.com/orders" ' 构造符合要求的JSON请求体(VBA中双引号要转义为两个双引号) requestBody = "{""size"": ""0.01"",""price"": ""0.100"",""side"": ""buy"",""product_id"": ""BTC-USD""}" ' 打开POST请求 httpRequest.Open "POST", apiEndpoint, False ' 关键!添加Content-Type请求头,告诉服务器接收的是JSON数据 httpRequest.SetRequestHeader "Content-Type", "application/json" ' 别忘了添加GDAX要求的身份认证头(必须项,否则会报权限错误) ' 替换成你的API密钥相关信息 ' httpRequest.SetRequestHeader "CB-ACCESS-KEY", "YOUR_API_KEY" ' httpRequest.SetRequestHeader "CB-ACCESS-SIGN", "YOUR_GENERATED_SIGNATURE" ' httpRequest.SetRequestHeader "CB-ACCESS-TIMESTAMP", "CURRENT_TIMESTAMP" ' httpRequest.SetRequestHeader "CB-ACCESS-PASSPHRASE", "YOUR_PASSPHRASE" ' 发送JSON请求体 httpRequest.Send requestBody ' 输出响应结果到立即窗口 Debug.Print httpRequest.ResponseText Set httpRequest = Nothing End Sub
额外注意事项
- 认证头必须齐全:GDAX的订单API需要身份验证,你必须按照官方文档生成并添加
CB-ACCESS-KEY、CB-ACCESS-SIGN等请求头,否则哪怕解决了product_id的问题,也会收到权限错误。 - JSON格式要严谨:确保所有键和字符串值都用双引号包裹,逗号分隔正确,没有多余的逗号或语法错误——哪怕一个小失误,服务器都可能解析失败。
- 检查API端点:确认你调用的是正确的订单创建端点(
https://api.gdax.com/orders),别用错其他端点。
内容的提问来源于stack exchange,提问作者Eggator




