|
|
@@ -1,17 +1,23 @@
|
|
|
package svc
|
|
|
|
|
|
import (
|
|
|
+ "crypto/aes"
|
|
|
+ "crypto/cipher"
|
|
|
+ "encoding/base64"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
+ "net/http"
|
|
|
"path"
|
|
|
"time"
|
|
|
|
|
|
"git.i2edu.net/i2/go-zero/core/stores/sqlx"
|
|
|
+ "git.i2edu.net/i2/go-zero/rest/token"
|
|
|
"git.i2edu.net/i2/go-zero/zrpc"
|
|
|
"git.i2edu.net/i2/i2-bill-api/internal/config"
|
|
|
"git.i2edu.net/i2/i2-bill-api/internal/utils"
|
|
|
"git.i2edu.net/i2/i2-bill-api/model"
|
|
|
"git.i2edu.net/i2/i2-bill-erp/transformclient"
|
|
|
+ "github.com/dgrijalva/jwt-go"
|
|
|
)
|
|
|
|
|
|
const cacheWechatTokenPrefix = "cache:wechat:token:"
|
|
|
@@ -29,7 +35,18 @@ type Wechat struct {
|
|
|
c config.Config
|
|
|
}
|
|
|
|
|
|
-// GetAccessToken defined
|
|
|
+// WechatPhonedecrypt defined TODO
|
|
|
+type WechatPhonedecrypt struct {
|
|
|
+ PhoneNumber string `json:"phoneNumber"`
|
|
|
+ PurePhoneNumber string `json:"purePhoneNumber"`
|
|
|
+ CountryCode string `json:"countryCode"`
|
|
|
+ Watermark struct {
|
|
|
+ Appid string `json:"appid"`
|
|
|
+ Timestamp int32 `json:"timestamp"`
|
|
|
+ } `json:"watermark"`
|
|
|
+}
|
|
|
+
|
|
|
+// GetAccessToken defined TODO
|
|
|
func (wc *Wechat) GetAccessToken() (string, error) {
|
|
|
token := ""
|
|
|
err := wc.RdCli.GetCache(cacheWechatTokenPrefix, &token)
|
|
|
@@ -55,6 +72,7 @@ func (wc *Wechat) GetAccessToken() (string, error) {
|
|
|
return token, nil
|
|
|
}
|
|
|
|
|
|
+// GenQrId defined TODO
|
|
|
func (wc *Wechat) GenQrId(prefix string, params interface{}) (string, error) {
|
|
|
uuid := utils.GetUUID()
|
|
|
ube, err := json.Marshal(params)
|
|
|
@@ -65,6 +83,7 @@ func (wc *Wechat) GenQrId(prefix string, params interface{}) (string, error) {
|
|
|
return uuid, err
|
|
|
}
|
|
|
|
|
|
+// GetQrParams defined TODO
|
|
|
func (wc *Wechat) GetQrParams(prefix string, uuid string, params interface{}) error {
|
|
|
ube := ""
|
|
|
err := wc.RdCli.GetCache(fmt.Sprintf(prefix, uuid), &ube)
|
|
|
@@ -78,9 +97,39 @@ func (wc *Wechat) GetQrParams(prefix string, uuid string, params interface{}) er
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
-// GenQrCode defined
|
|
|
-// 接口 B:适用于需要的码数量极多的业务场景
|
|
|
-// 生成小程序码,可接受页面参数较短,生成个数不受限。
|
|
|
+// GetQrParams defined TODO
|
|
|
+func (wc *Wechat) DecryptMobile(sessionKey, encryptedData, iv string) (string, error) {
|
|
|
+ key, err := base64.StdEncoding.DecodeString(sessionKey)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ bIv, err := base64.StdEncoding.DecodeString(iv)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ bEncryptedData, err := base64.StdEncoding.DecodeString(encryptedData)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ block, err := aes.NewCipher(key)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ var decrypt = bEncryptedData
|
|
|
+ blockMode := cipher.NewCBCDecrypter(block, bIv)
|
|
|
+ blockMode.CryptBlocks(decrypt, bEncryptedData)
|
|
|
+ length := len(decrypt)
|
|
|
+ unpadding := int(decrypt[length-1])
|
|
|
+ decData := decrypt[:(length - unpadding)]
|
|
|
+
|
|
|
+ decryptData := WechatPhonedecrypt{}
|
|
|
+ err = json.Unmarshal(decData, &decryptData)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ return decryptData.PhoneNumber, err
|
|
|
+}
|
|
|
+
|
|
|
func (wc *Wechat) GenQrCode(scene, page string) (string, error) {
|
|
|
token, err := wc.GetAccessToken()
|
|
|
if err != nil {
|
|
|
@@ -105,6 +154,24 @@ type ServiceContext struct {
|
|
|
Transformer transformclient.Transform
|
|
|
}
|
|
|
|
|
|
+func (sc *ServiceContext) GetUserId(r *http.Request) (int64, error) {
|
|
|
+ parser := token.NewTokenParser(token.WithResetDuration(time.Minute))
|
|
|
+ tok, err := parser.ParseToken(r, sc.Config.JwtAuth.AccessSecret, "")
|
|
|
+ if err != nil {
|
|
|
+ return 0, err
|
|
|
+ }
|
|
|
+ return tok.Claims.(jwt.MapClaims)["user_id"].(int64), err
|
|
|
+}
|
|
|
+
|
|
|
+func (sc *ServiceContext) GetSessionKey(r *http.Request) (string, error) {
|
|
|
+ parser := token.NewTokenParser(token.WithResetDuration(time.Minute))
|
|
|
+ tok, err := parser.ParseToken(r, sc.Config.JwtAuth.AccessSecret, "")
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ return tok.Claims.(jwt.MapClaims)["sessionKey"].(string), err
|
|
|
+}
|
|
|
+
|
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
|
|
svc := &ServiceContext{
|
|
|
Config: c,
|