最近一段時間一直在作關於微信方面的網站應用開發,這段時間也收穫的很多關於微信開發方面的開發技能,接觸的比較多的主要有微信公衆號和微信網站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
開發者可經過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
微信網站用戶贊成受權獲取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"); }
/// <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()); } }