1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-02-11 08:12:26 +08:00

优化小程序解密 (#262)

This commit is contained in:
silenceper
2020-05-30 08:08:03 +08:00
committed by GitHub
parent 351cf65621
commit 0e23fa3fee
4 changed files with 29 additions and 54 deletions

View File

@@ -1,15 +0,0 @@
package basic
import "github.com/silenceper/wechat/v2/miniprogram/context"
//Basic struct
type Basic struct {
*context.Context
}
//NewBasic 实例
func NewBasic(context *context.Context) *Basic {
basic := new(Basic)
basic.Context = context
return basic
}

View File

@@ -1,4 +1,4 @@
package basic package encryptor
import ( import (
"crypto/aes" "crypto/aes"
@@ -6,8 +6,23 @@ import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"errors" "errors"
"github.com/silenceper/wechat/v2/miniprogram/context"
) )
//Encryptor struct
type Encryptor struct {
*context.Context
}
//NewEncryptor 实例
func NewEncryptor(context *context.Context) *Encryptor {
basic := new(Encryptor)
basic.Context = context
return basic
}
var ( var (
// ErrAppIDNotMatch appid不匹配 // ErrAppIDNotMatch appid不匹配
ErrAppIDNotMatch = errors.New("app id not match") ErrAppIDNotMatch = errors.New("app id not match")
@@ -19,8 +34,8 @@ var (
ErrInvalidPKCS7Padding = errors.New("invalid padding on input") ErrInvalidPKCS7Padding = errors.New("invalid padding on input")
) )
// UserInfo 用户信息 // PlainData 用户信息/手机号信息
type UserInfo struct { type PlainData struct {
OpenID string `json:"openId"` OpenID string `json:"openId"`
UnionID string `json:"unionId"` UnionID string `json:"unionId"`
NickName string `json:"nickName"` NickName string `json:"nickName"`
@@ -30,18 +45,10 @@ type UserInfo struct {
Country string `json:"country"` Country string `json:"country"`
AvatarURL string `json:"avatarUrl"` AvatarURL string `json:"avatarUrl"`
Language string `json:"language"` Language string `json:"language"`
Watermark struct {
Timestamp int64 `json:"timestamp"`
AppID string `json:"appid"`
} `json:"watermark"`
}
// PhoneInfo 用户手机号
type PhoneInfo struct {
PhoneNumber string `json:"phoneNumber"` PhoneNumber string `json:"phoneNumber"`
PurePhoneNumber string `json:"purePhoneNumber"` PurePhoneNumber string `json:"purePhoneNumber"`
CountryCode string `json:"countryCode"` CountryCode string `json:"countryCode"`
Watermark struct { Watermark struct {
Timestamp int64 `json:"timestamp"` Timestamp int64 `json:"timestamp"`
AppID string `json:"appid"` AppID string `json:"appid"`
} `json:"watermark"` } `json:"watermark"`
@@ -96,35 +103,18 @@ func getCipherText(sessionKey, encryptedData, iv string) ([]byte, error) {
} }
// Decrypt 解密数据 // Decrypt 解密数据
func (basic *Basic) Decrypt(sessionKey, encryptedData, iv string) (*UserInfo, error) { func (encryptor *Encryptor) Decrypt(sessionKey, encryptedData, iv string) (*PlainData, error) {
cipherText, err := getCipherText(sessionKey, encryptedData, iv) cipherText, err := getCipherText(sessionKey, encryptedData, iv)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var userInfo UserInfo var plainData PlainData
err = json.Unmarshal(cipherText, &userInfo) err = json.Unmarshal(cipherText, &plainData)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if userInfo.Watermark.AppID != basic.AppID { if plainData.Watermark.AppID != encryptor.AppID {
return nil, ErrAppIDNotMatch return nil, ErrAppIDNotMatch
} }
return &userInfo, nil return &plainData, nil
}
// DecryptPhone 解密数据(手机)
func (basic *Basic) DecryptPhone(sessionKey, encryptedData, iv string) (*PhoneInfo, error) {
cipherText, err := getCipherText(sessionKey, encryptedData, iv)
if err != nil {
return nil, err
}
var phoneInfo PhoneInfo
err = json.Unmarshal(cipherText, &phoneInfo)
if err != nil {
return nil, err
}
if phoneInfo.Watermark.AppID != basic.AppID {
return nil, ErrAppIDNotMatch
}
return &phoneInfo, nil
} }

View File

@@ -4,7 +4,7 @@ import (
"github.com/silenceper/wechat/v2/credential" "github.com/silenceper/wechat/v2/credential"
"github.com/silenceper/wechat/v2/miniprogram/analysis" "github.com/silenceper/wechat/v2/miniprogram/analysis"
"github.com/silenceper/wechat/v2/miniprogram/auth" "github.com/silenceper/wechat/v2/miniprogram/auth"
"github.com/silenceper/wechat/v2/miniprogram/basic" "github.com/silenceper/wechat/v2/miniprogram/encryptor"
"github.com/silenceper/wechat/v2/miniprogram/config" "github.com/silenceper/wechat/v2/miniprogram/config"
"github.com/silenceper/wechat/v2/miniprogram/context" "github.com/silenceper/wechat/v2/miniprogram/context"
"github.com/silenceper/wechat/v2/miniprogram/qrcode" "github.com/silenceper/wechat/v2/miniprogram/qrcode"
@@ -36,9 +36,9 @@ func (miniProgram *MiniProgram) GetContext() *context.Context {
return miniProgram.ctx return miniProgram.ctx
} }
// GetBasic 基础接口(小程序加解密) // GetEncryptor 小程序加解密
func (miniProgram *MiniProgram) GetBasic() *basic.Basic { func (miniProgram *MiniProgram) GetEncryptor() *encryptor.Encryptor {
return basic.NewBasic(miniProgram.ctx) return encryptor.NewEncryptor(miniProgram.ctx)
} }
//GetAuth 登录/用户信息相关接口 //GetAuth 登录/用户信息相关接口

View File

@@ -48,5 +48,5 @@ func (basic *Basic) GetAccountBasicInfo() (*AccountBasicInfo, error) {
//modify_domain设置服务器域名 //modify_domain设置服务器域名
//TODO //TODO
//func (basic *Basic) modifyDomain() { //func (encryptor *Basic) modifyDomain() {
//} //}