1. 程式人生 > >微信小程式登入換取token

微信小程式登入換取token

前言:

這次主要是介紹些業務邏輯,技術點倒是沒有多少。不過在開發中,優秀的程式設計思路同樣是非常值得學習的。
最近小程式可以說在開發屆狠狠的火了一把。微信小程式可以開發遊戲,騰訊率先帶頭,做出了一個跳一跳也是點爆朋友圈。所謂落後就要捱打,那麼今天就開始學習小程式的一些小知識吧(本文基於十年磨一劍的tp5)

目錄:

微信登入換取token的流程
如何將code變成openid和session_key
丟擲錯誤異常和派發令牌
一:微信登入換取token的流程

多說無益,直接上圖


這裡介紹的主要是後端開發的流程,前端的不是本文介紹的重點
二:如何將code變成openid和session_key

我們後端開發人員對這個業務是從接受code開始的,由客戶端發來一個code碼。
我們接受後先進行驗證

//建立獨立驗證器,呼叫驗證器中的驗證方法
TokenCheck::instance()->goCheck();

如果不是很清楚驗證器的用法的朋友 可以先看看我之前寫的驗證器的使用
驗證規則很簡單,就是判斷不為空就可以了
下一步就是我們需要把code換取openid 和session_key了
首先我們需要在建立一個service層的類,(為什麼要使用service層呢?主要是我為了讓模型層粒度細一些。業務比較複雜的就放在service層。這樣比較利於後期修改和升級)

class UserToken extends Token
{
protected $wxAppId;
protected $wxAppSecret;
protected $wxLoginUrl;

//建構函式中賦值成員變數
public function __construct($code)
{
       $this->wxAppId = config('wx.app_id');
       $this->wxAppSecret = config('wx.app_secret');
       $this->wxLoginUrl = sprintf(config('wx.login_url'), $this->wxAppId, $this->wxAppSecret, $code);
}
}

寫一個建構函式,讓在物件生成的時候就賦值成員變數方便使用,這裡的appid和appsecret 都是在微信申請小程式的時候就有了的。這裡就不介紹了。之前我是把他們全部存在我的配置檔案的。使用tp5提供的config函式將他們提出來。最後使用 sprintf方法,將這些引數拼接到wxLoginUrl中,方便我們訪問。
熟悉Oauth2.0的朋友都知道,拿到這個url其實就是微信的一個介面,我們去換取授權。

下面我們建立一個getUserToken方法

/**
    * 獲取使用者的令牌方法
    * @throws Exception
    */
public function getUserToken()
{
//呼叫公共函式中的http方法(也就是curl的方法,我也是在網上抄的。存放在common.php中就可以直接用了)
       $result = http($this->wxLoginUrl, 'post');
//判斷連線是否成功
if ($result[0] == 200) {
//將返回的json處理成陣列
           $wxResult = json_decode($result[1], true);
//判空
if (empty($wxResult)) {
throw new Exception('獲取session_key,openID時異常,微信內部錯誤');
} else {
//判斷返回的結果中是否有錯誤碼
if (isset($wxResult['errcode'])) {
//如果有錯誤碼,呼叫丟擲錯誤方法
                   $this->_throwWxError($wxResult);
} else {
//沒有錯誤碼,呼叫私有的派發token方法
                   $token = $this->_grantToken($wxResult);
return $token;
}
}
} else {
throw new Exception('連線微信伺服器失敗');
}
}

寫好了,方法之後,只需要在控制器中呼叫這個getUserToken方法就可以了。

大家可能會問,那個_throwWxError和_grantToken方法是幹什麼的?

可能大家也看出來了,這個getUserToken方法中我們一個獲取到了微信返回的結果,也就是$wxResult變數中的資料。如果不出別的意外那麼,裡面就有我們需要的openid和session_key。這不過,介紹到這裡,我們還沒有開始使用他們
三:丟擲錯誤異常和派發令牌

這裡兩個其實就是兩個方法,重點是派發令牌。這裡的丟擲異常。我準備單獨寫一次介紹。

/**
    * 微信獲取open_id失敗,丟擲異常方法
    * @param $wxResult
    * @throws WxException
    */
private function _throwWxError($wxResult)
{
throw new WxException(
[
'message' => $wxResult['errmsg'],
'errorCode' => $wxResult['errcode']
]
);
}

我們來看_grantToken方法

我們將微信返回給我們的資料,轉換為陣列後,儲存到$wxResult中,在呼叫派發令牌方法時,直接傳入。
下面的程式碼中有個User類呼叫的getUidByOpenId方法,這裡是User模型上封裝的一個查詢方法,就是看User表中是否有這個openid,如果有返回uid
如果資料庫中沒有uid的話,說明是新使用者,則在資料庫中插入一條資料,返回新插入的主鍵 id

/**
    * 派發User 令牌
    * @param $wxResult
    * @return string
    * @throws Exception
    */
private function _grantToken($wxResult)
{
//拿到open_id
       $openId = $wxResult['openid'];
//判斷open_id是否存在
       $id = User::getUidByOpenId($openId);
//如果資料庫中不存在
if (!$id) {
//新增一條記錄,返回新建立的id
           $id = User::createUser($openId);
if (!$id) {
throw new Exception('新增一條User失敗');
}
}
//拼接資料為一個數組。(這個方法就是將wxResult中的openid和session_key取出,然後和使用者id一起放進一個數組)
       $tokenValue = $this->_splicingValue($wxResult, $id);
//製作令牌
//存入快取
       $token = $this->_saveCache($tokenValue);
//返回token
return $token;
}

下面我們來看看_saveCache方法

我們將拼接成一個數組的資料$tokenValue直接傳入方法中,呼叫一個隨機字串方法,將這個隨機字串當做key,把傳入我使用者資料序列化之後當作value,然後根據配置裡的快取過期時間,來存入快取。

/**
    * 將令牌存入快取,返回token
    * @param $tokenValue
    * @return string
    * @throws TokenException
    */
private function _saveCache($tokenValue)
{
//呼叫父類中的隨機字串方法
       $key = parent::_makeToken();
//序列化包含id,openid,sessionKey的陣列
       $value = serialize($tokenValue);
//在配置中取出儲存時間的配置
       $expriesTime = config('setting.expires_in');
//存入快取
       $result = cache($key, $value, $expriesTime);
//如果存入失敗,丟擲異常
if (!$result) {
throw new TokenException(
['errorCode' => 10003, 'message' => 'Token save fail']
);
}
//返回隨機字串(也就是要返回給客戶端的token)
return $key;
}

隨機字元方法,為了提高token的安全性,讓別人不那麼容易的複製我們的token。我就寫了這樣的一個方法,大家如果有安全性更好的方法也可以使用自己想的。我就不介紹了 看程式碼吧

/**
    * 構建token隨機字串
    */
public function _makeToken()
{
//隨機抽取32位字串方法,儲存在common.php中
       $randChar = randomkeys(32);
//時間戳
       $timestamp = time();
//配置中的鹽值
       $salt = config('secret.token_salt');
//拼接之後sha1加密
return sha1($randChar . $timestamp . $salt);
}

這裡我們就將隨機生成的隨機字串返回到service層,service層再返回給控制器,控制器就可以返回給客戶端了

看下完整的控制器吧

public function getToken($code = '')
{
//建立獨立驗證器,呼叫驗證器中的驗證方法
TokenCheck::instance()->goCheck();
       $utObj = new UserToken($code);
       $token = $utObj->getUserToken();
return ['token'=>$token];
}

這樣一個小程式登入換取token的流程就走完了。這個業務呢是藉助微信伺服器中的openid來作為唯一標識來派發token,如果不是微信的專案的話,我們同樣的可以是微博登入,qq登入等第三方登入。或者自己的資料庫中的id來作為唯一標識。同樣可以派發token。

這裡只是介紹了token的派發,還有一些token的應用,有時間的時候再寫吧。今天就介紹到這裡。如果有什麼沒有寫對的地方,希望大神指正,我們共同學習。

以上

相關推薦

程式登入換取token

前言:這次主要是介紹些業務邏輯,技術點倒是沒有多少。不過在開發中,優秀的程式設計思路同樣是非常值得學習的。 最近小程式可以說在開發屆狠狠的火了一把。微信小程式可以開發遊戲,騰訊率先帶頭,做出了一個跳一跳也是點爆朋友圈。所謂落後就要捱打,那麼今天就開始學習小程式的一些小知識吧(

全棧專案|書架|程式-登入token鑑權

小程式登入 之前也寫過微信小程式登入的相關文章: 微信小程式~新版授權使用者登入例子 微信小程式-攜帶Token無感知登入的網路請求方案 微信小程式開通雲開發並利用雲函式獲取Openid 也可以通過官方的這張時序圖瞭解小程式的登入流程: 從流程圖上可以看出微信小程式登入需要先呼叫wx.login()

程式登入授權

wxml檔案內容 <view class="container"> <view class="userinfo"> <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInf

程式登入-openid和unionid

本文轉自https://www.cnblogs.com/yaoyuqian/p/8203792.html   我們一般都是先獲取到微信的 unionid,然後再通過 unionid 去登入自己的網站,就可以關聯到使用者在自己網站上的 user_id,但是在小程式登入中,有時候可以獲取到

解決程式登入與釋出的一些問題

解決微信小程式的問題 圖片在電腦上顯示但在手機上卻無法顯示的問題 要使用的是本地圖片,不想把圖片上傳到網路再通過https的方式解決,解決方法如下: 1.image src中的圖片地址對英文字母大小寫敏感,必須確認大小寫對得上; 2.圖片大小問題。本地圖片要小於10KB才能順利在真機上顯示。 為什麼

程式--登入流程梳理

前言 微信小程式凡是需要記錄使用者資訊都需要登入,但是也有幾種不同的登入方式,但是在小程式部分的登入流程是一樣的。之前就朦朦朧朧地用之前專案的邏輯改改直接用了,這個新專案要用就又結合官方文件重新梳理了下,並記錄一下,好記性不如爛筆頭嘛,哈哈。 幾種登入流程設計 利用OpenId 建立新使用者 這種方式

基於Shiro,JWT實現程式登入完整例子

小程式官方流程圖如下,官方地址 : developers.weixin.qq.com/miniprogram… : 如果此圖理解不清楚的地方,也可參看我的部落格 : www.cnblogs.com/ealenxie/p/… 本文是對接微信小程式自定義登入的一個完整例子實現 ,技術棧為 :

程式登入Java後臺介面(詳解,附示例程式碼)

首先看一下官方文件 我們先對官方給的時序圖進行簡單的分析 1.當小程式呼叫wx.login()時,會獲得一個code(臨時登入憑證),然後我們需要用wx.request()將code傳送到自己的伺服器. 2.在伺服器的介面中,呼叫登入憑證校檢介面,將appid(

程式登入(Java伺服器)

1, 首先前端會呼叫授權介面這個不用管, 呼叫授權介面以後, 會拿到微信使用者的頭像, 名稱, 前端的朋友請往這邊走, 微信小程式登入流程, 你可能走錯片場了,  我們討論的是後臺的登入 2, 我只需要知道, 當前端呼叫微信的授權介面以後, 有一個很重要的引數, 那就是co

程式 登入 獲取授權登入

很簡潔的版本了吧,記憶力奇差,先存起來忘記了自己再點開看 <template> <view class="container"> // 這裡面的東西不要漏 <button type="primary" open-type="g

程式 登入併成功跳轉

//app.js App({ onLaunch: function () { // 展示本地儲存能力 var logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorage

程式登入&授權&獲取使用者資訊(thinkphp5後臺)

後臺用到的公共方法(寫入common.php檔案的) 1.傳送HTTP請求方法,用於獲取code。 /** * 傳送HTTP請求方法 * @param string $url 請求URL * @param array $params 請求引數 * @p

Java實現程式登入 獲取使用者資訊

小程式比公眾號授權登入 更加簡單 其實沒什麼是後臺需要處理的 前端傳過來一個code 我們儲存以下通過code獲取過來的openid就可以 其他的使用者資訊 前端小程式那邊可以獲取。首先既然是小程式登入 你要有一個你自己的小程式還是要拿到你自己的appid和appSecret

程式登入註冊demo+java伺服器(一)

一.開發平臺和前期準備1.前端工具:微信web開發者工具打web開發者工具,新建小程式專案,目錄和名稱自己隨意填,AppID點選體驗:小程式小程式開啟後,點選右上方的詳情,專案設定,勾選不校驗xxxxx2.後臺開發工具:eclipseeclipse要求是java ee版的,並

django-程式登入

小程式登入邏輯前端通過呼叫wx.login()獲取code, 將code和使用者基本資訊傳送到後端,後端通過request.get向微信伺服器傳送get請求獲取使用者openid和session_key,手動新增jwt-token,利用jwt自動校驗使用者是否登入   小程式前端觸發login事

程式登入元件封裝 —— 完成已登入狀態才能繼續的操作

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 此元件是專案中用到的,專案結束了,分享給大家,希望能對大家有所幫助 這裡只討論怎樣解決需要已

程式登入那些事

最近團隊在開發一款小程式,都是新手,一邊看文件,一邊開發。在開發中會遇到各種問題,今天把小程式登入這塊的流程整理下,做個記錄。 小程式的登入跟平時自己APP這種登入驗證還不太一樣,多了一個角色,那就是微信伺服器。 根據微信官方提供的登入流程時序圖可以清楚的瞭解小程式登入需要多少個步驟,下

程式登入狀態java後臺解密

一、登入流程圖 二、微信小程式端 doLogin:function(callback = () =>{}){ let that = this; wx.login({ success:function(loginRes){ if(l

程式登入前+後臺實現

微信小程式授權登入 最近在學習微信小程式開發,研究了一下微信小程式的授權登入。發現微信小程式授權登入真的是一件很簡單的事情。 微信登入授權順序圖:  這是API  連結 微信登入授權可以有兩種方法實現1,微信小程式後臺直接訪問網址:https ://api.weixi

程式登入授權、獲取使用者頭像增加樣式【完整原始碼】

完善功能: 1、通過open-data展示使用者頭像 程式碼: index.wxml <view wx:if="{{canIUse}}"> <view class='header'> <view class="user