Ai
1 Star 0 Fork 0

Walle/go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
oauth_wechat.go 4.28 KB
一键复制 编辑 原始数据 按行查看 历史
JackHunx 提交于 2021-03-22 10:16 +08:00 . #修复公众号snsapi_base获取openid错误
package oauth2
import (
"net/url"
"strings"
"github.com/gogf/gf/container/gset"
"github.com/gogf/gf/crypto/gmd5"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/guid"
)
type WechatConfig struct {
config Config
RerdirectUrl string
State string
Scopes []string
ComponentID string
ComponentToken string
isThird bool
Lang string
// extConfig: map[string]string
}
//Wechat
func Wechat(config Config, other ...map[string]string) *WechatConfig {
return &WechatConfig{
config: config,
Scopes: []string{"snsapi_login"},
}
}
//OpenPlatform 第三方平台的配置
func (w *WechatConfig) OpenPlatform(componentID string, ComponentToken string) *WechatConfig {
w.isThird = true
w.ComponentID = componentID
w.ComponentToken = ComponentToken
return w
}
//Scope
func (w *WechatConfig) Scope(scopes []string) *WechatConfig {
w.Scopes = scopes
return w
}
//GetAuthURL
func (w *WechatConfig) GetAuthURL(redierct string, state ...string) string {
path := w.getPath()
w.RerdirectUrl = redierct
// w.Scope = scope
if len(state) > 0 {
w.State = state[0]
} else {
w.State = gmd5.MustEncrypt(guid.S())
}
return w.buildAuthUrlFromBase("https://open.weixin.qq.com/connect/" + path)
}
//GetUserFromCode
func (w *WechatConfig) GetUserFromCode(code string) *User {
scope := gset.NewStrSetFrom(w.Scopes)
if scope.Contains("snsapi_base") {
//
return w.toUser(w.GetTokenFromCode(code))
}
token := w.GetTokenFromCode(code)
user := w.GetUserByToken(token.GetString("access_token"))
user.SetAccessToken(token.GetString("access_token")).SetRefreshToken(token.GetString("refresh_token")).SetExpiresIn(token.GetInt("expires_in"))
return user
}
//WithLang
func (w *WechatConfig) WithLang(lang string) *WechatConfig {
w.Lang = lang
return w
}
//toUser
func (w *WechatConfig) toUser(user *gjson.Json) *User {
return &User{
Raw: user,
ID: user.GetString("openid"),
Name: user.GetString("nickname"),
NickName: user.GetString("nickname"),
Avatar: user.GetString("headimgurl"),
}
}
//GetUserFromToken
func (w *WechatConfig) GetUserByToken(token string) *User {
if w.Lang == "" {
w.Lang = "zh_CN"
}
client := ghttp.NewClient()
response, _ := client.Get(w.getBaseUrl()+"/userinfo", map[string]string{
"access_token": token,
"openid": w.config.ClientID,
"lang": w.Lang,
})
user := gjson.New(response.ReadAll())
return w.toUser(user).SetAccessToken(token)
}
//GetTokenFromCode
func (w *WechatConfig) GetTokenFromCode(code string) (token *gjson.Json) {
client := ghttp.NewClient()
response, _ := client.Header(map[string]string{
"Accept": "application/json",
}).Get(w.getTokenUrl(), w.getTokenFields(code).Encode())
return gjson.New(response.ReadAll())
}
//RefreshToken
func (w *WechatConfig) buildAuthUrlFromBase(uri string) string {
queryStr := w.getCodeFields().Encode()
return uri + "?" + queryStr + "#wechat_redirect"
}
func (w *WechatConfig) getCodeFields() url.Values {
val := url.Values{}
if w.isThird && w.ComponentID != "" {
val.Add("component_id", w.ComponentID)
}
val.Add("appid", w.config.ClientID)
val.Add("redirect_uri", w.RerdirectUrl)
val.Add("response_type", "code")
scope := strings.Join(w.Scopes, ",")
val.Add("scope", scope)
val.Add("state", w.State)
val.Add("connect_redirect", "1")
return val
}
func (w *WechatConfig) getTokenFields(code string) url.Values {
val := url.Values{}
if w.isThird && w.ComponentID != "" {
val.Add("appid", w.config.ClientID)
val.Add("component_appid", w.ComponentID)
val.Add("component_access_token", w.ComponentToken)
val.Add("code", code)
val.Add("grant_type", "authorization_code")
return val
}
val.Add("appid", w.config.ClientID)
val.Add("secret", w.config.ClientSecret)
val.Add("code", code)
val.Add("grant_type", "authorization_code")
return val
}
func (w *WechatConfig) getPath() string {
scope := gset.NewStrSetFrom(w.config.Scopes)
if scope.Contains("snsapi_login") {
return "qrconnect"
}
return "oauth2/authorize"
}
func (w *WechatConfig) getBaseUrl() string {
return "https://api.weixin.qq.com/sns"
}
func (w *WechatConfig) getTokenUrl() string {
if w.isThird && w.ComponentID != "" {
return w.getBaseUrl() + "/oauth2/component/access_token"
}
return w.getBaseUrl() + "/oauth2/access_token"
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wallesoft/go.git
git@gitee.com:wallesoft/go.git
wallesoft
go
go
v1.0.2

搜索帮助