oauth.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package oauth
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "github.com/silenceper/wechat/v2/util"
  7. "github.com/silenceper/wechat/v2/work/context"
  8. )
  9. // Oauth auth
  10. type Oauth struct {
  11. *context.Context
  12. }
  13. var (
  14. // oauthTargetURL 企业微信内跳转地址
  15. oauthTargetURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"
  16. // oauthTargetURL 企业微信内跳转地址(获取成员的详细信息)
  17. oauthTargetPrivateURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_privateinfo&agentid=%s&state=STATE#wechat_redirect"
  18. // oauthUserInfoURL 获取用户信息地址
  19. oauthUserInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s"
  20. // oauthQrContentTargetURL 构造独立窗口登录二维码
  21. oauthQrContentTargetURL = "https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%s&redirect_uri=%s&state=%s"
  22. )
  23. // NewOauth new init oauth
  24. func NewOauth(ctx *context.Context) *Oauth {
  25. return &Oauth{
  26. ctx,
  27. }
  28. }
  29. // GetTargetURL 获取授权地址
  30. func (ctr *Oauth) GetTargetURL(callbackURL string) string {
  31. // url encode
  32. return fmt.Sprintf(
  33. oauthTargetURL,
  34. ctr.CorpID,
  35. url.QueryEscape(callbackURL),
  36. )
  37. }
  38. // GetTargetPrivateURL 获取个人信息授权地址
  39. func (ctr *Oauth) GetTargetPrivateURL(callbackURL string, agentID string) string {
  40. // url encode
  41. return fmt.Sprintf(
  42. oauthTargetPrivateURL,
  43. ctr.CorpID,
  44. url.QueryEscape(callbackURL),
  45. agentID,
  46. )
  47. }
  48. // GetQrContentTargetURL 构造独立窗口登录二维码
  49. func (ctr *Oauth) GetQrContentTargetURL(callbackURL string) string {
  50. // url encode
  51. return fmt.Sprintf(
  52. oauthQrContentTargetURL,
  53. ctr.CorpID,
  54. ctr.AgentID,
  55. url.QueryEscape(callbackURL),
  56. util.RandomStr(16),
  57. )
  58. }
  59. // ResUserInfo 返回得用户信息
  60. type ResUserInfo struct {
  61. util.CommonError
  62. // 当用户为企业成员时返回
  63. UserID string `json:"UserId"`
  64. DeviceID string `json:"DeviceId"`
  65. // 非企业成员授权时返回
  66. OpenID string `json:"OpenId"`
  67. ExternalUserID string `json:"external_userid"`
  68. }
  69. // UserFromCode 根据code获取用户信息
  70. func (ctr *Oauth) UserFromCode(code string) (result ResUserInfo, err error) {
  71. var accessToken string
  72. if accessToken, err = ctr.GetAccessToken(); err != nil {
  73. return
  74. }
  75. var response []byte
  76. if response, err = util.HTTPGet(fmt.Sprintf(oauthUserInfoURL, accessToken, code)); err != nil {
  77. return
  78. }
  79. err = json.Unmarshal(response, &result)
  80. if result.ErrCode != 0 {
  81. err = fmt.Errorf("GetUserAccessToken error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  82. return
  83. }
  84. return
  85. }