| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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
- }
|