satang-api
Search
⌃K

Golang

// signature, attach this one in header
sig := signature.Sign("APISecret", params)
// caller function
func Sign(secret string, payload map[string]interface{}) string {
sig := xsig.Sign([]byte(secret), payload)
dst := make([]byte, hex.EncodedLen(len(sig)))
hex.Encode(dst, sig)
return string(dst)
}
//signature signer
import (
"crypto/hmac"
"crypto/sha512"
"fmt"
"sort"
"github.com/sirupsen/logrus"
)
func ConstructQueryString(params map[string]interface{}) string {
return constructQueryStringWithPrefix(params, "")
}
func Sign(secret []byte, params map[string]interface{}) []byte {
qs := ConstructQueryString(params)
mac := hmac.New(sha512.New, secret)
mac.Write([]byte(qs))
return mac.Sum(nil)
}
func Verify(secret []byte, params map[string]interface{}, signature []byte) bool {
return hmac.Equal(Sign(secret, params), signature)
}
func constructQueryStringWithPrefix(params map[string]interface{}, prefix string) string {
var keys []string
for k, _ := range params {
keys = append(keys, k)
}
sort.Strings(keys)
var qs string
for i, k := range keys {
v := params[k]
if nestedParams, ok := v.(map[string]interface{}); ok {
qs += constructQueryStringWithPrefix(nestedParams, k)
} else if array, ok := v.([]interface{}); ok {
nestedMap := map[string]interface{}{}
for i, v := range array {
nestedMap[fmt.Sprintf("%d", i)] = v
}
qs += constructQueryStringWithPrefix(nestedMap, k)
} else {
if prefix == "" {
if _, ok := v.(float64); ok {
qs += fmt.Sprintf("%s=%.f", k, v)
} else {
qs += fmt.Sprintf("%s=%v", k, v)
}
} else {
if _, ok := v.(float64); ok {
qs += fmt.Sprintf("%s[%s]=%.f", prefix, k, v)
} else {
qs += fmt.Sprintf("%s[%s]=%v", prefix, k, v)
}
}
}
if i != len(keys)-1 {
qs += "&"
}
}
return qs
}
Last modified 1yr ago