-
Notifications
You must be signed in to change notification settings - Fork 698
/
sign.go
122 lines (110 loc) · 2.72 KB
/
sign.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package core
import (
"bufio"
"bytes"
"crypto/md5"
"crypto/sha1"
"encoding/hex"
"hash"
"sort"
)
// Sign 微信支付签名.
// params: 待签名的参数集合
// apiKey: api密钥
// fn: func() hash.Hash, 如果为 nil 则默认用 md5.New
func Sign(params map[string]string, apiKey string, fn func() hash.Hash) string {
if fn == nil {
fn = md5.New
}
return Sign2(params, apiKey, fn())
}
// Sign2 微信支付签名.
// params: 待签名的参数集合
// apiKey: api密钥
// h: hash.Hash, 如果为 nil 则默认用 md5.New(), 特别注意 h 必须是 initial state.
func Sign2(params map[string]string, apiKey string, h hash.Hash) string {
if h == nil {
h = md5.New()
}
keys := make([]string, 0, len(params))
for k := range params {
if k == "sign" {
continue
}
keys = append(keys, k)
}
sort.Strings(keys)
bufw := bufio.NewWriterSize(h, 128)
for _, k := range keys {
v := params[k]
if v == "" {
continue
}
bufw.WriteString(k)
bufw.WriteByte('=')
bufw.WriteString(v)
bufw.WriteByte('&')
}
bufw.WriteString("key=")
bufw.WriteString(apiKey)
bufw.Flush()
signature := make([]byte, hex.EncodedLen(h.Size()))
hex.Encode(signature, h.Sum(nil))
return string(bytes.ToUpper(signature))
}
// jssdk 支付签名, signType 只支持 "MD5", "SHA1", 传入其他的值会 panic.
func JsapiSign(appId, timeStamp, nonceStr, packageStr, signType string, apiKey string) string {
var h hash.Hash
switch signType {
case SignType_MD5:
h = md5.New()
case SignType_SHA1:
h = sha1.New()
default:
panic("unsupported signType")
}
bufw := bufio.NewWriterSize(h, 128)
// appId
// nonceStr
// package
// signType
// timeStamp
bufw.WriteString("appId=")
bufw.WriteString(appId)
bufw.WriteString("&nonceStr=")
bufw.WriteString(nonceStr)
bufw.WriteString("&package=")
bufw.WriteString(packageStr)
bufw.WriteString("&signType=")
bufw.WriteString(signType)
bufw.WriteString("&timeStamp=")
bufw.WriteString(timeStamp)
bufw.WriteString("&key=")
bufw.WriteString(apiKey)
bufw.Flush()
signature := make([]byte, hex.EncodedLen(h.Size()))
hex.Encode(signature, h.Sum(nil))
return string(bytes.ToUpper(signature))
}
// EditAddressSign 收货地址共享接口签名
func EditAddressSign(appId, url, timestamp, nonceStr, accessToken string) string {
h := sha1.New()
bufw := bufio.NewWriterSize(h, 128)
// accesstoken
// appid
// noncestr
// timestamp
// url
bufw.WriteString("accesstoken=")
bufw.WriteString(accessToken)
bufw.WriteString("&appid=")
bufw.WriteString(appId)
bufw.WriteString("&noncestr=")
bufw.WriteString(nonceStr)
bufw.WriteString("×tamp=")
bufw.WriteString(timestamp)
bufw.WriteString("&url=")
bufw.WriteString(url)
bufw.Flush()
return hex.EncodeToString(h.Sum(nil))
}