package util import ( "crypto/hmac" "crypto/sha256" "encoding/base64" "strings" ) // HMACSign 用共享密钥对若干片段做 HMAC-SHA256 签名(片段以 \n 连接),返回 base64。 // 业务对接双向共用:pay 校验业务方下单请求签名 + 给回调 payload 签名。 func HMACSign(secret string, parts ...string) string { mac := hmac.New(sha256.New, []byte(secret)) mac.Write([]byte(strings.Join(parts, "\n"))) return base64.StdEncoding.EncodeToString(mac.Sum(nil)) } // HMACVerify 常量时间比对签名,防时序侧信道。 func HMACVerify(secret, sig string, parts ...string) bool { expected := HMACSign(secret, parts...) return hmac.Equal([]byte(expected), []byte(sig)) }