Initial 007Pay Go SDK
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user