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 }