99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
// 生成签名用
|
||
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
|
||
}
|