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
相关产品推荐
相关产品推荐

