You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FTX FIX协议返回Invalid signature错误:Go签名生成实现问题

问题核心原因及修复方案

你的签名生成逻辑存在3个典型错误,是导致Invalid signature报错的直接原因:

  • 时间格式不符合FTX要求:当前你使用的时间格式仅精确到秒,FTX FIX接口要求签名使用的UTC时间必须精确到毫秒,对应Go时间格式为20060102-15:04:05.000,缺少毫秒位会直接校验失败。
  • 签名原始串结构错误:使用bytes.Join拼接5个字段仅会生成4个SOH分隔符,而FTX要求所有参与签名的字段末尾都必须携带SOH分隔符,包括最后一个TargetCompID字段,因此拼接完成后需要额外追加1个SOH字符。
  • 时间变量未复用:当前时间在签名函数内生成,如果你没有将该时间值同步赋值给FIX报文的SendingTime字段,两次生成的时间不一致也会导致签名无效,需要调整函数返回生成的时间值供报文组装使用。

修正后的代码实现

// 调整函数返回生成的时间,用于同步报文SendingTime字段
func signatureGenerator(msgType, msgSeqNum, senderCompID, targetCompID string) (string, string) {
    // 修正时间格式,精确到毫秒
    timeNow := time.Now().UTC().Format("20060102-15:04:05.000")

    message := [][]byte{[]byte(timeNow),
                        []byte(msgType),
                        []byte(msgSeqNum), 
                        []byte(senderCompID),
                        []byte(targetCompID)}
    SOH := []byte{0x01}
    // 拼接后追加末尾SOH
    signatureRaw := append(bytes.Join(message, SOH), SOH...)

    signSha256 := hmac.New(sha256.New, []byte(userInfo.CLIENT_API_SECRET))
    signSha256.Write(signatureRaw)

    strSig := hex.EncodeToString(signSha256.Sum(nil))
    return strSig, timeNow
}

额外校验点

你还可以自行排查以下常见问题:

  • 确认SenderCompID字段取值为你的FTX API Key,不要误填为账户名
  • 确认API Secret取值正确,没有多余的前后空格或换行符
  • 确认Logon消息的MsgType取值为A,MsgSeqNum初始值从1开始递增

内容的提问来源于stack exchange,提问作者Harry G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:15:03