qy_oauth.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package oauth
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "github.com/silenceper/wechat/util"
  7. )
  8. var (
  9. qyRedirectOauthURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&agentid=%s&state=%s#wechat_redirect"
  10. qyUserInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s"
  11. qyUserDetailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail"
  12. )
  13. //GetQyRedirectURL 获取企业微信跳转的url地址
  14. func (oauth *Oauth) GetQyRedirectURL(redirectURI, agentid, scope, state string) (string, error) {
  15. //url encode
  16. urlStr := url.QueryEscape(redirectURI)
  17. return fmt.Sprintf(qyRedirectOauthURL, oauth.AppID, urlStr, scope, agentid, state), nil
  18. }
  19. //QyUserInfo 用户授权获取到用户信息
  20. type QyUserInfo struct {
  21. util.CommonError
  22. UserID string `json:"UserId"`
  23. DeviceID string `json:"DeviceId"`
  24. UserTicket string `json:"user_ticket"`
  25. ExpiresIn int64 `json:"expires_in"`
  26. }
  27. //GetQyUserInfoByCode 根据code获取企业user_info
  28. func (oauth *Oauth) GetQyUserInfoByCode(code string) (result QyUserInfo, err error) {
  29. qyAccessToken, e := oauth.GetQyAccessToken()
  30. if e != nil {
  31. err = e
  32. return
  33. }
  34. urlStr := fmt.Sprintf(qyUserInfoURL, qyAccessToken, code)
  35. var response []byte
  36. response, err = util.HTTPGet(urlStr)
  37. if err != nil {
  38. return
  39. }
  40. err = json.Unmarshal(response, &result)
  41. if err != nil {
  42. return
  43. }
  44. if result.ErrCode != 0 {
  45. err = fmt.Errorf("GetQyUserInfoByCode error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  46. return
  47. }
  48. return
  49. }
  50. //QyUserDetail 到用户详情
  51. type QyUserDetail struct {
  52. util.CommonError
  53. UserID string `json:"UserId"`
  54. Name string `json:"name"`
  55. Mobile string `json:"mobile"`
  56. Gender string `json:"gender"`
  57. Email string `json:"email"`
  58. Avatar string `json:"avatar"`
  59. QrCode string `json:"qr_code"`
  60. }
  61. //GetQyUserDetailUserTicket 根据user_ticket获取到用户详情
  62. func (oauth *Oauth) GetQyUserDetailUserTicket(userTicket string) (result QyUserDetail, err error) {
  63. var qyAccessToken string
  64. qyAccessToken, err = oauth.GetQyAccessToken()
  65. if err != nil {
  66. return
  67. }
  68. uri := fmt.Sprintf("%s?access_token=%s", qyUserDetailURL, qyAccessToken)
  69. var response []byte
  70. response, err = util.PostJSON(uri, map[string]string{
  71. "user_ticket": userTicket,
  72. })
  73. if err != nil {
  74. return
  75. }
  76. err = json.Unmarshal(response, &result)
  77. if err != nil {
  78. return
  79. }
  80. if result.ErrCode != 0 {
  81. err = fmt.Errorf("GetQyUserDetailUserTicket Error , errcode=%d , errmsg=%s", result.ErrCode, result.ErrMsg)
  82. return
  83. }
  84. return
  85. }