You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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白名单?

麻烦有过类似开发经验的朋友帮忙解答下,或者帮我排查下可能的问题点,非常感谢!

火山引擎 最新活动