| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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
- 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))
- }
- //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
- }
|