Coinbase沙箱环境下VB6 WebSocket认证订阅失败的技术咨询
Coinbase沙箱环境下VB6 WebSocket认证订阅失败的技术咨询
大家好,我最近在基于VB6开发Coinbase的WebSocket客户端(因为FIX 4.2即将废弃,所以切换方案),目前在沙箱环境测试时遇到了认证订阅失败的问题,想跟大家请教下问题出在哪,或者确认下沙箱的功能支持情况。
我的完整测试流程如下:
1. WebSocket连接阶段(已成功)
我使用的沙箱端点是:wss://ws-direct.sandbox.exchange.coinbase.com
VB6连接代码:
Private Sub Form_Load() Debug.Print "Coinbase WebSocket app starting..." ws.Connect "wss://ws-direct.sandbox.exchange.coinbase.com" End Sub
连接结果:
- TCP + TLS握手成功
- WebSocket连接建立,
ws_OnConnect事件正常触发
2. 触发认证订阅消息发送(连接成功后立即执行)
连接成功后我马上构造了带认证信息的订阅消息并发送,VB6代码如下:
Private Sub ws_OnConnect(ByVal RemoteHost As String, _ ByVal RemoteIP As String, _ ByVal RemotePort As String) Debug.Print "CONNECTED" Dim API_KEY As String Dim PASSPHRASE As String Dim SECRET_B64 As String Dim subJson As String API_KEY = "<API_KEY>" PASSPHRASE = "<PASSPHRASE>" SECRET_B64 = "<BASE64_SECRET>" subJson = BuildUserSubscribeJson(API_KEY, PASSPHRASE, SECRET_B64) Debug.Print "SUBSCRIBE JSON >>> "; subJson ws.Send subJson Debug.Print "USER SUBSCRIBE SENT" End Sub
3. 实际发送的订阅JSON payload
我抓包确认了发送的JSON完全符合格式要求:
{ "type": "subscribe", "channels": [ { "name": "user", "product_ids": ["BTC-USD"] } ], "key": "<API_KEY>", "passphrase": "<PASSPHRASE>", "timestamp": "1767952088.908", "signature": "<BASE64_HMAC_SHA256(timestamp + 'GET' + '/users/self/verify')>" }
4. 签名生成逻辑(严格遵循Coinbase文档)
我按照Coinbase官方要求实现了签名逻辑,VB6代码如下:
Public Function BuildUserSubscribeJson( _ ByVal apiKey As String, _ ByVal passphrase As String, _ ByVal secretKeyB64 As String _ ) As String Dim ts As String ts = UnixTimeUtcSeconds() Dim sig As String sig = CoinbaseWsSignatureB64(secretKeyB64, ts) BuildUserSubscribeJson = _ "{""type"":""subscribe""," & _ """channels"":[{""name"":""user"",""product_ids"":[""BTC-USD""]}]," & _ """key"":""" & apiKey & """," & _ """passphrase"":""" & passphrase & """," & _ """timestamp"":""" & ts & """," & _ """signature"":""" & sig & """}" End Function
签名规则细节:
- 待签名字符串格式:
timestamp + "GET" + "/users/self/verify" - 秘钥需先做Base64解码,再用HMAC-SHA256算法生成签名
- 最终签名结果再做Base64编码
- 时间戳使用带小数的UTC Unix时间(如
1767952088.908)
5. 服务器返回结果(认证失败)
发送订阅消息后,服务器立即返回错误响应,随后断开连接:
{ "type": "error", "message": "Authentication Failed", "reason": "authentication required" }
断开连接的状态码为1000(正常关闭)
我的核心疑问
现在我最困惑的是:Coinbase Exchange沙箱环境到底支持WebSocket的user频道认证订阅吗? 还是说这个功能必须绑定生产账户才能使用,或者需要先配置IP白名单?
麻烦有过类似开发经验的朋友帮忙解答下,或者帮我排查下可能的问题点,非常感谢!




