user.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package user
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  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. batchGetUserInfoURL = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=%s"
  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. }
  42. // BatchUserQuery 待查询的用户列表
  43. type BatchUserQuery struct {
  44. OpenID string `json:"openid"`
  45. Lang string `json:"lang"`
  46. }
  47. //GetUserInfo 获取用户基本信息
  48. func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) {
  49. var accessToken string
  50. accessToken, err = user.GetAccessToken()
  51. if err != nil {
  52. return
  53. }
  54. uri := fmt.Sprintf(userInfoURL, accessToken, openID)
  55. var response []byte
  56. response, err = util.HTTPGet(uri)
  57. if err != nil {
  58. return
  59. }
  60. userInfo = new(Info)
  61. err = json.Unmarshal(response, userInfo)
  62. if err != nil {
  63. return
  64. }
  65. if userInfo.ErrCode != 0 {
  66. err = fmt.Errorf("GetUserInfo Error , errcode=%d , errmsg=%s", userInfo.ErrCode, userInfo.ErrMsg)
  67. return
  68. }
  69. return
  70. }
  71. // UpdateRemark 设置用户备注名
  72. func (user *User) UpdateRemark(openID, remark string) (err error) {
  73. var accessToken string
  74. accessToken, err = user.GetAccessToken()
  75. if err != nil {
  76. return
  77. }
  78. uri := fmt.Sprintf(updateRemarkURL, accessToken)
  79. var response []byte
  80. response, err = util.PostJSON(uri, map[string]string{"openid": openID, "remark": remark})
  81. if err != nil {
  82. return
  83. }
  84. return util.DecodeWithCommonError(response, "UpdateRemark")
  85. }
  86. // BatchGetUser 批量获取用户基本信息
  87. func (user *User) BatchGetUser(batchUserQuery ... *BatchUserQuery)([]*Info, error){
  88. if len(batchUserQuery)>100{
  89. return nil, errors.New("最多支持一次拉取100条")
  90. }
  91. var accessToken string
  92. accessToken, err := user.GetAccessToken()
  93. if err != nil {
  94. return nil, err
  95. }
  96. requestMap := make(map[string]interface{})
  97. requestMap["user_list"] = batchUserQuery
  98. uri := fmt.Sprintf(batchGetUserInfoURL, accessToken)
  99. response, err := util.PostJSON(uri, requestMap)
  100. if err != nil {
  101. return nil, err
  102. }
  103. // batchUserQueryResponse 批量查询返回值
  104. type batchUserQueryResponse struct {
  105. List []*Info `json:"user_info_list"`
  106. }
  107. userList := &batchUserQueryResponse{}
  108. err = json.Unmarshal(response, userList)
  109. if err != nil {
  110. return nil, err
  111. }
  112. return userList.List, nil
  113. }