_“你應該明白,我的朋友,
宇宙從來無所謂起始,
它也永遠不會有結局,
因為邦迪,戈爾德,還有我,
直到我們頭發掉精光,
對這一點都深信不疑!”_
_--《物理世界奇遇記》_
##3.8.1 擴展類庫:用戶、會話和第三方登錄集成
首先,特別感謝@Aevit ,允許我將些擴展類庫進行開源。原來此類庫的功能只是當前開發項目中的功能,我現將其抽離成可配置使用的擴展類庫,以供大家共享。
此類庫主要特點有:
+ 1、可以和第三方登錄集成,包括:微信登錄、新浪登錄、QQ登錄
+ 2、為客戶端提供了直接可以調用的登錄接口
+ 3、為服務端提供了直接可以檢測用戶登錄態的操作
+ 4、支持token落地、高效緩存和分布式的數據庫存儲
+ 5、展示了如何開發一個項目級的類庫、包括數據庫配置、翻譯等
> 溫馨提示:
> 此擴展類庫還在開發完善中,但已有項目在使用,感興趣的同學可以嘗試使用。
##3.8.2 安裝
###(1)擴展包下載
從 [PhalApi-Library](http://git.oschina.net/dogstar/PhalApi-Library) 擴展庫中下載獲取 **User** 用戶包,如使用:
```javascript
git clone https://git.oschina.net/dogstar/PhalApi-Library.git
```
然后把 **User** 目錄復制到 **./PhalApi/Library/** 下,即:
```javascript
cp ./PhalApi-Library/User ./PhalApi/Library/ -R
```
###(2)數據庫表導入
默認下,User類庫會使用默認的數據庫配置,但有追加一些需要用到的表。因此需要導入以下表:
```javascript
$ cd /Library/User
$ tree
├── Data
│?? ├── user_login_qq.sql
│?? ├── user_login_sina.sql
│?? ├── user_login_weixin.sql
│?? ├── user_session.sql
│?? └── user.sql
```
> 溫馨提示:
> 導入前,可以自行調整表的前綴。
###(3)數據庫配置
將 PhalApi-Library/User/Config/dbs.php 里面的配置拷貝到你的項目配置:
```javascript
//請將以下配置拷貝到 ./Config/dbs.php 文件對應的位置中
//10張表,可根據需要,自行調整表前綴、主鍵名和路由
'user_session' => array(
'prefix' => 'phalapi_',
'key' => 'id',
'map' => array(
array('db' => 'db_demo'),
array('start' => 0, 'end' => 9, 'db' => 'db_demo'),
),
),
```
###(4)入口注冊
```javascript
//必須顯式注冊,以便可以讓服務自行初始化
DI()->userLite = new User_Lite();
```
###(5)其他可選配置
+ 為了體現高效緩存的好處,建議先注冊DI()->cache
+ 為了接口更明朗的參數規則說明,建議將下而規則追加到配置文件./Config/app.php中:
```javascript
return array(
/**
* 應用接口層的統一參數
*/
'apiCommonRules' => array(
//其他原來的參數配置
...
//登錄信息
'userId' => array(
'name' => 'user_id', 'type' => 'int', 'default' => 0, 'require' => false,
),
'token' => array(
'name' => 'token', 'type' => 'string', 'default' => '', 'require' => false,
),
),
```
###(6)checkApiParams.php的初始化
同樣,需要在checkApiParams.php文件顯式注冊,才能讓User這個擴展類庫完成自我的必要初始化:
```javascript
//裝載你的接口
DI()->loader->addDirs(array('Demo', 'Library'));
DI()->userLite = new User_Lite();
```
否則會導致service不存在。
##3.8.3 入門使用
###(1)對于客戶端
####(1-1)微信登錄
#####1、功能說明
實現通過微信登錄,并且首次登錄時,自動創建用戶并綁定。
#####2、接口URL
/?service=User_User_Login.weixin + 公共參數(免登錄態)
#####3、接口參數
參數|必須|默認值|說明
---|---|---|---
wx_openid|1||微信OPENID
wx_token|1||微信TOKEN
wx_expires_in|1||微信失效時間
#####4、返回結果
#####返回字段
參數|類型|說明
---|---|---
info|object|登錄成功后的相關信息
user_id|int|用戶ID
token|string|用戶TOKEN
is_new|int|是否為首次登錄,0不是,1是
#####結果示例
```javascript
{
"ret": 200,
"data": {
"code": 0, //0正常登錄
"info": {
"user_id": 3, //用戶ID
"token": "430C0F31FAF1FB1565E4290D1B61185A2408A6DEEA1604C1B5AEB14E44BDF2E0", //用戶TOKEN
"is_new": 0 //是否為首次登錄,0不是,1是
},
"msg": ""
},
"msg": ""
}
```
#####請求示例
/service=User_User_Login.weixin&wx_openid=wx_122348561111&wx_token=ASDF&wx_expires_in=130000000&name=weixinName&avatar=phpunit.png
####(1-2)QQ登錄
#####1、功能說明
實現通過QQ登錄,并且首次登錄時,自動創建用戶并綁定。
#####2、接口URL
/?service=User_User_Login.qq + 公共參數(免登錄態)
#####3、接口參數
參數|必須|默認值|說明
---|---|---|---
qq_openid|1||QQ的OPENID
qq_token|1||QQ的TOKEN
qq_expires_in|1||QQ的失效時間
#####4、返回結果
#####返回字段
參數|類型|說明
---|---|---
info|object|登錄成功后的相關信息
user_id|int|用戶ID
token|string|用戶TOKEN
is_new|int|是否為首次登錄,0不是,1是
#####結果示例
```javascript
{
"ret": 200,
"data": {
"code": 0, //0正常登錄
"info": {
"user_id": 3, //用戶ID
"token": "430C0F31FAF1FB1565E4290D1B61185A2408A6DEEA1604C1B5AEB14E44BDF2E0", //用戶TOKEN
"is_new": 0 //是否為首次登錄,0不是,1是
},
"msg": ""
},
"msg": ""
}
```
#####請求示例
/service=User_User_Login.sina&sina_openid=sina_12345611111&sina_token=ASDF&sina_expires_in=130000000&name=sinaName&avatar=http://dev.phalapi.com/no_avatar.png
####(1-3)新浪微博登錄
#####1、功能說明
實現通過新浪微博登錄,并且首次登錄時,自動創建用戶并綁定。
#####2、接口URL
/?service=User_User_Login.sina
#####3、接口參數
參數|必須|默認值|說明
---|---|---|---
sina_openid|1||新浪微博OPENID
sina_token|1||新浪微博TOKEN
sina_expires_in|1||新浪微博失效時間
#####4、返回結果
#####返回字段
參數|類型|說明
---|---|---
info|object|登錄成功后的相關信息
user_id|int|用戶ID
token|string|用戶TOKEN
is_new|int|是否為首次登錄,0不是,1是
#####結果示例
```javascript
{
"ret": 200,
"data": {
"code": 0, //0正常登錄
"info": {
"user_id": 3, //用戶ID
"token": "430C0F31FAF1FB1565E4290D1B61185A2408A6DEEA1604C1B5AEB14E44BDF2E0", //用戶TOKEN
"is_new": 0 //是否為首次登錄,0不是,1是
},
"msg": ""
},
"msg": ""
}
```
#####請求示例
/service=User_User_Login.weixin&wx_openid=wx_122348561111&wx_token=ASDF&wx_expires_in=130000000&name=weixinName&avatar=phpunit.png
####(1-4)用戶信息
#####1、功能說明
獲取用戶個人信息
#####2、接口URL
/?service=User_User_Info.getUserInfo + 公共參數
#####3、接口參數
參數|必須|默認值|說明
---|---|---|---
other_user_id|1||用戶id
#####4、返回結果
#####返回字段
參數|類型|說明
---|---|---
info|object|登錄成功后的相關信息
user_id|int|用戶ID
username|string|用戶名
nickname|string|用戶昵稱
avatar|string|用戶頭像url
#####結果示例
```javascript
{
"ret": 200,
"data": {
"code": 0,
"info": {
"username": "aevit",
"nickname": "test",
"avatar": "",
"user_id": 1
},
"msg": ""
},
"msg": ""
}
```
#####請求示例
/service=User_User_Info.getUserInfo&other_user_id=1
###(2)對于服務端
####(1)溫柔式檢測登錄態
```javascript
$isLogin = DI()->userLite->check();
```
####(2)強制式檢測登錄態
```javascript
DI()->userLite->check(true);
```
####(3)更多操作
當需要對用戶進行退出登錄時,可以在接口中執行:
```
DI()->userLite->logout();
```
當需要為用戶新建一個會話時,可以在接口中執行:
```
DI()->userLite->generateSession(1); //假設用戶ID為1
```
當需要為用戶延長登錄態有效時間時(默認為一個月),可以在接口進行心跳操作,從而再延長一個月有效時間:
```
DI()->userLite->heartbeat();
```
##3.8.4 示例
###(1)假設在我們的應用的接口中:
```javascript
<?php
class Api_Test extends PhalApi_Api {
public function go() {
Di()->userLite->check(true);
return 'ok';
}
}
```
###(2)先調用微信的登錄:
```
/user/?service=User_User_Login.Weixin&wx_openid=wx_122348561111&wx_token=ASDF&wx_expires_in=130000000&name=weixinName&avatar=phpunit.png
```
返回:
```javascript
{
"ret": 200,
"data": {
"code": 0,
"info": {
"user_id": 94,
"token": "8509BE9C80B67009C559E6A2C4B88E02C885DA6B9FEFFC2DA080999377D08FBF",
"is_new": 0
},
"msg": ""
},
"msg": ""
}
```
###(3)再調用我們應用 的接口:
```
/user/?service=Test.go&user_id=94&token=CE1218493B3A441FCF630E24E98FD3640133EBA6D734C90A620A11C07CE35323
```
返回:
```javascript
{"ret":200,"data":"ok","msg":""}
```
###(4)未登錄下,返回:
```javascript
{"ret":401,"data":[],"msg":"\u975e\u6cd5\u8bf7\u6c42\uff1auser not login"}
```
- 歡迎使用PhalApi!
- 接口,從簡單開始!
- [1.1]-下載與安裝
- [1.2]-創建一個自己的項目
- [1.3]-在線體驗
- [1.4]-文檔、幫助和官網
- [1.10]-對PhalApi框架的抉擇
- [1.11]-快速入門(backup)
- [1.12]-參數規則:接口參數規則配置
- [1.13]-統一的接口請求方式:_sevice=XXX.XXX
- [1.14]-統一的返回格式和結構:ret-data-msg
- [1.15]-數據庫操作:基于NotORM的使用及優化
- [1.16]-配置讀取:內外網環境配置的完美切換
- [1.17]-日記紀錄:簡化版的日記接口
- [1.18]-快速函數:人性化的關懷
- [1.19]-DI服務速查:各資源服務一覽表
- [1.20]-DB操作:數據庫基本操作速查
- [1.21]-類的自動加載:遵循PEAR包的命名規范
- [1.22]-簽名驗證:自定義簽名規則
- [1.23]-請求和響應:GET和POST兩者皆可得及超越JSON格式返回
- [1.24]-緩存策略:更靈活地可配置化的多級緩存
- [1.25]-國際化翻譯:為走向國際化提前做好翻譯準備
- [1.26]-數據安全:數據對稱加密方案
- [1.27]-精益開發:更富表現力的Model層和重量級數據獲取的應對方案
- [1.28]-COOKIE:對COOKIE原生態的支持及記憶加密升級版
- [1.29]-開放與封閉:多入口和統一初始化
- [1.30]-保持的力量:接口開發最佳實踐
- [1.31]-新型計劃任務:以接口形式實現的計劃任務
- [2.11]-核心思想:DI依賴注入-讓資源更可控
- [2.12]-海量數據:可配置的分庫分表
- [2.13]-接口調試:在線SQL語句查看與性能優化
- [2.14]-測試驅動開發:意圖導向編程下的接口開發
- [2.15]-演進:新型計劃任務續篇
- [2.16]-領域驅動設計:應對復雜領域業務的Domain層
- [2.17]-微服務:Api接口服務層
- [2.18]-定制化:資源服務的再實現
- [2.19]-擴展庫:可重用的擴展類庫
- [2.20]-約定編程:架構明顯的編程風格
- [2.21]-服務器統一部署方案簡明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益項目和團隊建設
- [3.1]-擴展類庫:微信開發
- [3.2]-擴展類庫:代理模式下phprpc協議的輕松支持
- [3.3]-擴展類庫:基于PHPMailer的郵件發送
- [3.4]-擴展類庫:優酷開放平臺接口調用
- [3.5]-擴展類庫:七牛云存儲接口調用
- [3.6]-擴展類庫:新型計劃任務
- [3.8]-擴展類庫:用戶、會話和第三方登錄集成
- [3.9]-擴展類庫:swoole支持下的長鏈接和異步任務實現
- [3.11]-擴展類庫:基于FastRoute的快速路由
- [4.2]-開發實戰2:模擬優酷開放平臺接口項目開發
- [4.3]-開發實戰3:一個簡單的小型項目開發(奔跑吧兄弟投票活動)
- [5.1]-架構與思想:PhalApi核心設計和思想解讀
- [5.2]-雜談:扯一些PhalApi的前世和今生
- [5.3]-框架總結:術語表和PHP開發建議
- [5.4]-許可
- [5.5]-聯系和加入我們
- [5.6]-更新日記
- [5.8]-致框架貢獻者:加入PhalApi開源指南
- [6.1]-基于接口查詢語言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi視頻教程
- 附錄1:接口文檔參考模板