tkcashgame_v4/pkg/xcrypto/pscrypto/crypto.go

57 lines
1.0 KiB
Go

package pscrypto
import (
"crypto/sha256"
"fmt"
"io"
"sort"
"strings"
"github.com/shopspring/decimal"
)
// signature based sha256
func GetSign(m map[string]interface{}, merchantKey string) string {
var w = sha256.New()
_, _ = io.WriteString(w, sortedAndBuild(m)+merchantKey)
return fmt.Sprintf("%x", w.Sum(nil))
}
func sortedAndBuild(m map[string]interface{}) string {
var b strings.Builder
l, c := len(m), 0
keySet := make([]string, 0, l)
for k, v := range m {
keySet = append(keySet, k)
if _, ok := v.(string); ok {
c = len(k) + len(v.(string)) + 2
} else {
c = len(k) + 10 + 2
}
}
b.Grow(c)
sort.Strings(keySet)
for _, k := range keySet {
if v, ok := m[k]; ok {
var str string
if s, okk := v.(string); okk {
str = s
} else if d, okkk := v.(decimal.Decimal); okkk {
str = d.String()
} else {
str = fmt.Sprintf("%v", v)
}
if len(str) > 0 {
b.WriteString(k)
b.WriteString("=")
b.WriteString(str)
b.WriteString("&")
}
}
}
r := strings.TrimRight(b.String(), "&")
return r
}