game_sync/webapi/sign.go

99 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 生成签名用
package webapi
import (
"bytes"
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"net/url"
"sort"
"strconv"
"time"
)
// 生成签名
func MakeSig(appId, action string, params map[string]string, data []byte, ts int) string {
h := md5.New()
io.WriteString(h, action)
io.WriteString(h, strconv.Itoa(ts))
io.WriteString(h, appId)
if len(params) > 0 {
vals := []string{}
for _, v := range params {
vals = append(vals, v)
}
//sort
sort.Strings(vals)
cnt := len(vals)
for i := 0; i < cnt; i++ {
io.WriteString(h, vals[i])
}
}
if len(data) > 0 {
h.Write(data)
}
//println()
return hex.EncodeToString(h.Sum(nil))
}
// 生成请求串
func MakeURL(appId, action string, params map[string]string, data []byte) string {
var buf bytes.Buffer
buf.WriteString(Config.GameApiURL)
buf.WriteString(action)
buf.WriteString("?")
if len(params) > 0 {
for k, v := range params {
buf.WriteString(k)
buf.WriteString("=")
buf.WriteString(url.QueryEscape(v))
buf.WriteString("&")
}
}
ts := time.Now().Nanosecond()
buf.WriteString("nano=" + strconv.Itoa(ts) + "&")
buf.WriteString("sign=")
buf.WriteString(url.QueryEscape(MakeSig(appId, action, params, data, ts)))
return buf.String()
}
func MakeMd5String(strs ...string) string {
buff := md5.New()
for _, value := range strs {
io.WriteString(buff, value)
}
return hex.EncodeToString(buff.Sum(nil))
}
func StringToMD5(waitMD5string string) string {
h := md5.New()
h.Write([]byte(waitMD5string))
cipherStr := h.Sum(nil)
return hex.EncodeToString(cipherStr)
}
func MD5Params(params map[string]string, key string, filter string) string {
// 将请求参数的key提取出来并排好序
newKeys := make([]string, 0)
for k, _ := range params {
//需要过滤的签名
if k == filter {
continue
}
newKeys = append(newKeys, k)
}
sort.Strings(newKeys)
var originStr string
// 将输入进行标准化的处理
for _, v := range newKeys {
originStr += fmt.Sprintf("%v=%v&", v, params[v])
}
originStr += fmt.Sprintf("key=%v", key)
// 使用md5算法进行处理
sign := StringToMD5(originStr)
return sign
}