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 }