亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

.NET微信開(kāi)發(fā)之PC 端微信掃碼注冊(cè)和登錄功能實(shí)現(xiàn)

 更新時(shí)間:2016年09月20日 11:38:00   作者:Cboyce  
這篇文章主要介紹了.NET微信開(kāi)發(fā)之PC 端微信掃碼注冊(cè)和登錄功能實(shí)現(xiàn)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

一、前言

先聲明一下,本文所注重點(diǎn)為實(shí)現(xiàn)思路,代碼及數(shù)據(jù)庫(kù)設(shè)計(jì)主要為了展現(xiàn)思路,如果對(duì)代碼效率有著苛刻要求的項(xiàng)目切勿照搬。

相信做過(guò)微信開(kāi)發(fā)的人授權(quán)這塊都沒(méi)少做過(guò),但是一般來(lái)說(shuō)我們更多的是為移動(dòng)端的網(wǎng)站做授權(quán),確切來(lái)說(shuō)是在微信端下做的一個(gè)授權(quán)。今天遇到的一個(gè)問(wèn)題是,項(xiàng)目支持微信端以及 PC 端,并且開(kāi)放注冊(cè)。要求做到無(wú)論在 PC 端注冊(cè)或者是在微信端注冊(cè)之后都可以在另外一個(gè)端進(jìn)行登錄。也就是說(shuō)無(wú)論 PC 或是微信必須做到"你就是你"(通過(guò)某種方式關(guān)聯(lián))。

二、尋找解決方案

按傳統(tǒng)的方式來(lái)思考,微信端完全可以通過(guò)授權(quán)進(jìn)行注冊(cè),但是PC端呢,傳統(tǒng)的方式無(wú)非就是填填手機(jī)號(hào)碼啊,或者 Email 等等。如果采用這種方式注冊(cè),會(huì)產(chǎn)生下面這的問(wèn)題

1.我先在微信端授權(quán)注冊(cè),那么如果我要登錄PC端還是得進(jìn)行注冊(cè)。

對(duì)此解決方案可以為:微信授權(quán)注冊(cè)后“強(qiáng)制”要求用戶必須填寫(xiě)基本信息,如手機(jī)號(hào)、Email 。這樣我們可以通過(guò)某種方式為用戶生成PC端登錄的賬號(hào)密碼.例如以用戶的 nickname 為賬號(hào),手機(jī)號(hào)碼為密碼,等等方式。

弊端:用戶體驗(yàn)不好,再者有安全隱患。畢竟你的微信昵稱, Email 或者手機(jī)號(hào)碼都是暴露的。

2.如果我先在 PC 端注冊(cè),我在微信授權(quán)的時(shí)候怎樣關(guān)聯(lián)移動(dòng)端

當(dāng)然,凡是問(wèn)題總會(huì)有解決方案的。思路如下:

    方案一:當(dāng)用戶在 PC 端注冊(cè)后,“強(qiáng)制” 用戶必須填寫(xiě)微信昵稱。以此作為微信授權(quán)時(shí)的關(guān)聯(lián)條件。但是很遺憾,微信昵稱可以改,不是唯一的怎么可以用來(lái)做關(guān)聯(lián)?方案一陣亡。

    方案二:在微信端授權(quán)后,以及在 PC 端注冊(cè)后“強(qiáng)制”要求用戶填寫(xiě)手機(jī)號(hào)碼以此為關(guān)聯(lián)。這樣衍生出一個(gè)問(wèn)題,必須確保用戶手機(jī)的真實(shí)信,沒(méi)問(wèn)題。這個(gè)可以通過(guò)手機(jī)驗(yàn)證碼來(lái)實(shí)現(xiàn)(Email也是一樣)。但是不妨假設(shè)一下有下面這種情況,如果我有兩個(gè)手機(jī)號(hào)碼,PC 端注冊(cè)時(shí)填一個(gè),微信注冊(cè)時(shí)填另一個(gè)。關(guān)聯(lián)的了嗎?答案是很遺憾。再者,我在PC 端注冊(cè)后我就是不填(筆者把強(qiáng)制打上雙引號(hào)的原因),然后我用微信端授權(quán)登錄一下。好吧,此時(shí)將會(huì)有兩條數(shù)據(jù)等著你想辦法去關(guān)聯(lián),典型的開(kāi)發(fā)者自挖坑。這種方式某種程度上行得通,但是嚴(yán)謹(jǐn)程度上是開(kāi)發(fā)者無(wú)法接受的。

三、回歸原點(diǎn)的解決方案

分析:既然方案上述方案都有問(wèn)題,我們先把它們都拋到一邊。整理一下思路,讓我們回到問(wèn)題的根本。關(guān)聯(lián)的問(wèn)題,要的是一個(gè)唯一標(biāo)識(shí)。唯一標(biāo)識(shí)正如我們的身份證號(hào)碼,我們辦理信用卡的時(shí)候身份證是必須的,實(shí)名制下購(gòu)買(mǎi)號(hào)碼卡,身份證是必須的。假設(shè)我們是這系統(tǒng)管理員,那么我完全可以通過(guò)你的身份證號(hào)碼查出你手機(jī)號(hào)碼,銀行卡號(hào)碼。

有了上面的思路之后,我們需要做的就是找到一個(gè)唯一標(biāo)識(shí)來(lái)作為關(guān)聯(lián).微信上有個(gè)重要的角色 openid。 它跟我們上面提到的身份證號(hào)碼有這共同的作用,微信賬號(hào)對(duì)某一公眾號(hào)的唯一標(biāo)識(shí)。

微信端的授權(quán)拿到 openid 做過(guò)微信開(kāi)發(fā)的人都應(yīng)該沒(méi)有問(wèn)題。問(wèn)題是怎樣來(lái)實(shí)現(xiàn) PC 端 在注冊(cè)或者登陸的時(shí)候拿到 openid。筆者的實(shí)現(xiàn)思路如下。PC 端注冊(cè),或者登陸時(shí)顯示一個(gè)二維碼引導(dǎo)用戶使用微信掃碼,使其跳轉(zhuǎn)到授權(quán)頁(yè)面。這一步有一個(gè)最為關(guān)鍵的細(xì)節(jié),二維碼請(qǐng)帶上一個(gè)唯一的授權(quán)碼(authCode)。試想一下如果用戶授權(quán)后我們能把 openid 以及 authCode 寫(xiě)入到數(shù)據(jù)庫(kù)。那么我們就可以在 PC 端通過(guò)某個(gè) API 獲取 authCode 所關(guān)聯(lián)的這個(gè) openid。如果我們做到這點(diǎn)我們就可以知道當(dāng)前是誰(shuí)在 PC 端進(jìn)行掃碼注冊(cè)或登錄(沒(méi)注冊(cè)的注冊(cè),有注冊(cè)的直接登錄)。 是不是突然覺(jué)得 so easy. 如果覺(jué)得文字比較抽象,請(qǐng)看下面圖示

PC 端微信掃碼登錄流程

核心代碼

搞清楚了思路和流程接下來(lái)我們直接上代碼啦.開(kāi)發(fā)思路是共通的,開(kāi)發(fā)語(yǔ)言就請(qǐng)各顯神通啦。

說(shuō)明:下面代碼以 C# 語(yǔ)言為例,采用 MVC + EF (注:uuid 等價(jià)于我們上述的 authCode)

掃碼登錄頁(yè)后臺(tái)代碼

public ActionResult Login()
{
//如果已登錄,直接跳轉(zhuǎn)到首頁(yè)
if (User.Identity.IsAuthenticated)
return RedirectToAction("Index", "Home");
string url = Request.Url.Host;
string uuid = Guid.NewGuid().ToString();
ViewBag.url = "http://" + url + "/home/loginfor?uuid=" + uuid;//構(gòu)造授權(quán)鏈接
ViewBag.uuid = uuid;//保存 uuid
return View();
}

生成二維碼采用插件 jquery.qrcode.js,想詳細(xì)了解的朋友請(qǐng)移步 Github。 這里需要注意的一點(diǎn)是,該插件可以指定二維碼的生成方式,canvas 或者 table 請(qǐng)需要支持 IE 的朋友指定使用 table 生成

代碼如下:

jQuery('#qrcode').qrcode({
render : "table",
text : "http://baidu.com"
});

回歸正題,登錄頁(yè)面的主要代碼如下

<!--生成二維碼的容器 div-->
<div id="qrcode-container">
</div>
<script src="~/Plugins/Jquery/jquery-1.9.1.min.js"></script>
<script src="~/Plugins/jquery-qrcode/jquery.qrcode.min.js"></script>
<script>
jQuery(function () {
//生成二維碼
jQuery('#qrcode-container').qrcode("@ViewBag.url");
//輪詢判斷用戶是否授權(quán)
var interval = setInterval(function () {
$.post("@Url.Action("UserLogin","Home")", { "uuid": "@ViewBag.uuid" }, function (data, status) {
if ("success" == status) {
//用戶成功授權(quán)=>跳轉(zhuǎn)
if ("success" == data) {
window.location.href = '@Url.Action("Index", "Home")';
clearInterval(interval);
}
}
});
}, 200);
})
</script> 

輪詢判斷用戶是否授權(quán) API 代碼

public string UserLogin(string uuid)
{
//驗(yàn)證參數(shù)是否合法
if (string.IsNullOrEmpty(uuid))
return "param_error";
WX_UserRecord user = db.WX_UserRecord.Where(u => u.uuId == uuid).FirstOrDefault();
if (user == null)
return "not_authcode";
//寫(xiě)入cookie
FormsAuthentication.SetAuthCookie(user.OpenId, false);
//清空uuid
user.uuId = null;
db.SaveChanges();
return "success";
}

微信端授權(quán) Action

public ActionResult Loginfor(string uuid)
{
#region 獲取基本信息 - snsapi_userinfo
/*
* 創(chuàng)建微信通用類(lèi) - 這里代碼比較復(fù)雜不在這里貼出
* 遲點(diǎn)我會(huì)將整個(gè) Demo 稍微整理放上 Github
*/
WechatUserContext wxcontext = new WechatUserContext(System.Web.HttpContext.Current, uuid);
//使用微信通用類(lèi)獲取用戶基本信息
wxcontext.GetUserInfo();
if (!string.IsNullOrEmpty(wxcontext.openid))
{
uuid = Request["state"];
//判斷數(shù)據(jù)庫(kù)是否存在
WX_UserRecord user = db.WX_UserRecord.Where(u => u.OpenId == wxcontext.openid).FirstOrDefault();
if (null == user)
{
user = new WX_UserRecord();
user.OpenId = wxcontext.openid;
user.City = wxcontext.city;
user.Country = wxcontext.country;
user.CreateTime = DateTime.Now;
user.HeadImgUrl = wxcontext.headimgurl;
user.Nickname = wxcontext.nickname;
user.Province = wxcontext.province;
user.Sex = wxcontext.sex;
user.Unionid = wxcontext.unionid; 
user.uuId = uuid;
db.WX_UserRecord.Add(user);
}
user.uuId = uuid;
db.SaveChanges();
}
#endregion
return View();
}

最后附上數(shù)據(jù)庫(kù)表設(shè)計(jì)

沒(méi)什么特殊的,就是微信返回的各個(gè)參數(shù)加多一個(gè)我們自定義的 uuId

微信參數(shù)說(shuō)明 詳情請(qǐng)見(jiàn) 微信開(kāi)發(fā)者文檔

運(yùn)行效果

1.掃碼登錄頁(yè)面

2.請(qǐng)求用戶授權(quán)

3.用戶確認(rèn)授權(quán)

4.PC 端登錄完成

以上所述是小編給大家介紹的.NET微信開(kāi)發(fā)之PC 端微信掃碼注冊(cè)和登錄功能實(shí)現(xiàn) ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 將datagrid控件內(nèi)容輸出到excel文件

    將datagrid控件內(nèi)容輸出到excel文件

    一個(gè)將datagrid控件內(nèi)容輸出到excel文件的demo,感興趣的朋友可以了解下或許對(duì)你學(xué)習(xí)datagrid控件相關(guān)有所幫助
    2006-09-09
  • .NET?6開(kāi)發(fā)TodoList應(yīng)用之使用MediatR實(shí)現(xiàn)POST請(qǐng)求

    .NET?6開(kāi)發(fā)TodoList應(yīng)用之使用MediatR實(shí)現(xiàn)POST請(qǐng)求

    對(duì)于稍微正式的項(xiàng)目,.NET工程上習(xí)慣的實(shí)現(xiàn)是通過(guò)使用比較成熟的類(lèi)庫(kù)框架,有效地對(duì)業(yè)務(wù)邏輯進(jìn)行分類(lèi)管理、消除冗余代碼,以達(dá)到業(yè)務(wù)邏輯職責(zé)清晰簡(jiǎn)潔的目的。在這個(gè)階段我們經(jīng)常使用的兩個(gè)類(lèi)庫(kù)分別是AutoMapper和MediatR。本文將為大家介紹MediatR如何實(shí)現(xiàn)POST請(qǐng)求
    2021-12-12
  • MVC4制作網(wǎng)站教程第三章 修改用戶組操作3.3

    MVC4制作網(wǎng)站教程第三章 修改用戶組操作3.3

    這篇文章主要為大家詳細(xì)介紹了MVC4制作網(wǎng)站教程,修改用戶組功能的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • c#將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼

    c#將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了c#將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2013-12-12
  • .NET反向代理組件YARP介紹

    .NET反向代理組件YARP介紹

    Yarp是微軟團(tuán)隊(duì)開(kāi)發(fā)的一個(gè)反向代理組件,除了常規(guī)的http和https轉(zhuǎn)換通訊,它最大的特點(diǎn)是可定制化,很容易根據(jù)特定場(chǎng)景開(kāi)發(fā)出需要的定制代理通道。這篇文章介紹了.NET的反向代理組件YARP,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • Opencv2.4.13與Visual Studio2013環(huán)境搭建配置教程

    Opencv2.4.13與Visual Studio2013環(huán)境搭建配置教程

    這篇文章主要為大家詳細(xì)介紹了Opencv2.4.13 與Visual Studio2013環(huán)境搭建配置教程的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • WPF水珠效果按鈕組的實(shí)現(xiàn)教程

    WPF水珠效果按鈕組的實(shí)現(xiàn)教程

    下面小編就為大家分享一篇WPF水珠效果按鈕組的實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳解.NET中使用Redis數(shù)據(jù)庫(kù)

    詳解.NET中使用Redis數(shù)據(jù)庫(kù)

    Redis是一個(gè)用的比較廣泛的Key/Value的內(nèi)存數(shù)據(jù)庫(kù),這篇文章主要介紹了詳解.NET中使用Redis數(shù)據(jù)庫(kù),有興趣的可以了解一下。
    2016-12-12
  • Asp.net中Response.Charset與Response.ContentEncoding區(qū)別示例分析

    Asp.net中Response.Charset與Response.ContentEncoding區(qū)別示例分析

    這篇文章主要介紹了Asp.net中Response.Charset與Response.ContentEncoding區(qū)別示例分析,對(duì)于深入理解Asp.net程序設(shè)計(jì)有一定的幫助,需要的朋友可以參考下
    2014-08-08
  • ASP.NET顯示農(nóng)歷時(shí)間的方法

    ASP.NET顯示農(nóng)歷時(shí)間的方法

    這篇文章主要介紹了ASP.NET顯示農(nóng)歷時(shí)間的方法,涉及時(shí)間的換算與數(shù)組的應(yīng)用,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下
    2014-11-11

最新評(píng)論