前言
這一篇實現snsapi_userinfo,寫這篇時其實我是有疑惑的,因為我並沒有調試成功,但是我反復檢查程序和思路是沒有問題的,因為我使用的測試公眾號,群里一個伙計說他之前調試時用的也是測試公眾號也遇到了和我一樣的問題,然后換上正式公眾號就好了。而且我再三檢查了微信開發文檔里,snsapi_userinfo的方式是要比snsapi_base簡單的,也很好理解。
我先描述下問題吧,snsapi_userinfo的方式是不需要我們關注公眾號的,所以我就在未關注的情下點擊頁面地址跳轉后提示我未關注測試公眾號。
實現思路
有了上一篇網頁授權獲取用戶基本信息一的基礎,再實現snsapi_userinfo就更快了,一路調接口。
1、先獲取code
2、根據code獲取網頁授權access_token和openid。看了其他人寫的博客有的提到了網頁授權access_token每天的上限是12次,也就是每兩個小時調用一次要自己緩存起來(大多數demo里用Session)。我查了下微信開發文檔接口頻率限制,正式公眾號和測試公眾號網頁授權access_token和refresh_token調用都是沒有上限的。附微信接口限制說明
3、根據access_token和openid獲取用戶信息。
看代碼
public ActionResult OAuthSnsApiUserInfo()
{
string code = Request.QueryString["code"];
try
{
if (!string.IsNullOrEmpty(code))
{
OAuthToken oauthToken = HttpUtility.Get<OAuthToken>(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appID, appsecret, code));
if (oauthToken != null && !string.IsNullOrEmpty(oauthToken.openid) && !string.IsNullOrEmpty(oauthToken.access_token))
{
OAuthUserInfo userInfo = Get<OAuthUserInfo>(string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", oauthToken.access_token, oauthToken.openid));
if (userInfo != null)
{
ViewData["headImage"] = userInfo.headimgurl;
ViewData["openid"] = userInfo.openid;
ViewData["nickName"] = userInfo.nickname;
if (userInfo.sex == 0)
{
ViewData["sex"] = "未知";
}
else if (userInfo.sex == 1)
{
ViewData["sex"] = "男";
}
else
{
ViewData["sex"] = "女";
}
ViewData["province"] = userInfo.province;
ViewData["city"] = userInfo.city;
}
else
{
}
}
else
{
}
}
else
{
return Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=123456#wechat_redirect", appID,Server.UrlEncode("http://" + Request.Url.Host + Url.Action("OAuthSnsApiUserInfo"))));
}
}
catch (Exception ex)
{
ViewData["errmsg"] = ex.Message;
}
return View();
}
總結
網頁授權二里獲取用戶信息的接口是:https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN。
