Przeglądaj źródła

Merge pull request #80 from ckeyer/suport_user_list

add list user openids
silenceper 7 lat temu
rodzic
commit
593df23c46
1 zmienionych plików z 61 dodań i 0 usunięć
  1. 61 0
      user/user.go

+ 61 - 0
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
+		}
+	}
+}