開發微信小程式的使用者授權登入功能

Guanhui
發布: 2020-04-28 15:52:29
轉載
5011 人瀏覽過

本篇將協助讀者實現基於 微信開發者工具 & C#環境 下的使用者在小程式上的授權登陸。

準備:

微信開發者工具下載網址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

微信小程式開發文件:https://developers.weixin.qq.com/miniprogram/dev/index.html

開發:

##在開發之初,我們需要先明確微信方已經制定好的授權登陸流程,參考官方API - 登陸介面。

你會看到微信方為開發者制定好的登陸授權流程:

開發微信小程式的使用者授權登入功能

#如圖,即為一個順從的使用者登陸授權的流程。

為什麼說它是一個順從的流程呢?因為在真正的小程式開發中,我們並不確定使用者何時需要起調如上的登陸流程(如:使用者在某些特定場景下的憑證遺失,但Ta並沒有退出小程式而是在小程式內部做跳轉等相關操作,即有可能導致一些預期之外的異常),所以,我們需要在這個順向的流程之外,加一層檢測機制,來解決這些異常場景,而官方API中,

wx.checkSession 剛好可以一定程度上解決這個問題。

那麼,我們的認證流程其實應該是:

- 小程式

wx.checkSession 校驗登陸態失效

    -

success :介面呼叫成功的回呼函數,session_key未過期,流程結束;    

    -

fail :介面呼叫失敗的回呼函數, session_key已過期

        -》 小型程式端

wx.login 取得code 並wx.request 提交code給己方伺服器

    取得     - 》 己方伺服器提交

Appid appSecret code 到微信方伺服器取得session_key & openid

        -》 己方伺服器依據

session_key & openid  產生  產生  產生  產生  產生 #3rd_session微信方提出的基於安全性的考慮,建議開發者不要將openid等關鍵性資訊進行資料傳輸

) 並傳回

3rd_session 到小程式端        -》 小程式端wx.setStorage

儲存

3rd_session ( 在後續使用者操作需要憑證時附帶此參數)        -》 小程式端wx.getUserInfo 取得使用者資訊wx.getStorage 取得3rd_session

資料後,一並

wx.request

# 提交給己方伺服器

         -》 己方伺服器SQL使用者資料資訊更新,流程結束;

想法整理完畢,接下來實作流程

##小程式端:

#在小程式中,新建一個通用的JS做基礎支援開發微信小程式的使用者授權登入功能

並在一些需要引用的頁面進行引用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var common = require(&quot;../Common/Common.js&quot;)</pre><div class="contentsignin">登入後複製</div></div>接著,在

Common.js

中實作邏輯

//用户登陆
function userLogin() {
  wx.checkSession({
    success: function () {
      //存在登陆态
    },
    fail: function () {
      //不存在登陆态
      onLogin()
    }
  })
}
 
function onLogin() {
  wx.login({
    success: function (res) {
      if (res.code) {
        //发起网络请求
        wx.request({
          url: &#39;Our Server ApiUrl&#39;,
          data: {
            code: res.code
          },
          success: function (res) {
            const self = this
            if (逻辑成功) {
              //获取到用户凭证 存儲 3rd_session 
              var json = JSON.parse(res.data.Data)
              wx.setStorage({
                key: "third_Session", 
                data: json.third_Session
              })
              getUserInfo()
            }
            else {
 
            }
          },
          fail: function (res) {
 
          }
        })
      }
    },
    fail: function (res) {
  
    }
  })
 
}
 
function getUserInfo() {
  wx.getUserInfo({
    success: function (res) {
      var userInfo = res.userInfo
      userInfoSetInSQL(userInfo)
    },
    fail: function () {
      userAccess()
    }
  })
}
 
function userInfoSetInSQL(userInfo) {
  wx.getStorage({
    key: &#39;third_Session&#39;,
    success: function (res) {
      wx.request({
        url: &#39;Our Server ApiUrl&#39;,
        data: {
          third_Session: res.data,
          nickName: userInfo.nickName,
          avatarUrl: userInfo.avatarUrl,
          gender: userInfo.gender,
          province: userInfo.province,
          city: userInfo.city,
          country: userInfo.country
        },
        success: function (res) {
          if (逻辑成功) {
            //SQL更新用户数据成功
          }
          else {
            //SQL更新用户数据失败
          }
        }
      })
    }
  })
}
登入後複製

至此,小程式端的流程基本上實作完畢,接著實作己方服務API

Login 介面邏輯範例<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">if (dicRequestData.ContainsKey(&quot;CODE&quot;)) { string apiUrl = string.Format(&quot;https://api.weixin.qq.com/sns/jscode2session?appid={0}&amp;secret={1}&amp;js_code={2}&amp;grant_type=authorization_code&quot;, ProUtil.SmartAppID, ProUtil.SmartSecret, dicRequestData[&quot;CODE&quot;]); HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(apiUrl); myRequest.Method = &quot;GET&quot;; HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8); string content = reader.ReadToEnd(); myResponse.Close(); reader.Close(); reader.Dispose(); //解析 userModel ReMsg = JSONUtil.JsonDeserialize&lt;userModel&gt;(content); //解析 if ((!string.IsNullOrWhiteSpace(ReMsg.openid)) &amp;&amp; (!string.IsNullOrWhiteSpace(ReMsg.session_key))) { // 成功 自定义生成3rd_session与openid&amp;session_key绑定并返回3rd_session } else { // 错误 未获取到用户openid 或 session } } else { // 错误 未获取到用户凭证code }</pre><div class="contentsignin">登入後複製</div></div>

UserInfoUpdate

介面在此不加贅述,使用者根據自身狀況對資料進行操作即可,微信方呼叫成功時傳回的相關參數資訊如下開發微信小程式的使用者授權登入功能

至此,完成了小程式基本的授權登陸及使用者資訊的取得。 PHP中文網,大量

免費小程式開發教學###,歡迎學習! ###

以上是開發微信小程式的使用者授權登入功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!