亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

微信小程序登錄換取token的教程

2019-11-19 13:44:28
字體:
來源:轉載
供稿:網友

前言:

這次主要是介紹些業務邏輯,技術點倒是沒有多少。不過在開發中,優秀的編程思路同樣是非常值得學習的。

最近小程序可以說在開發屆狠狠的火了一把。微信小程序可以開發游戲,騰訊率先帶頭,做出了一個跳一跳也是點爆朋友圈。所謂落后就要挨打,那么今天就開始學習小程序的一些小知識吧(本文基于十年磨一劍的tp5)

目錄:

  1. 微信登錄換取token的流程
  2. 如何將code變成openid和session_key
  3. 拋出錯誤異常和派發令牌

一:微信登錄換取token的流程

多說無益,直接上圖

小程序獲取token.png

這里介紹的主要是后端開發的流程,前端的不是本文介紹的重點

二:如何將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登錄等第三方登錄?;蛘咦约旱臄祿熘械膇d來作為唯一標識。同樣可以派發token。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内外成人免费激情在线视频网站| 91九色综合久久| 蜜臀久久99精品久久久无需会员| 欧美性受xxxx黑人猛交| 欧美激情精品久久久久| 日韩一区二区三区xxxx| 92福利视频午夜1000合集在线观看| 精品国内产的精品视频在线观看| 久久久久久成人| 亚洲精品国产福利| 国产精品嫩草影院久久久| 欧美日韩国产第一页| 91色琪琪电影亚洲精品久久| 91黄色8090| 亚洲韩国欧洲国产日产av| 欧美猛交ⅹxxx乱大交视频| 亚洲精品久久久久中文字幕欢迎你| 国产一区二区三区三区在线观看| 色哟哟亚洲精品一区二区| 亚洲精品动漫100p| 日韩av中文字幕在线免费观看| 亚洲va男人天堂| 福利一区福利二区微拍刺激| 国产区精品在线观看| 一本色道久久综合狠狠躁篇的优点| 亚洲午夜精品久久久久久久久久久久| 久久精品国产亚洲精品| 国产狼人综合免费视频| 欧美国产精品人人做人人爱| 国模叶桐国产精品一区| 97av在线视频免费播放| 亚洲伊人一本大道中文字幕| 亚洲女人被黑人巨大进入al| 欧美日韩福利在线观看| 国产日产欧美精品| 91精品91久久久久久| 亚洲香蕉伊综合在人在线视看| 91精品国产色综合久久不卡98| 国产精品久久久久久久美男| 日韩欧美在线看| 伊人成人开心激情综合网| 亚洲性生活视频在线观看| 国产成人在线播放| 国产婷婷97碰碰久久人人蜜臀| 日韩成人在线电影网| 久久av红桃一区二区小说| 伊人久久久久久久久久| 国产精品麻豆va在线播放| 97久久精品人人澡人人爽缅北| 伊人久久大香线蕉av一区二区| 欧美激情在线一区| 高清一区二区三区日本久| 在线视频欧美性高潮| 精品国产91久久久| 国产精品一区二区性色av| 国产精品爽爽ⅴa在线观看| 国产精品成人一区二区| 中文国产亚洲喷潮| 久久精品美女视频网站| 国产精品高潮呻吟久久av野狼| 日韩av在线直播| 日韩亚洲欧美成人| 欧美电影在线观看| 国产精品露脸自拍| 精品久久久久久国产91| 久久国产视频网站| 国产日本欧美一区二区三区| 久久久久在线观看| 伊人久久综合97精品| 欧美性理论片在线观看片免费| 日韩av片电影专区| 欧美日韩国产综合视频在线观看中文| 国语对白做受69| 国产女精品视频网站免费| 亚洲一区亚洲二区亚洲三区| 欧美高跟鞋交xxxxhd| 国产伦精品一区二区三区精品视频| 97香蕉久久超级碰碰高清版| 欧美激情手机在线视频| 欧美激情女人20p| 亚洲va欧美va国产综合剧情| 在线亚洲午夜片av大片| 91国产精品电影| 欧美精品第一页在线播放| 国产最新精品视频| 精品亚洲一区二区三区| 亚洲成人xxx| 日韩电影免费在线观看| 岛国精品视频在线播放| 久久国产精品免费视频| 91精品国产91久久久久久| 北条麻妃99精品青青久久| 91免费观看网站| 日本国产精品视频| 日韩欧美国产黄色| 中日韩午夜理伦电影免费| 国产成人综合久久| 日韩黄色av网站| 久久免费观看视频| 日韩一区二区欧美| 国产日韩在线亚洲字幕中文| 久久久久久久久久婷婷| 亚洲成人av在线播放| 6080yy精品一区二区三区| 亚洲免费电影一区| 日韩av网站电影| 精品亚洲国产成av人片传媒| 欧美日韩国产精品一区二区三区四区| 国产精品嫩草影院一区二区| 亚洲成人精品久久| 亚洲国产精品一区二区久| 91精品久久久久久久久久另类| 欧美精品在线免费| 欧美黑人xxxx| 欧美自拍视频在线观看| 大荫蒂欧美视频另类xxxx| 国产69精品久久久久99| 一区二区欧美久久| 国产成人高清激情视频在线观看| 国产精品欧美风情| 91成人天堂久久成人| 亚洲国产精品人人爽夜夜爽| 亚洲国产成人久久| 97欧美精品一区二区三区| 成人免费淫片aa视频免费| 91精品综合久久久久久五月天| 亚洲男人天堂2023| 亚洲成人a**站| wwwwwwww亚洲| 久久精品在线视频| www.日韩不卡电影av| 中文字幕亚洲欧美日韩2019| 欧美大荫蒂xxx| 国产精品一久久香蕉国产线看观看| 国产精欧美一区二区三区| 91精品久久久久久久久久久久久| 国产精品久久久久久久久久久新郎| 97久久精品人搡人人玩| 青草青草久热精品视频在线网站| 欧日韩不卡在线视频| 一区二区三区久久精品| 欧美大片免费看| 青草青草久热精品视频在线观看| 欧美日韩亚洲激情| 久久九九全国免费精品观看| 亚洲欧美日韩精品久久奇米色影视| 亚洲精品免费一区二区三区| 亚洲国产精品国自产拍av秋霞| 欧美日韩国产123| 亚洲激情在线视频| 欧美精品第一页在线播放| 国产亚洲欧美日韩美女| 日韩中文字幕精品视频| 91黑丝高跟在线| 亚洲乱码国产乱码精品精天堂| 日韩精品在线视频美女| 亚洲欧美中文字幕在线一区| 青草青草久热精品视频在线网站| 欧美日韩性视频在线| 成人黄色午夜影院| 亚洲精品中文字幕av| 亚洲xxxx18| 精品网站999www| 国产成人在线一区二区|