|
@@ -0,0 +1,65 @@
|
|
|
|
|
+package oauth
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ "encoding/json"
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ "net/http"
|
|
|
|
|
+ "net/url"
|
|
|
|
|
+
|
|
|
|
|
+ "github.com/silenceper/wechat/v2/officialaccount/context"
|
|
|
|
|
+ officialOauth "github.com/silenceper/wechat/v2/officialaccount/oauth"
|
|
|
|
|
+ "github.com/silenceper/wechat/v2/util"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+const (
|
|
|
|
|
+ platformRedirectOauthURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&component_appid=%s#wechat_redirect"
|
|
|
|
|
+ platformAccessTokenURL = "https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=%s&code=%s&grant_type=authorization_code&component_appid=%s&component_access_token=%s"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+// Oauth 平台代发起oauth2网页授权
|
|
|
|
|
+type Oauth struct {
|
|
|
|
|
+ *context.Context
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// NewOauth 实例化平台代发起oauth2网页授权
|
|
|
|
|
+func NewOauth(context *context.Context) *Oauth {
|
|
|
|
|
+ auth := new(Oauth)
|
|
|
|
|
+ auth.Context = context
|
|
|
|
|
+ return auth
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//GetRedirectURL 第三方平台 - 获取跳转的url地址
|
|
|
|
|
+func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state, appID string) (string, error) {
|
|
|
|
|
+ //url encode
|
|
|
|
|
+ urlStr := url.QueryEscape(redirectURI)
|
|
|
|
|
+ return fmt.Sprintf(platformRedirectOauthURL, appID, urlStr, scope, state, oauth.AppID), nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//Redirect 第三方平台 - 跳转到网页授权
|
|
|
|
|
+func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redirectURI, scope, state, appID string) error {
|
|
|
|
|
+ location, err := oauth.GetRedirectURL(redirectURI, scope, state, appID)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ http.Redirect(writer, req, location, http.StatusFound)
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// GetUserAccessToken 第三方平台 - 通过网页授权的code 换取access_token(区别于context中的access_token)
|
|
|
|
|
+func (oauth *Oauth) GetUserAccessToken(code, appID, componentAccessToken string) (result officialOauth.ResAccessToken, err error) {
|
|
|
|
|
+ urlStr := fmt.Sprintf(platformAccessTokenURL, appID, code, oauth.AppID, componentAccessToken)
|
|
|
|
|
+ var response []byte
|
|
|
|
|
+ response, err = util.HTTPGet(urlStr)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ err = json.Unmarshal(response, &result)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ if result.ErrCode != 0 {
|
|
|
|
|
+ err = fmt.Errorf("GetUserAccessToken error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ return
|
|
|
|
|
+}
|