oauth.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package oauth
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "github.com/silenceper/wechat/v2/officialaccount/context"
  8. officialOauth "github.com/silenceper/wechat/v2/officialaccount/oauth"
  9. "github.com/silenceper/wechat/v2/util"
  10. )
  11. const (
  12. 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"
  13. 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"
  14. )
  15. // Oauth 平台代发起oauth2网页授权
  16. type Oauth struct {
  17. *context.Context
  18. }
  19. // NewOauth 实例化平台代发起oauth2网页授权
  20. func NewOauth(context *context.Context) *Oauth {
  21. auth := new(Oauth)
  22. auth.Context = context
  23. return auth
  24. }
  25. // GetRedirectURL 第三方平台 - 获取跳转的url地址
  26. func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state, appID string) (string, error) {
  27. // url encode
  28. urlStr := url.QueryEscape(redirectURI)
  29. return fmt.Sprintf(platformRedirectOauthURL, appID, urlStr, scope, state, oauth.AppID), nil
  30. }
  31. // Redirect 第三方平台 - 跳转到网页授权
  32. func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redirectURI, scope, state, appID string) error {
  33. location, err := oauth.GetRedirectURL(redirectURI, scope, state, appID)
  34. if err != nil {
  35. return err
  36. }
  37. http.Redirect(writer, req, location, http.StatusFound)
  38. return nil
  39. }
  40. // GetUserAccessToken 第三方平台 - 通过网页授权的code 换取access_token(区别于context中的access_token)
  41. func (oauth *Oauth) GetUserAccessToken(code, appID, componentAccessToken string) (result officialOauth.ResAccessToken, err error) {
  42. urlStr := fmt.Sprintf(platformAccessTokenURL, appID, code, oauth.AppID, componentAccessToken)
  43. var response []byte
  44. response, err = util.HTTPGet(urlStr)
  45. if err != nil {
  46. return
  47. }
  48. err = json.Unmarshal(response, &result)
  49. if err != nil {
  50. return
  51. }
  52. if result.ErrCode != 0 {
  53. err = fmt.Errorf("GetUserAccessToken error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  54. return
  55. }
  56. return
  57. }