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) }