From fedd5a96caec77d39a9d461a47d78a9a122cf25b Mon Sep 17 00:00:00 2001 From: Chuanjian Wang Date: Wed, 19 Dec 2018 19:53:07 +0800 Subject: [PATCH] add list user openids --- user/user.go | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/user/user.go b/user/user.go index a792aae..9cf4851 100644 --- a/user/user.go +++ b/user/user.go @@ -3,6 +3,7 @@ package user import ( "encoding/json" "fmt" + "net/url" "github.com/silenceper/wechat/context" "github.com/silenceper/wechat/util" @@ -11,6 +12,7 @@ import ( const ( userInfoURL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN" updateRemarkURL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=%s" + userListURL = "https://api.weixin.qq.com/cgi-bin/user/get" ) //User 用户管理 @@ -45,6 +47,16 @@ type Info struct { TagidList []int32 `json:"tagid_list"` } +// OpenidList 用户列表 +type OpenidList struct { + Total int `json:"total"` + Count int `json:"count"` + Data struct { + OpenIDs []string `json:"openid"` + } `json:"data"` + NextOpenID string `json:"next_openid"` +} + //GetUserInfo 获取用户基本信息 func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) { var accessToken string @@ -88,3 +100,52 @@ func (user *User) UpdateRemark(openID, remark string) (err error) { return util.DecodeWithCommonError(response, "UpdateRemark") } + +// ListUserOpenIDs 返回用户列表 +func (user *User) ListUserOpenIDs(nextOpenid ...string) (*OpenidList, error) { + accessToken, err := user.GetAccessToken() + if err != nil { + return nil, err + } + + uri, _ := url.Parse(userListURL) + q := uri.Query() + q.Set("access_token", accessToken) + if len(nextOpenid) > 0 && nextOpenid[0] != "" { + q.Set("next_openid", nextOpenid[0]) + } + uri.RawQuery = q.Encode() + + response, err := util.HTTPGet(uri.String()) + if err != nil { + return nil, err + } + + userlist := new(OpenidList) + err = json.Unmarshal(response, userlist) + if err != nil { + return nil, err + } + + return userlist, nil +} + +// ListAllUserOpenIDs 返回所有用户OpenID列表 +func (user *User) ListAllUserOpenIDs() ([]string, error) { + nextOpenid := "" + openids := []string{} + count := 0 + for { + ul, err := user.ListUserOpenIDs(nextOpenid) + if err != nil { + return nil, err + } + openids = append(openids, ul.Data.OpenIDs...) + count += ul.Count + if ul.Total > count { + nextOpenid = ul.NextOpenID + } else { + return openids, nil + } + } +}