github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/user/user.go (about)

     1  package user
     2  
     3  import (
     4  	"net/url"
     5  
     6  	"github.com/chanxuehong/wechat/mp/core"
     7  )
     8  
     9  const (
    10  	LanguageZhCN = "zh_CN" // 简体中文
    11  	LanguageZhTW = "zh_TW" // 繁体中文
    12  	LanguageEN   = "en"    // 英文
    13  )
    14  
    15  const (
    16  	SexUnknown = 0 // 未知
    17  	SexMale    = 1 // 男性
    18  	SexFemale  = 2 // 女性
    19  )
    20  
    21  type UserInfo struct {
    22  	IsSubscriber int    `json:"subscribe"` // 用户是否订阅该公众号标识, 值为0时, 代表此用户没有关注该公众号, 拉取不到其余信息
    23  	OpenId       string `json:"openid"`    // 用户的标识, 对当前公众号唯一
    24  	Nickname     string `json:"nickname"`  // 用户的昵称
    25  	Sex          int    `json:"sex"`       // 用户的性别, 值为1时是男性, 值为2时是女性, 值为0时是未知
    26  	Language     string `json:"language"`  // 用户的语言, zh_CN, zh_TW, en
    27  	City         string `json:"city"`      // 用户所在城市
    28  	Province     string `json:"province"`  // 用户所在省份
    29  	Country      string `json:"country"`   // 用户所在国家
    30  
    31  	// 用户头像, 最后一个数值代表正方形头像大小(有0, 46, 64, 96, 132数值可选, 0代表640*640正方形头像), 用户没有头像时该项为空
    32  	HeadImageURL string `json:"headimgurl"`
    33  
    34  	SubscribeTime int64  `json:"subscribe_time"`    // 用户关注时间, 为时间戳. 如果用户曾多次关注, 则取最后关注时间
    35  	UnionId       string `json:"unionid,omitempty"` // 只有在用户将公众号绑定到微信开放平台帐号后, 才会出现该字段.
    36  	Remark        string `json:"remark"`            // 公众号运营者对粉丝的备注, 公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
    37  	GroupId       int64  `json:"groupid"`           // 用户所在的分组ID
    38  
    39  	TagIdList      []int  `json:"tagid_list"`      // Tag List
    40  	SubscribeScene string `json:"subscribe_scene"` // 返回用户关注的渠道来源
    41  	QrScene        int    `json:"qr_scene"`        // 二维码扫码场景(开发者自定义)场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
    42  	QrSceneStr     string `json:"qr_scene_str"`    // 二维码扫码场景描述(开发者自定义)场景值ID(字符串形式的ID),字符串类型,长度限制为1到64
    43  }
    44  
    45  // Get 获取用户基本信息.
    46  //
    47  //	注意:
    48  //	1. 需要判断返回的 UserInfo.IsSubscriber 是等于 1 还是 0
    49  //	2. lang 指定返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语, 默认为 zh_CN
    50  func Get(clt *core.Client, openId string, lang string) (info *UserInfo, err error) {
    51  	switch lang {
    52  	case "":
    53  		lang = LanguageZhCN
    54  	case LanguageZhCN, LanguageZhTW, LanguageEN:
    55  	default:
    56  		lang = LanguageZhCN
    57  	}
    58  
    59  	var incompleteURL = "https://api.weixin.qq.com/cgi-bin/user/info?openid=" + url.QueryEscape(openId) +
    60  		"&lang=" + lang + "&access_token="
    61  	var result struct {
    62  		core.Error
    63  		UserInfo
    64  	}
    65  	if err = clt.GetJSON(incompleteURL, &result); err != nil {
    66  		return
    67  	}
    68  	if result.ErrCode != core.ErrCodeOK {
    69  		err = &result.Error
    70  		return
    71  	}
    72  	info = &result.UserInfo
    73  	return
    74  }
    75  
    76  type batchGetRequestItem struct {
    77  	OpenId   string `json:"openid"`
    78  	Language string `json:"lang,omitempty"`
    79  }
    80  
    81  // 批量获取用户基本信息
    82  //
    83  //	注意: 需要对返回的 UserInfoList 的每个 UserInfo.IsSubscriber 做判断
    84  func BatchGet(clt *core.Client, openIdList []string, lang string) (list []UserInfo, err error) {
    85  	const incompleteURL = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token="
    86  
    87  	if len(openIdList) <= 0 {
    88  		return
    89  	}
    90  
    91  	switch lang {
    92  	case "", LanguageZhCN, LanguageZhTW, LanguageEN:
    93  	default:
    94  		lang = ""
    95  	}
    96  
    97  	var request struct {
    98  		UserList []batchGetRequestItem `json:"user_list,omitempty"`
    99  	}
   100  	request.UserList = make([]batchGetRequestItem, len(openIdList))
   101  	for i := 0; i < len(openIdList); i++ {
   102  		request.UserList[i].OpenId = openIdList[i]
   103  		request.UserList[i].Language = lang
   104  	}
   105  
   106  	var result struct {
   107  		core.Error
   108  		UserInfoList []UserInfo `json:"user_info_list"`
   109  	}
   110  	if err = clt.PostJSON(incompleteURL, &request, &result); err != nil {
   111  		return
   112  	}
   113  	if result.ErrCode != core.ErrCodeOK {
   114  		err = &result.Error
   115  		return
   116  	}
   117  	list = result.UserInfoList
   118  	return
   119  }
   120  
   121  // UpdateRemark 设置用户备注名.
   122  func UpdateRemark(clt *core.Client, openId, remark string) (err error) {
   123  	const incompleteURL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token="
   124  
   125  	var request = struct {
   126  		OpenId string `json:"openid"`
   127  		Remark string `json:"remark"`
   128  	}{
   129  		OpenId: openId,
   130  		Remark: remark,
   131  	}
   132  	var result core.Error
   133  	if err = clt.PostJSON(incompleteURL, &request, &result); err != nil {
   134  		return
   135  	}
   136  	if result.ErrCode != core.ErrCodeOK {
   137  		err = &result
   138  		return
   139  	}
   140  	return
   141  }