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  }