.Net微信網(wǎng)頁(yè)開(kāi)發(fā)解決用戶(hù)在不同公眾號(hào)或在公眾號(hào)、移動(dòng)應(yīng)用之間帳號(hào)統(tǒng)一問(wèn)題
開(kāi)發(fā)背景:
最近一段時(shí)間一直在做關(guān)于微信方面的網(wǎng)站應(yīng)用開(kāi)發(fā),這段時(shí)間也收獲的不少關(guān)于微信開(kāi)發(fā)方面的開(kāi)發(fā)技能,接觸的比較多的主要有微信公眾號(hào)和微信網(wǎng)站app第三方登錄授權(quán),以及微信會(huì)員卡,優(yōu)惠券和掃描二位碼的功能,今天我主要想要總結(jié)的是微信公眾號(hào)登錄和網(wǎng)站app第三方應(yīng)用微信授權(quán)登錄這兩者之間獲取到的Openid關(guān)聯(lián)問(wèn)題,實(shí)現(xiàn)兩邊登錄都是同一個(gè)賬號(hào)。
首先我們必須區(qū)別開(kāi)來(lái)微信公眾平臺(tái)開(kāi)發(fā)是指微信公眾號(hào)進(jìn)行業(yè)務(wù)開(kāi)發(fā)(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432),為網(wǎng)站微信登錄授權(quán)是需要在微信開(kāi)發(fā)平臺(tái)中創(chuàng)建網(wǎng)站應(yīng)用來(lái)使用的(https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN),但是要想把微信公眾號(hào)于微信網(wǎng)站授權(quán)登錄獲取到的Oppenid關(guān)聯(lián)起來(lái)的話(huà)我們可以通過(guò)UnionID關(guān)聯(lián)起來(lái)。
微信開(kāi)放平臺(tái)配置:
登錄進(jìn)入微信開(kāi)放平臺(tái)>進(jìn)行微信公眾號(hào)綁定
微信開(kāi)發(fā)平臺(tái)公眾賬號(hào)關(guān)聯(lián)的如下圖:

UnionID機(jī)制說(shuō)明:
開(kāi)發(fā)者可通過(guò)OpenID來(lái)獲取用戶(hù)基本信息。特別需要注意的是,如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),可通過(guò)獲取用戶(hù)基本信息中的unionid來(lái)區(qū)分用戶(hù)的唯一性,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),用戶(hù)的unionid是唯一的。換句話(huà)說(shuō),同一用戶(hù),對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用,unionid是相同的。
獲取用戶(hù)基本信息(包括UnionID機(jī)制)開(kāi)發(fā)者可通過(guò)OpenID來(lái)獲取用戶(hù)基本信息。請(qǐng)使用https協(xié)議。
接口調(diào)用請(qǐng)求說(shuō)明 http請(qǐng)求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
微信公眾號(hào)微信登錄配置:
在基本配置中獲取微信公眾號(hào)的appid和appsecrect(一定是要自己公眾號(hào)的),白名單是你在本地調(diào)試的微信項(xiàng)目的時(shí)候需要添加的你本地的ip地址,不然獲取不到你想要的accsee_token

配置服務(wù)器地址(url):這里是你的項(xiàng)目與微信服務(wù)器通訊的地方,一定不能填錯(cuò),Token是你項(xiàng)目中的,將其復(fù)制到這里即可,消息加密解密密鑰是微信端隨機(jī)生成的

在微信公眾號(hào)設(shè)置設(shè)置對(duì)應(yīng)業(yè)務(wù)域名,js接口安全域名,以及網(wǎng)頁(yè)授權(quán)域名

代碼實(shí)現(xiàn):
用戶(hù)同意授權(quán)獲取對(duì)應(yīng)的授權(quán)碼code(注意:我這里使用的是微信公眾號(hào)的登錄授權(quán),假如你需要做網(wǎng)站授權(quán)的換一個(gè)api即可下面兩步都是一樣)
微信網(wǎng)站用戶(hù)同意授權(quán)獲取code的api:
第三方使用網(wǎng)站應(yīng)用授權(quán)登錄前請(qǐng)注意已獲取相應(yīng)網(wǎng)頁(yè)授權(quán)作用域(scope=snsapi_login),則可以通過(guò)在PC端打開(kāi)以下鏈接: https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“該鏈接無(wú)法訪(fǎng)問(wèn)”,請(qǐng)檢查參數(shù)是否填寫(xiě)錯(cuò)誤,如redirect_uri的域名與審核時(shí)填寫(xiě)的授權(quán)域名不一致或scope不為snsapi_login。

//授權(quán)入口
public ActionResult WxLogin()
{
//異步跳轉(zhuǎn)地址
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");
}
通過(guò)通過(guò)code獲取網(wǎng)頁(yè)授權(quán)access_token和用戶(hù)唯一標(biāo)識(shí)Openid,最后拉取用戶(hù)信息(需要scope為snsapi_userinfo)
/// <summary>
/// 微信登錄注冊(cè)(通過(guò)unionid來(lái)判斷之前是否已經(jīng)存在同一個(gè)工作平臺(tái)注冊(cè)過(guò)的賬號(hào),假如存在的話(huà)則關(guān)聯(lián)起來(lái),不存在注冊(cè)一個(gè)新的賬號(hào))
/// </summary>
/// <param name="code">獲取用戶(hù)憑證換取用戶(hù)網(wǎng)頁(yè)授權(quán)</param>
/// <param name="ReturnUrl">跳轉(zhuǎn)地址</param>
/// <returns></returns>
public async Task<ActionResult> WxRegisterAndLogin(string code, string ReturnUrl = "")
{
try
{
//登錄成功后跳轉(zhuǎn)的地址
string url=ReturnUrl;
//通過(guò)Code以及微信appscrect和wxappid換取網(wǎng)頁(yè)授權(quán)access_token和用戶(hù)oppenid
HttpClient webClient = new HttpClient();
var jsonString = await (await webClient.GetAsync("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +公眾號(hào)appid+ "&secret=" + 公眾號(hào)AppSecret + "&code=" + code + "&grant_type=authorization_code")).Content.ReadAsStringAsync();
//異步獲取的用戶(hù)oppenid和access_token
var jsonOAuthorObj = JsonConvert.DeserializeObject(jsonString, new { access_token = "", openid = "" }.GetType());
if (jsonOAuthorObj.openid == null)
{
return Content(jsonString + "出現(xiàn)錯(cuò)誤請(qǐng)重試");
}
var myuser = new user { WxOpenId = jsonOAuthorObj.openid }.SelectObject();
//注冊(cè)成功后直接登錄,授權(quán)會(huì)判斷是否有賬戶(hù)
if (myuser == null)
{
//拉取用戶(hù)信息(需scope為 snsapi_userinfo),和unionid(只有在用戶(hù)將公眾號(hào)綁定到微信開(kāi)放平臺(tái)帳號(hào)后,才會(huì)出現(xiàn)該字段)
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());
//查詢(xún)系統(tǒng)中是否存在unionid用戶(hù)信息,若存在則更新當(dāng)前用戶(hù)openid,并直接登錄,如果不存在的話(huà)則需要?jiǎng)?chuàng)建一個(gè)新的用戶(hù)信息
var isExistUserInfo=new user(){unionid=unionid }.SelectObject();
if(isExistUserInfo!=null)//存在該用戶(hù)記錄
{
//更新公眾號(hào)openid
isExistUserInfo.WxOpenId=jsonObj.openid;
isExistUserInfo.Update();
//存在用戶(hù)信息直接登錄
return Redirect(url);
}
else//不存在該用戶(hù)記錄
{
//創(chuàng)建用戶(hù)
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
{
//存在用戶(hù)信息直接登錄
return Redirect(url);
}
}
catch (Exception e)
{
return View("MessageInfo", "", e.ToString());
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET 使用application與session對(duì)象寫(xiě)的簡(jiǎn)單聊天室程序
寫(xiě)了快一年的asp.net,application對(duì)象還真沒(méi)怎么用過(guò)??戳丝磿?shū),根據(jù)這兩個(gè)對(duì)象的特性寫(xiě)了一個(gè)簡(jiǎn)單的聊天室程序。真的是非常的簡(jiǎn)陋2014-07-07
ASP.NET創(chuàng)建動(dòng)態(tài)縮略圖的方法
這篇文章主要介紹了ASP.NET創(chuàng)建動(dòng)態(tài)縮略圖的方法,實(shí)例分析了asp.net動(dòng)態(tài)操作圖片的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C# 生成驗(yàn)證碼取隨機(jī)數(shù)字加字母(改進(jìn)版)
生成驗(yàn)證碼取4位數(shù)字沒(méi)有問(wèn)題,結(jié)果加上字母效率非常低本人改進(jìn)了一下,感興趣的朋友可以參考下哈2013-03-03
asp.net(c#) RSS功能實(shí)現(xiàn)代碼
這兩天一邊從網(wǎng)上找資料,自己再測(cè)試,終于完成本站的RSS功能了!先自我恭喜下!!2008-11-11

