user.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package user
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "github.com/silenceper/wechat/v2/officialaccount/context"
  7. "github.com/silenceper/wechat/v2/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. util.CommonError
  48. Total int `json:"total"`
  49. Count int `json:"count"`
  50. Data struct {
  51. OpenIDs []string `json:"openid"`
  52. } `json:"data"`
  53. NextOpenID string `json:"next_openid"`
  54. }
  55. //GetUserInfo 获取用户基本信息
  56. func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) {
  57. var accessToken string
  58. accessToken, err = user.GetAccessToken()
  59. if err != nil {
  60. return
  61. }
  62. uri := fmt.Sprintf(userInfoURL, accessToken, openID)
  63. var response []byte
  64. response, err = util.HTTPGet(uri)
  65. if err != nil {
  66. return
  67. }
  68. userInfo = new(Info)
  69. err = json.Unmarshal(response, userInfo)
  70. if err != nil {
  71. return
  72. }
  73. if userInfo.ErrCode != 0 {
  74. err = fmt.Errorf("GetUserInfo Error , errcode=%d , errmsg=%s", userInfo.ErrCode, userInfo.ErrMsg)
  75. return
  76. }
  77. return
  78. }
  79. // UpdateRemark 设置用户备注名
  80. func (user *User) UpdateRemark(openID, remark string) (err error) {
  81. var accessToken string
  82. accessToken, err = user.GetAccessToken()
  83. if err != nil {
  84. return
  85. }
  86. uri := fmt.Sprintf(updateRemarkURL, accessToken)
  87. var response []byte
  88. response, err = util.PostJSON(uri, map[string]string{"openid": openID, "remark": remark})
  89. if err != nil {
  90. return
  91. }
  92. return util.DecodeWithCommonError(response, "UpdateRemark")
  93. }
  94. // ListUserOpenIDs 返回用户列表
  95. func (user *User) ListUserOpenIDs(nextOpenid ...string) (*OpenidList, error) {
  96. accessToken, err := user.GetAccessToken()
  97. if err != nil {
  98. return nil, err
  99. }
  100. uri, _ := url.Parse(userListURL)
  101. q := uri.Query()
  102. q.Set("access_token", accessToken)
  103. if len(nextOpenid) > 0 && nextOpenid[0] != "" {
  104. q.Set("next_openid", nextOpenid[0])
  105. }
  106. uri.RawQuery = q.Encode()
  107. response, err := util.HTTPGet(uri.String())
  108. if err != nil {
  109. return nil, err
  110. }
  111. userlist := OpenidList{}
  112. err = util.DecodeWithError(response, &userlist, "ListUserOpenIDs")
  113. if err != nil {
  114. return nil, err
  115. }
  116. return &userlist, nil
  117. }
  118. // ListAllUserOpenIDs 返回所有用户OpenID列表
  119. func (user *User) ListAllUserOpenIDs() ([]string, error) {
  120. nextOpenid := ""
  121. openids := make([]string, 0)
  122. count := 0
  123. for {
  124. ul, err := user.ListUserOpenIDs(nextOpenid)
  125. if err != nil {
  126. return nil, err
  127. }
  128. openids = append(openids, ul.Data.OpenIDs...)
  129. count += ul.Count
  130. if ul.Total > count {
  131. nextOpenid = ul.NextOpenID
  132. } else {
  133. return openids, nil
  134. }
  135. }
  136. }