57 lines
1.0 KiB
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
|
|
}
|