在微信公衆號開發中,我們往往需要知道一些用戶的基本信息,比如:暱稱、頭像、性別、城市(我們也只能知道這麼多)
那麼,這就需要了解一下微信公衆號網頁授權的一些基本了,給大家說說微信公衆號裏面一些基本的東西吧
每個微信用戶,我們在開發過程中,是用一個叫OpenId來進行區分用戶的,同一微信用戶對於每個公衆號、小程序的OpenId都不一樣。但在我們公司實際的業務中,我們有兩個公衆號,兩個公衆號都要能正確識別是同一用戶,顯然這種情況下OpenId不能滿足我們的需求,針對這種情況微信提供了一個叫UnionID的機制,需要將不同公衆號綁定到同一開發者賬號下,當然開發者賬號需要認證(300元),但我強烈建議大家把開發者賬號一起申請了,並進行綁定,哪怕只有一個公衆號,因爲你說不清楚哪天你們公司會有這種需求,這種情況下會崩潰!!!
在獲取微信用戶基本信息的時候,需要使用Token,(注意:這裏的Token和驗證時的Token不是同一個東西),大家可以理解下官方文檔
請注意官方文檔中的這段
關於網頁授權的兩種scope的區別說明
1、以snsapi_base爲scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(往往是業務頁面)
2、以snsapi_userinfo爲scope發起的網頁授權,是用來獲取用戶的基本信息的。但這種授權需要用戶手動同意,並且由於用戶同意過,所以無須關注,就可在授權後獲取該用戶的基本信息。
第一種情況雖然用戶無感知,但我們也只能拿到OpenId和UnionId,無法抓取到用戶暱稱這些基本信息,除非用戶關注了公衆號
第二種就比較好了,雖然會彈提示框,但因爲用戶確認了,所以我們能直接拿到用戶的基本信息(我用的這種,業務需求如此)
廢話太多,只想說點心得,下面是代碼
/// <summary>
/// 微信授權
/// </summary>
/// <param name="url"></param>
public void WeChatUserAuthorization(string url)
{
try
{
var code = Request["code"];
var state = Request["state"];
if (code == null)
{
UserAuthorization(appInfo.DomainName + url, true);
}
else
{
var token = default(Sys_AccessToken);
var userInfo = UserInfo(token);
}
}
catch (Exception ex)
{
//var wechatErr = Newtonsoft.Json.JsonConvert.DeserializeObject<Sys_Errcode>(ex.Message);
//if (wechatErr != null)
// if (wechatErr.errcode > 40000)
// UserAuthorization(appInfo.DomainName + url, true);
}
}
/// <summary>
/// 跳轉授權
/// </summary>
/// <param name="redirectUrl">授權回調地址</param>
/// <param name="isInfo">true:獲取用戶基礎信息 false:只獲取openid</param>
public void UserAuthorization(string redirectUrl, bool isInfo)
{
Response.Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}#wechat_redirect", appInfo.Sys_AppId, redirectUrl, isInfo ? "snsapi_userinfo" : "snsapi_base"));
}
/// <summary>
/// 返回授權用戶Token
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public Sys_AccessToken UserToken(string code)
{
try
{
var token = HttpClinetHelper.Get<Sys_AccessToken>(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appInfo.Sys_AppId, appInfo.Sys_AppSecret, code));
return token;
}
catch (Exception e)
{
throw;
}
}
/// <summary>
/// 獲取用戶基礎信息
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public Sys_WechatUser UserInfo(Sys_AccessToken token)
{
try
{
return HttpClinetHelper.Get<Sys_WechatUser>(string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", token.Access_token, token.OpenId));
}
catch (Exception)
{
throw;
}
}
本來整個過程及這麼多點東西,但因爲前期沒有UnionId的原因,導致授權部分繞了很多路,這裏就不貼繞路的了,這只是公司邏輯,並不適合所有人
整個授權部分基本搞定。如果有不能實現的或者有問題的歡迎留言討論