hmac.New第二个参数必须是[]byte而非string密钥类型错误、签名原文拼接不一致、body重复读取、timestamp与nonce校验不严是验签失败四大主因。hmac.New 传 []byte 还是 string密钥类型错就全崩签名验签失败八成栽在密钥类型上。Go 的 hmac.New 第二个参数必须是 []byte不是 string——哪怕你写 []byte(secret) 都行但绝不能用 string([]byte(secret)) 或隐式转换。hmac.New(sha256.New, []byte(my-key)) ? 安全、可复现hmac.New(sha256.New, []byte(secretStr)) ? 只要 secretStr 是 string 类型变量强制转没问题hmac.New(sha256.New, []byte(string([]byte(x)))) ? 多余转换易引入空字符或编码歧义用 string(secretBytes) 再转回 []byte ? 底层内存不共享且可能含不可见控制符实操建议密钥统一从环境变量读取后直接 []byte(os.Getenv(API_SECRET))别中间多绕一环测试时打印 len(key) 和 fmt.Printf(%q, key) 确认没空格/换行。签名原文拼接顺序不对hmac.Equal 永远返回 false客户端和服务端算出的签名不一致几乎全是拼接规则没对齐。不是“差不多就行”而是每个字符、每个换行、大小写、URL 编码都得严丝合缝。必须包含method path timestamp nonce bodyHash推荐 SHA256(body) hex 小写query 参数不能用 req.URL.RawQuery —— 它顺序不定得手动解析 url.ParseQuery再 sort.Strings(keys) 后拼 keyvaluekeyvaluebody 要用原始字节流计算哈希不是 c.PostFormValue 或 c.ShouldBindJSON 解析后的结构体所有 value 必须做 url.PathEscape不是 url.QueryEscape尤其含斜杠、空格、中文时常见错误现象X-Signature-Timestamp: 1711800000 末尾带空格、GET /api/v1/user 和 get /api/v1/usermethod 大小写不一致、body 里 JSON 字段顺序不同导致哈希不同。立即学习“go语言免费学习笔记深入” 今天学点啥 秘塔AI推出的AI学习助手