yaotian 8 лет назад
Родитель
Сommit
57fc942c5a
2 измененных файлов с 72 добавлено и 6 удалено
  1. 69 0
      mp/bridge/page_auth_handler.go
  2. 3 6
      mp/oauth/oauth.go

+ 69 - 0
mp/bridge/page_auth_handler.go

@@ -0,0 +1,69 @@
+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.Oauth
+
+	oAuthURL     string
+	urlNeedOAuth string
+
+	openIDExisting          bool
+	checkOpenIDExistingFunc func(openID string) bool
+
+	oauth.UserInfo
+	afterGetUserInfoFunc func(user oauth.UserInfo)
+}
+
+//NewPageOAuthHandler PageOAuthHandler初始化
+func NewPageOAuthHandler(context *wxcontext.Context, oAuthURL string) *PageOAuthHandler {
+	srv := new(PageOAuthHandler)
+	srv.Context = context
+	srv.oauth = new(oauth.Oauth)
+	srv.oAuthURL = oAuthURL
+	return srv
+}
+
+func (c *PageOAuthHandler) getCallbackURL() (u string) {
+	return fmt.Sprintf("%s?target=%s", c.oAuthURL, url.QueryEscape(c.urlNeedOAuth))
+}
+
+//Handler handler
+func (c *PageOAuthHandler) Handler() (err error) {
+	code := c.Query("code")
+	state := c.Query("state")
+	c.urlNeedOAuth = c.Query("target")
+	if code != "" {
+		var acsTkn oauth.ResAccessToken
+		acsTkn, err = c.oauth.GetUserAccessToken(code)
+		if err != nil {
+			return
+		}
+		openID := acsTkn.OpenID
+		if c.checkOpenIDExistingFunc(openID) { //系统中已经存在openID
+			http.Redirect(c.Writer, nil, c.urlNeedOAuth, 302)
+			return
+		}
+		if state == "base" {
+			c.oauth.Redirect(c.Writer, c.getCallbackURL(), "snsapi_userinfo", "userinfo")
+			return
+		}
+		c.UserInfo, err = c.oauth.GetUserInfo(acsTkn.AccessToken, openID)
+		if err == nil {
+			c.afterGetUserInfoFunc(c.UserInfo)
+			http.Redirect(c.Writer, nil, c.urlNeedOAuth, 302)
+			return
+		}
+	}
+	c.oauth.Redirect(c.Writer, c.getCallbackURL(), "snsapi_base", "base")
+	return
+}

+ 3 - 6
mp/oauth/oauth.go

@@ -31,18 +31,15 @@ func NewOauth(context *wxcontext.Context) *Oauth {
 }
 
 //GetRedirectURL 获取跳转的url地址
-func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state string) (string, error) {
+func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state string) string {
 	//url encode
 	urlStr := url.QueryEscape(redirectURI)
-	return fmt.Sprintf(redirectOauthURL, oauth.AppID, urlStr, scope, state), nil
+	return fmt.Sprintf(redirectOauthURL, oauth.AppID, urlStr, scope, state)
 }
 
 //Redirect 跳转到网页授权
 func (oauth *Oauth) Redirect(writer http.ResponseWriter, redirectURI, scope, state string) error {
-	location, err := oauth.GetRedirectURL(redirectURI, scope, state)
-	if err != nil {
-		return err
-	}
+	location := oauth.GetRedirectURL(redirectURI, scope, state)
 	//location 为完整地址,所以不需要request
 	http.Redirect(writer, nil, location, 302)
 	return nil