.NET微信網頁開發之經過UnionID機制,解決用戶在不一樣公衆號,或在公衆號、移動應用之間賬號統一問題

開發背景:

  最近一段時間一直在作關於微信方面的網站應用開發,這段時間也收穫的很多關於微信開發方面的開發技能,接觸的比較多的主要有微信公衆號和微信網站app第三方登陸受權,以及微信會員卡,優惠券和掃描二位碼的功能,今天我主要想要總結的是微信公衆號登陸和網站app第三方應用微信受權登陸這二者之間獲取到的Openid關聯問題,實現兩邊登陸都是同一個帳號。web

    首先咱們必須區別開來微信公衆平臺開發是指微信公衆號進行業務開發(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432),爲網站微信登陸受權是須要在微信開發平臺中建立網站應用來使用的(https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN),可是要想把微信公衆號於微信網站受權登陸獲取到的Oppenid關聯起來的話咱們能夠經過UnionID關聯起來。json

微信開放平臺配置:

登陸進入微信開放平臺>進行微信公衆號綁定

微信開發平臺公衆帳號關聯的以下圖:api


 

UnionID機制說明:

開發者可經過OpenID來獲取用戶基本信息。特別須要注意的是,若是開發者擁有多個移動應用、網站應用和公衆賬號,可經過獲取用戶基本信息中的unionid來區分用戶的惟一性,由於只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號,用戶的unionid是惟一的。換句話說,同一用戶,對同一個微信開放平臺下的不一樣應用,unionid是相同的。安全

獲取用戶基本信息(包括UnionID機制)開發者可經過OpenID來獲取用戶基本信息。請使用https協議。服務器

接口調用請求說明
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 

 

 微信公衆號微信登陸配置:

在基本配置中獲取微信公衆號的appid和appsecrect(必定是要本身公衆號的),白名單是你在本地調試的微信項目的時候須要添加的你本地的ip地址,否則獲取不到你想要的accsee_token

 

配置服務器地址(url):這裏是你的項目與微信服務器通信的地方,必定不能填錯,Token是你項目中的,將其複製到這裏便可,消息加密解密密鑰是微信端隨機生成的

 

在微信公衆號設置設置對應業務域名,js接口安全域名,以及網頁受權域名

 

代碼實現:

用戶贊成受權獲取對應的受權碼code(注意:我這裏使用的是微信公衆號的登陸受權,假如你須要作網站受權的換一個api便可下面兩步都是同樣)

微信網站用戶贊成受權獲取code的api:微信

第三方使用網站應用受權登陸前請注意已獲取相應網頁受權做用域(scope=snsapi_login),則能夠經過在PC端打開如下連接:
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,如redirect_uri的域名與審覈時填寫的受權域名不一致或scope不爲snsapi_login。

 

 

//受權入口
public ActionResult WxLogin()
{
//異步跳轉地址
var loginUrl = "http://" + Request.Url.Authority + Url.Action("WxRegisterAndLogin") ;
return Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + Url.Encode(loginUrl) + "&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect");
}

經過經過code獲取網頁受權access_token和用戶惟一標識Openid,最後拉取用戶信息(須要scope爲snsapi_userinfo)

/// <summary>
/// 微信登陸註冊(經過unionid來判斷以前是否已經存在同一個工做平臺註冊過的帳號,假如存在的話則關聯起來,不存在註冊一個新的帳號)
/// </summary>
/// <param name="code">獲取用戶憑證換取用戶網頁受權</param>
/// <param name="ReturnUrl">跳轉地址</param>
/// <returns></returns>
public async Task<ActionResult> WxRegisterAndLogin(string code, string ReturnUrl = "")
{

try
{

//登陸成功後跳轉的地址
string url=ReturnUrl;

//經過Code以及微信appscrect和wxappid換取網頁受權access_token和用戶oppenid
HttpClient webClient = new HttpClient();
var  jsonString = await (await webClient.GetAsync("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +公衆號appid+ "&secret=" + 公衆號AppSecret + "&code=" + code + "&grant_type=authorization_code")).Content.ReadAsStringAsync();

//異步獲取的用戶oppenid和access_token
var  jsonOAuthorObj = JsonConvert.DeserializeObject(jsonString, new { access_token = "", openid = "" }.GetType());

if (jsonOAuthorObj.openid == null)
{
return Content(jsonString + "出現錯誤請重試");
}

var myuser = new user { WxOpenId = jsonOAuthorObj.openid }.SelectObject();

//註冊成功後直接登陸,受權會判斷是否有帳戶
if (myuser == null)
{

//拉取用戶信息(需scope爲 snsapi_userinfo),和unionid(只有在用戶將公衆號綁定到微信開放平臺賬號後,纔會出現該字段)
jsonString = await (await webClient.GetAsync("https://api.weixin.qq.com/sns/userinfo?access_token=" + jsonOAuthorObj.access_token + "&openid=" + jsonOAuthorObj.openid + "&lang=zh_CN")).Content.ReadAsStringAsync();
dynamic jsonObj = JsonConvert.DeserializeObject(jsonString, new { nickname = "", headimgurl = "", sex = "", openid = "", country = "", province = "", city = "",unionid=""}.GetType());

//查詢系統中是否存在unionid用戶信息,若存在則更新當前用戶openid,並直接登陸,若是不存在的話則須要建立一個新的用戶信息
var isExistUserInfo=new user(){unionid=unionid }.SelectObject();
if(isExistUserInfo!=null)//存在該用戶記錄
{
//更新公衆號openid
 isExistUserInfo.WxOpenId=jsonObj.openid;
 isExistUserInfo.Update();
//存在用戶信息直接登陸
return Redirect(url);
}
else//不存在該用戶記錄
{
//建立用戶
int cUserId = new user { Wximage= jsonObj.headimgurl, WxNickName = jsonObj.nickname, WxOpenId = jsonObj.openid, Sex = Convert.ToInt32(jsonObj.sex), Country = jsonObj.country, Province = jsonObj.province, City = jsonObj.city,unionid=unionid }.Create();
return RedirectToAction("WxRegister", "Login", new { ReturnUrl = url });
}
}
else
{
//存在用戶信息直接登陸
return Redirect(url);
}
}
catch (Exception e)
{
return View("MessageInfo", "", e.ToString());
}
} 
相關文章
相關標籤/搜索