Files
007pay-sdk/sign.go
T
2026-07-10 17:18:58 +08:00

56 lines
1.2 KiB
Go

package pay007
import (
"crypto/md5"
"encoding/hex"
"sort"
"strings"
)
var ignoredSignKeys = map[string]struct{}{
"sign": {},
"sign_type": {},
}
// BuildSign creates the 007Pay merchant MD5 signature.
//
// Empty values, sign, and sign_type are ignored. The remaining params are
// sorted by key, joined as "a=1&b=2", appended with the app secret, then MD5
// hashed and upper-cased.
func BuildSign(params map[string]string, secret string) string {
keys := make([]string, 0, len(params))
for k, v := range params {
if v == "" {
continue
}
if _, ok := ignoredSignKeys[k]; ok {
continue
}
keys = append(keys, k)
}
sort.Strings(keys)
var b strings.Builder
for i, k := range keys {
if i > 0 {
b.WriteByte('&')
}
b.WriteString(k)
b.WriteByte('=')
b.WriteString(params[k])
}
b.WriteString(secret)
sum := md5.Sum([]byte(b.String()))
return strings.ToUpper(hex.EncodeToString(sum[:]))
}
// VerifySign checks params["sign"] with the 007Pay signing rule.
func VerifySign(params map[string]string, secret string) bool {
sign := params["sign"]
if sign == "" {
return false
}
return strings.EqualFold(BuildSign(params, secret), sign)
}