| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package bridge
- import (
- "fmt"
- "net/http"
- "net/url"
- "github.com/yaotian/gowechat/mp/oauth"
- "github.com/yaotian/gowechat/wxcontext"
- )
- //PageOAuthHandler 微信网页授权
- type PageOAuthHandler struct {
- // *wxcontext.Context
- *oauth.Oauth
- oAuthCallbackURL string
- urlNeedOAuth string
- openID string
- openIDExisting bool
- checkOpenIDExistingFunc func(openID string) bool
- oauth.UserInfo
- afterGetUserInfoFunc func(user oauth.UserInfo)
- }
- //NewPageOAuthHandler PageOAuthHandler初始化
- func NewPageOAuthHandler(context *wxcontext.Context, oAuthCallbackURL string) *PageOAuthHandler {
- pa := new(PageOAuthHandler)
- pa.Oauth = oauth.NewOauth(context)
- pa.oAuthCallbackURL = oAuthCallbackURL
- return pa
- }
- func (c *PageOAuthHandler) getCallbackURL() (u string) {
- return fmt.Sprintf("%s?target=%s", c.oAuthCallbackURL, url.QueryEscape(c.urlNeedOAuth))
- }
- //SetFuncCheckOpenIDExisting 设置检查OpenID在您的系统中是否已经存在
- func (c *PageOAuthHandler) SetFuncCheckOpenIDExisting(handler func(string) bool) {
- c.checkOpenIDExistingFunc = handler
- }
- //SetFuncAfterGetUserInfo 设置获得用户信息后执行
- func (c *PageOAuthHandler) SetFuncAfterGetUserInfo(handler func(oauth.UserInfo)) {
- c.afterGetUserInfoFunc = handler
- }
- //Handle handler
- func (c *PageOAuthHandler) Handle() (err error) {
- code := c.Query("code")
- state := c.Query("state")
- c.urlNeedOAuth = c.Query("target")
- if code != "" {
- var acsTkn oauth.ResAccessToken
- acsTkn, err = c.GetUserAccessToken(code)
- if err != nil {
- return
- }
- openID := acsTkn.OpenID
- if c.checkOpenIDExistingFunc(openID) { //系统中已经存在openID
- http.Redirect(c.Writer, c.Request, c.urlNeedOAuth, 302)
- return
- }
- if state == "base" {
- c.Redirect(c.getCallbackURL(), "snsapi_userinfo", "userinfo")
- return
- }
- c.UserInfo, err = c.GetUserInfo(acsTkn.AccessToken, openID)
- if err == nil {
- c.afterGetUserInfoFunc(c.UserInfo)
- http.Redirect(c.Writer, c.Request, c.urlNeedOAuth, 302)
- return
- }
- }
- c.Redirect(c.getCallbackURL(), "snsapi_base", "base")
- return
- }
|