user.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package user
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "github.com/silenceper/wechat/context"
  7. "github.com/silenceper/wechat/util"
  8. )
  9. const (
  10. userInfoURL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN"
  11. updateRemarkURL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=%s"
  12. userListURL = "https://api.weixin.qq.com/cgi-bin/user/get"
  13. )
  14. //User 用户管理
  15. type User struct {
  16. *context.Context
  17. }
  18. //NewUser 实例化
  19. func NewUser(context *context.Context) *User {
  20. user := new(User)
  21. user.Context = context
  22. return user
  23. }
  24. //Info 用户基本信息
  25. type Info struct {
  26. util.CommonError
  27. Subscribe int32 `json:"subscribe"`
  28. OpenID string `json:"openid"`
  29. Nickname string `json:"nickname"`
  30. Sex int32 `json:"sex"`
  31. City string `json:"city"`
  32. Country string `json:"country"`
  33. Province string `json:"province"`
  34. Language string `json:"language"`
  35. Headimgurl string `json:"headimgurl"`
  36. SubscribeTime int32 `json:"subscribe_time"`
  37. UnionID string `json:"unionid"`
  38. Remark string `json:"remark"`
  39. GroupID int32 `json:"groupid"`
  40. TagidList []int32 `json:"tagid_list"`
  41. SubscribeScene string `json:"subscribe_scene"`
  42. QrScene int `json:"qr_scene"`
  43. QrSceneStr string `json:"qr_scene_str"`
  44. }
  45. // OpenidList 用户列表
  46. type OpenidList struct {
  47. Total int `json:"total"`
  48. Count int `json:"count"`
  49. Data struct {
  50. OpenIDs []string `json:"openid"`
  51. } `json:"data"`
  52. NextOpenID string `json:"next_openid"`
  53. }
  54. //GetUserInfo 获取用户基本信息
  55. func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) {
  56. var accessToken string
  57. accessToken, err = user.GetAccessToken()
  58. if err != nil {
  59. return
  60. }
  61. uri := fmt.Sprintf(userInfoURL, accessToken, openID)
  62. var response []byte
  63. response, err = util.HTTPGet(uri)
  64. if err != nil {
  65. return
  66. }
  67. userInfo = new(Info)
  68. err = json.Unmarshal(response, userInfo)
  69. if err != nil {
  70. return
  71. }
  72. if userInfo.ErrCode != 0 {
  73. err = fmt.Errorf("GetUserInfo Error , errcode=%d , errmsg=%s", userInfo.ErrCode, userInfo.ErrMsg)
  74. return
  75. }
  76. return
  77. }
  78. // UpdateRemark 设置用户备注名
  79. func (user *User) UpdateRemark(openID, remark string) (err error) {
  80. var accessToken string
  81. accessToken, err = user.GetAccessToken()
  82. if err != nil {
  83. return
  84. }
  85. uri := fmt.Sprintf(updateRemarkURL, accessToken)
  86. var response []byte
  87. response, err = util.PostJSON(uri, map[string]string{"openid": openID, "remark": remark})
  88. if err != nil {
  89. return
  90. }
  91. return util.DecodeWithCommonError(response, "UpdateRemark")
  92. }
  93. // ListUserOpenIDs 返回用户列表
  94. func (user *User) ListUserOpenIDs(nextOpenid ...string) (*OpenidList, error) {
  95. accessToken, err := user.GetAccessToken()
  96. if err != nil {
  97. return nil, err
  98. }
  99. uri, _ := url.Parse(userListURL)
  100. q := uri.Query()
  101. q.Set("access_token", accessToken)
  102. if len(nextOpenid) > 0 && nextOpenid[0] != "" {
  103. q.Set("next_openid", nextOpenid[0])
  104. }
  105. uri.RawQuery = q.Encode()
  106. response, err := util.HTTPGet(uri.String())
  107. if err != nil {
  108. return nil, err
  109. }
  110. userlist := new(OpenidList)
  111. err = json.Unmarshal(response, userlist)
  112. if err != nil {
  113. return nil, err
  114. }
  115. return userlist, nil
  116. }
  117. // ListAllUserOpenIDs 返回所有用户OpenID列表
  118. func (user *User) ListAllUserOpenIDs() ([]string, error) {
  119. nextOpenid := ""
  120. openids := []string{}
  121. count := 0
  122. for {
  123. ul, err := user.ListUserOpenIDs(nextOpenid)
  124. if err != nil {
  125. return nil, err
  126. }
  127. openids = append(openids, ul.Data.OpenIDs...)
  128. count += ul.Count
  129. if ul.Total > count {
  130. nextOpenid = ul.NextOpenID
  131. } else {
  132. return openids, nil
  133. }
  134. }
  135. }