forked from royalrick/weapp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
decrypt.go
105 lines (88 loc) · 2.81 KB
/
decrypt.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
package weapp
import (
"encoding/json"
"errors"
)
type watermark struct {
AppID string `json:"appid"`
Timestamp int64 `json:"timestamp"`
}
// Mobile 解密后的用户手机号码信息
type Mobile struct {
PhoneNumber string `json:"phoneNumber"`
PurePhoneNumber string `json:"purePhoneNumber"`
CountryCode string `json:"countryCode"`
Watermark watermark `json:"watermark"`
}
// DecryptMobile 解密手机号码
//
// sessionKey 通过 Login 向微信服务端请求得到的 session_key
// encryptedData 小程序通过 api 得到的加密数据(encryptedData)
// iv 小程序通过 api 得到的初始向量(iv)
func DecryptMobile(sessionKey, encryptedData, iv string) (*Mobile, error) {
raw, err := decryptUserData(sessionKey, encryptedData, iv)
if err != nil {
return nil, err
}
mobile := new(Mobile)
if err := json.Unmarshal(raw, mobile); err != nil {
return nil, err
}
return mobile, nil
}
// ShareInfo 解密后的分享信息
type ShareInfo struct {
GID string `json:"openGId"`
}
// DecryptShareInfo 解密转发信息的加密数据
//
// sessionKey 通过 Login 向微信服务端请求得到的 session_key
// encryptedData 小程序通过 api 得到的加密数据(encryptedData)
// iv 小程序通过 api 得到的初始向量(iv)
//
// gid 小程序唯一群号
func DecryptShareInfo(sessionKey, encryptedData, iv string) (*ShareInfo, error) {
raw, err := decryptUserData(sessionKey, encryptedData, iv)
if err != nil {
return nil, err
}
info := new(ShareInfo)
if err = json.Unmarshal(raw, info); err != nil {
return nil, err
}
return info, nil
}
// UserInfo 解密后的用户信息
type UserInfo struct {
OpenID string `json:"openId"`
Nickname string `json:"nickName"`
Gender int `json:"gender"`
Province string `json:"province"`
Language string `json:"language"`
Country string `json:"country"`
City string `json:"city"`
Avatar string `json:"avatarUrl"`
UnionID string `json:"unionId"`
Watermark watermark `json:"watermark"`
}
// DecryptUserInfo 解密用户信息
//
// sessionKey 微信 session_key
// rawData 不包括敏感信息的原始数据字符串,用于计算签名。
// encryptedData 包括敏感数据在内的完整用户信息的加密数据
// signature 使用 sha1( rawData + session_key ) 得到字符串,用于校验用户信息
// iv 加密算法的初始向量
func DecryptUserInfo(sessionKey, rawData, encryptedData, signature, iv string) (*UserInfo, error) {
if ok := validateUserInfo(signature, rawData, sessionKey); !ok {
return nil, errors.New("failed to validate signature")
}
raw, err := decryptUserData(sessionKey, encryptedData, iv)
if err != nil {
return nil, err
}
info := new(UserInfo)
if err := json.Unmarshal(raw, info); err != nil {
return nil, err
}
return info, nil
}