first commit
This commit is contained in:
81
internal/service/applet/applet.go
Normal file
81
internal/service/applet/applet.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package applet
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"management/internal/config"
|
||||
"management/internal/pkg/fetcher"
|
||||
"management/internal/pkg/redis"
|
||||
)
|
||||
|
||||
// var appletLoginErrs = map[int]string{
|
||||
// -1: "系统繁忙",
|
||||
// 40029: "js_code无效",
|
||||
// 45011: "API调用太频繁,请稍候再试",
|
||||
// 40226: "高风险等级用户,小程序登录拦截",
|
||||
// }
|
||||
|
||||
type AppletLoginResponse struct {
|
||||
OpenID string `json:"openid"`
|
||||
SessionKey string `json:"session_key"`
|
||||
UnionID string `json:"unionid"`
|
||||
ErrCode int `json:"errcode"`
|
||||
ErrMsg string `json:"errmsg"`
|
||||
}
|
||||
|
||||
func AppletLogin(code string) (*AppletLoginResponse, error) {
|
||||
url := fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
|
||||
config.File.Applet.AppID, config.File.Applet.AppSecret, code)
|
||||
response, status, err := fetcher.Get(url, time.Second*3)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if status != 200 {
|
||||
return nil, errors.New("请求失败")
|
||||
}
|
||||
|
||||
var res AppletLoginResponse
|
||||
err = json.Unmarshal(response, &res)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &res, nil
|
||||
}
|
||||
|
||||
type accessTokenResponse struct {
|
||||
AccessToken string `json:"access_token"`
|
||||
ExpiresIn int `json:"expires_in"`
|
||||
}
|
||||
|
||||
func GetAccessToken(ctx context.Context) (string, error) {
|
||||
key := "token:" + config.File.Applet.AppID
|
||||
token, err := redis.Get(ctx, key)
|
||||
if err == nil && len(token) > 0 {
|
||||
return token, nil
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
|
||||
config.File.Applet.AppID, config.File.Applet.AppSecret)
|
||||
response, status, err := fetcher.Get(url, time.Second*3)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if status != 200 {
|
||||
return "", errors.New("获取access token失败")
|
||||
}
|
||||
|
||||
var res accessTokenResponse
|
||||
err = json.Unmarshal(response, &res)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
redis.Set(ctx, key, res.AccessToken, time.Duration(res.ExpiresIn-100)*time.Second)
|
||||
return res.AccessToken, nil
|
||||
}
|
||||
Reference in New Issue
Block a user