56 lines
1.2 KiB
Go
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)
|
|
}
|