最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PC 端微信掃碼注冊和登錄實例

 更新時間:2016年09月22日 09:03:20   作者:Cboyce  
這篇文章主要介紹了PC 端微信掃碼注冊和登錄實例的相關(guān)資料,需要的朋友可以參考下

PC 端微信掃碼注冊和登錄

一、前言

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

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

二、尋找解決方案

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

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

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

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

2.如果我先在 PC 端注冊,我在微信授權(quán)的時候怎樣關(guān)聯(lián)移動端, 當(dāng)然,凡是問題總會有解決方案的。思路如下:

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

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

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

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

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

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

PC 端微信掃碼登錄流程

核心代碼

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

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

掃碼登錄頁后臺代碼

public ActionResult Login()
{
  //如果已登錄,直接跳轉(zhuǎn)到首頁
  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ì)了解的朋友請移步 Github。 這里需要注意的一點(diǎn)是,該插件可以指定二維碼的生成方式,canvas 或者 table 請需要支持 IE 的朋友指定使用 table 生成

代碼如下:

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

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

<!--生成二維碼的容器 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)
{
  //驗證參數(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";

  //寫入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)建微信通用類 - 這里代碼比較復(fù)雜不在這里貼出
   * 遲點(diǎn)我會將整個 Demo 稍微整理放上 Github
  */
  WechatUserContext wxcontext = new WechatUserContext(System.Web.HttpContext.Current, uuid);

  //使用微信通用類獲取用戶基本信息
  wxcontext.GetUserInfo();

  if (!string.IsNullOrEmpty(wxcontext.openid))
  {
    uuid = Request["state"];
    //判斷數(shù)據(jù)庫是否存在
    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ù)庫表設(shè)計

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

微信參數(shù)說明 詳情請見 微信開發(fā)者文檔

運(yùn)行效果

1.掃碼登錄頁面

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

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

4.PC 端登錄完成

文章難免有不足之處,還請海涵。如有發(fā)現(xiàn)錯誤還望留言指出,筆者感激不盡! 微信掃碼注冊登錄 Demo 待筆者整理后放上 Github 希望幫到更多的朋友,請有需要的朋友留意該文更新。

以上就是PC 端微信掃碼注冊和登錄 的實例,有需要的朋友可以參考下,謝謝大家對本站的支持!

相關(guān)文章

  • Java 泛型有哪些好處詳解

    Java 泛型有哪些好處詳解

    這篇文章主要介紹了 Java 泛型有哪些好處詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解SpringMVC Controller介紹及常用注解

    詳解SpringMVC Controller介紹及常用注解

    本篇文章主要介紹了SpringMVC Controller介紹及常用注解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot+Redis布隆過濾器防惡意流量擊穿緩存

    SpringBoot+Redis布隆過濾器防惡意流量擊穿緩存

    本文主要介紹了SpringBoot+Redis布隆過濾器防惡意流量擊穿緩存,文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java抓包后對pcap文件解析示例

    java抓包后對pcap文件解析示例

    這篇文章主要介紹了java抓包后對pcap文件解析示例,需要的朋友可以參考下
    2014-03-03
  • java壓縮文件與刪除文件的示例代碼

    java壓縮文件與刪除文件的示例代碼

    這篇文章主要介紹了java壓縮文件與刪除文件的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • idea導(dǎo)入配置Spring?Boot項目的詳細(xì)步驟教程

    idea導(dǎo)入配置Spring?Boot項目的詳細(xì)步驟教程

    這篇文章主要給大家介紹了關(guān)于idea導(dǎo)入配置Spring?Boot項目的詳細(xì)步驟,在項目開發(fā)過程中,無論是導(dǎo)入運(yùn)行團(tuán)隊開發(fā)的項目,還是一些開源項目,還是其他的項目,想要在IDEA中完整的運(yùn)行起來總有很多坑,需要的朋友可以參考下
    2023-08-08
  • IDEA導(dǎo)入Eclipse項目的方法步驟(圖文教程)

    IDEA導(dǎo)入Eclipse項目的方法步驟(圖文教程)

    這篇文章主要介紹了IDEA導(dǎo)入Eclipse項目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Maven?dependency?plugin使用心得總結(jié)

    Maven?dependency?plugin使用心得總結(jié)

    這篇文章主要給大家介紹了關(guān)于Maven?dependency?plugin使用心得的相關(guān)資料,Maven是一個常用的Java build Manager,使用Maven可以很好的對Java Project的dependency進(jìn)行管理,需要的朋友可以參考下
    2023-10-10
  • 簡單介紹一下什么是microservice微服務(wù)

    簡單介紹一下什么是microservice微服務(wù)

    這篇文章主要介紹了一下什么是microservice微服務(wù)微服務(wù)的定義,微服務(wù)到底是什么意思?什么樣的架構(gòu)可以叫做微服務(wù)?這篇文章可以給你答案
    2023-03-03
  • Mybatis之RowBounds分頁原理詳解

    Mybatis之RowBounds分頁原理詳解

    這篇文章主要介紹了Mybatis之RowBounds分頁原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評論

新营市| 义乌市| 麟游县| 玛曲县| 康定县| 芜湖市| 施秉县| 图们市| 广南县| 巫山县| 田林县| 特克斯县| 辰溪县| 信阳市| 民县| 明溪县| 安图县| 芷江| 杭州市| 翁牛特旗| 乳山市| 阜宁县| 嘉峪关市| 施甸县| 宁阳县| 朝阳市| 边坝县| 尤溪县| 西贡区| 班戈县| 克山县| 修武县| 桦甸市| 仁怀市| 巴林右旗| 宣威市| 鄂尔多斯市| 紫金县| 和林格尔县| 赤壁市| 琼中|