程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> PC 端微信掃碼注冊和登錄實例

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

編輯:關於JAVA

PC 端微信掃碼注冊和登錄實例。本站提示廣大學習愛好者:(PC 端微信掃碼注冊和登錄實例)文章只能為提供參考,不一定能成為您想要的結果。以下是PC 端微信掃碼注冊和登錄實例正文


PC 端微信掃碼注冊和登錄

1、媒介

先聲明一下,本文所重視點為完成思緒,代碼及數據庫設計重要為了展示思緒,假如對代碼效力有著刻薄請求的項目切勿照搬。

信任做過微信開辟的人受權這塊都沒少做過,然則普通來講我們更多的是為挪動真個網站做受權,確實來講是在微信端下做的一個受權。明天碰到的一個成績是,項目支撐微信端和 PC 端,而且開放注冊。請求做到不管在 PC 端注冊或許是在微信端注冊以後都可以在別的一個端停止登錄。也就是說不管 PC 或是微信必需做到"你就是你"(經由過程某種方法聯系關系)。

2、尋覓處理計劃

按傳統的方法來思慮,微信端完整可以經由過程受權停止注冊,然則PC端呢,傳統的方法不過就是填填手機號碼啊,或許 Email 等等。假如采取這類方法注冊,會發生上面這的成績

1.我先在微信端受權注冊,那末假如我要登錄PC端照樣得停止注冊。

對此處理計劃可認為:微信受權注冊後“強迫”請求用戶必需填寫根本信息,如手機號、Email 。如許我們可以經由過程某種方法為用戶生成PC端登錄的賬號暗碼.例如以用戶的 nickname 為賬號,手機號碼為暗碼,等等方法。

弊病:用戶體驗欠好,再者有平安隱患。究竟你的微信昵稱, Email 或許手機號碼都是裸露的。

2.假如我先在 PC 端注冊,我在微信受權的時刻如何聯系關系挪動端, 固然,但凡成績總會有處理計劃的。思緒以下:

    計劃一:當用戶在 PC 端注冊後,“強迫” 用戶必需填寫微信昵稱。以此作為微信受權時的聯系關系前提。然則很遺憾,微信昵稱可以改,不是獨一的怎樣可以用來做聯系關系?計劃一陣亡。

    計劃二:在微信端受權後,和在 PC 端注冊後“強迫”請求用戶填寫手機號碼以此為聯系關系。如許衍生出一個成績,必需確保用戶手機的真實信,沒成績。這個可以經由過程手機驗證碼來完成(Email也是一樣)。然則無妨假定一下有上面這類情形,假如我有兩個手機號碼,PC 端注冊時填一個,微信注冊時填另外一個。聯系關系的了嗎?謎底是很遺憾。再者,我在PC 端注冊後我就是不填(筆者把強迫打上雙引號的緣由),然後我用微信端受權登錄一下。好吧,此時將會有兩條數據等著你想方法去聯系關系,典范的開辟者自挖坑。這類方法某種水平下行得通,然則嚴謹水平上是開辟者沒法接收的。

3、回歸原點的處理計劃

剖析:既然計劃上述計劃都有成績,我們先把它們都拋到一邊。整頓一下思緒,讓我們回到成績的基本。聯系關系的成績,要的是一個獨一標識。獨一標識正如我們的身份證號碼,我們解決信譽卡的時刻身份證是必需的,實名制下購置號碼卡,身份證是必需的。假定我們是這體系治理員,那末我完整可以經由過程你的身份證號碼查出你手機號碼,銀行卡號碼。

有了下面的思緒以後,我們須要做的就是找到一個獨一標識來作為聯系關系.微信上有個主要的腳色 openid。 它跟我們下面提到的身份證號碼有這配合的感化,微信賬號對某一"號的獨一標識。

微信真個受權拿到 openid 做過微信開辟的人都應當沒有成績。成績是如何來完成 PC 端 在注冊或許上岸的時刻拿到 openid。筆者的完成思緒以下。PC 端注冊,或許上岸時顯示一個二維碼引誘用戶應用微信掃碼,使其跳轉到受權頁面。這一步有一個最為症結的細節,二維碼請帶上一個獨一的受權碼(authCode)。試想一下假如用戶受權後我們能把 openid 和 authCode 寫入到數據庫。那末我們便可以在 PC 端經由過程某個 API 獲得 authCode 所聯系關系的這個 openid。假如我們做到這點我們便可以曉得以後是誰在 PC 端停止掃碼注冊或登錄(沒注冊的注冊,有注冊的直接登錄)。 是否是忽然認為 so easy. 假如認為文字比擬籠統,請看上面圖示

PC 端微信掃碼登錄流程

焦點代碼

弄清晰了思緒和流程接上去我們直接上代碼啦.開辟思緒是共通的,開辟說話就請各顯神通啦。

解釋:上面代碼以 C# 說話為例,采取 MVC + EF (注:uuid 等價於我們上述的 authCode)

掃碼登錄頁後台代碼

public ActionResult Login()
{
  //假如已登錄,直接跳轉到首頁
  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;//結構受權鏈接
  ViewBag.uuid = uuid;//保留 uuid
  return View();
}


生成二維碼采取插件 jquery.qrcode.js,想具體懂得的同伙請移步 Github。 這裡須要留意的一點是,該插件可以指定二維碼的生成方法,canvas 或許 table 請須要支撐 IE 的同伙指定應用 table 生成

代碼以下:

jQuery('#qrcode').qrcode({
  render  : "table",
  text  : "http://百度.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");

    //輪詢斷定用戶能否受權
    var interval = setInterval(function () {
      $.post("@Url.Action("UserLogin","Home")", { "uuid": "@ViewBag.uuid" }, function (data, status) {
        if ("success" == status) {
          //用戶勝利受權=>跳轉
          if ("success" == data) {
            window.location.href = '@Url.Action("Index", "Home")';
            clearInterval(interval);
          }
        }
      });
    }, 200);
  })
</script>


輪詢斷定用戶能否受權 API 代碼

public string UserLogin(string uuid)
{
  //驗證參數能否正當
  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";
} 


微信端受權 Action

public ActionResult Loginfor(string uuid)
{

  #region 獲得根本信息 - snsapi_userinfo

  /*
   * 創立微信通用類 - 這裡代碼比擬龐雜不在這裡貼出
   * 遲點我會將全部 Demo 略微整頓放上 Github
  */
  WechatUserContext wxcontext = new WechatUserContext(System.Web.HttpContext.Current, uuid);

  //應用微信通用類獲得用戶根本信息
  wxcontext.GetUserInfo();

  if (!string.IsNullOrEmpty(wxcontext.openid))
  {
    uuid = Request["state"];
    //斷定數據庫能否存在
    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();
} 


最初附上數據庫表設計

沒甚麼特別的,就是微信前往的各個參數加多一個我們自界說的 uuId

微信參數解釋 概況請見 微信開辟者文檔

運轉後果

1.掃碼登錄頁面

2.要求用戶受權

3.用戶確認受權

4.PC 端登錄完成

文章不免有缺乏的地方,還請海涵。若有發明毛病還望留言指出,筆者感謝不盡! 微信掃碼注冊登錄 Demo 待筆者整頓後放上 Github 願望幫到更多的同伙,請有須要的同伙留心該文更新。

以上就是PC 端微信掃碼注冊和登錄 的實例,有須要的同伙可以參考下,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved