|
- package weapp
-
- import (
- "encoding/base64"
- "encoding/json"
- "errors"
- )
-
- // DecryptUserData 解密用户数据
- func DecryptUserData(ssk, ciphertext, iv string) ([]byte, error) {
- key, err := base64.StdEncoding.DecodeString(ssk)
- if err != nil {
- return nil, err
- }
- cipher, err := base64.StdEncoding.DecodeString(ciphertext)
- if err != nil {
- return nil, err
- }
-
- rawIV, err := base64.StdEncoding.DecodeString(iv)
- if err != nil {
- return nil, err
- }
- return cbcDecrypt(key, cipher, rawIV)
- }
-
- 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
- }
-
- // RunData 解密后的最近30天微信运动步数
- type RunData struct {
- StepInfoList []SetpInfo `json:"stepInfoList"`
- }
-
- // SetpInfo 运动步数
- type SetpInfo struct {
- Step int `json:"step"`
- Timestamp int64 `json:"timestamp"`
- }
-
- // DecryptRunData 解密微信运动的加密数据
- //
- // sessionKey 通过 Login 向微信服务端请求得到的 session_key
- // encryptedData 小程序通过 api 得到的加密数据(encryptedData)
- // iv 小程序通过 api 得到的初始向量(iv)
- func DecryptRunData(sessionKey, encryptedData, iv string) (*RunData, error) {
- raw, err := DecryptUserData(sessionKey, encryptedData, iv)
- if err != nil {
- return nil, err
- }
-
- info := new(RunData)
- if err := json.Unmarshal(raw, info); err != nil {
- return nil, err
- }
-
- return info, nil
- }
|