github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/oauth2/userinfo.go (about) 1 package oauth2 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/url" 7 8 "github.com/chanxuehong/wechat/internal/debug/api" 9 "github.com/chanxuehong/wechat/oauth2" 10 "github.com/chanxuehong/wechat/util" 11 ) 12 13 const ( 14 LanguageZhCN = "zh_CN" // 简体中文 15 LanguageZhTW = "zh_TW" // 繁体中文 16 LanguageEN = "en" // 英文 17 ) 18 19 const ( 20 SexUnknown = 0 // 未知 21 SexMale = 1 // 男性 22 SexFemale = 2 // 女性 23 ) 24 25 type UserInfo struct { 26 OpenId string `json:"openid"` // 用户的唯一标识 27 Nickname string `json:"nickname"` // 用户昵称 28 Sex int `json:"sex"` // 用户的性别, 值为1时是男性, 值为2时是女性, 值为0时是未知 29 City string `json:"city"` // 普通用户个人资料填写的城市 30 Province string `json:"province"` // 用户个人资料填写的省份 31 Country string `json:"country"` // 国家, 如中国为CN 32 33 // 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像), 34 // 用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 35 HeadImageURL string `json:"headimgurl,omitempty"` 36 37 Privilege []string `json:"privilege,omitempty"` // 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) 38 UnionId string `json:"unionid,omitempty"` // 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 39 } 40 41 // GetUserInfo 获取用户信息. 42 // 43 // accessToken: 网页授权接口调用凭证 44 // openId: 用户的唯一标识 45 // lang: 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语, 如果留空 "" 则默认为 zh_CN 46 // httpClient: 如果不指定则默认为 util.DefaultHttpClient 47 func GetUserInfo(accessToken, openId, lang string, httpClient *http.Client) (info *UserInfo, err error) { 48 switch lang { 49 case "": 50 lang = LanguageZhCN 51 case LanguageZhCN, LanguageZhTW, LanguageEN: 52 default: 53 lang = LanguageZhCN 54 } 55 56 if httpClient == nil { 57 httpClient = util.DefaultHttpClient 58 } 59 60 _url := "https://api.weixin.qq.com/sns/userinfo?access_token=" + url.QueryEscape(accessToken) + 61 "&openid=" + url.QueryEscape(openId) + 62 "&lang=" + lang 63 api.DebugPrintGetRequest(_url) 64 httpResp, err := httpClient.Get(_url) 65 if err != nil { 66 return 67 } 68 defer httpResp.Body.Close() 69 70 if httpResp.StatusCode != http.StatusOK { 71 err = fmt.Errorf("http.Status: %s", httpResp.Status) 72 return 73 } 74 75 var result struct { 76 oauth2.Error 77 UserInfo 78 } 79 if err = api.DecodeJSONHttpResponse(httpResp.Body, &result); err != nil { 80 return 81 } 82 if result.ErrCode != oauth2.ErrCodeOK { 83 err = &result.Error 84 return 85 } 86 info = &result.UserInfo 87 return 88 }