通用第三方登陸說明文檔
2.0 版本全新發布,目前支持的登陸平臺包括:
- 微信
- 微博
- 支付寶
- Line
安裝
composer require anerg2046/sns_auth
複製代碼
類庫使用的命名空間爲
\\anerg\\OAuth2
目錄結構
.
├── README.md 說明文件
├── composer.json composer文件
├── src 代碼源文件目錄
│ ├── Connector
│ │ ├── Gateway.php 必須繼承的抽象類
│ │ └── GatewayInterface.php 必須實現的接口
│ ├── Gateways
│ │ ├── Alipay.php
│ │ ├── Facebook.php
│ │ ├── Google.php
│ │ ├── Line.php
│ │ ├── Qq.php
│ │ ├── Twitter.php
│ │ ├── Weibo.php
│ │ └── Weixin.php
│ ├── Helper
│ │ └── Str.php 字符串輔助類
│ └── OAuth.php 抽象實例類
└── wx_proxy.php 微信多域名代理文件
複製代碼
公共方法
在接口文件中,定義了 4 個方法,是每一個第三方基類都必須實現的,用於相關的第三方登陸操做和獲取數據。方法名以下:
/**
* 獲得跳轉地址
*/
public function getRedirectUrl();
/**
* 獲取當前受權用戶的openid標識
*/
public function openid();
/**
* 獲取格式化後的用戶信息
*/
public function userinfo();
/**
* 獲取原始接口返回的用戶信息
*/
public function userinfoRaw();
微信有一個額外的方法,用於獲取代理請求的地址
/**
* 獲取中轉代理地址
*/
public function getProxyURL();
典型用法
以 ThinkPHP5 爲例
<?php
namespace app\mobile\controller;
use anerg\OAuth2\OAuth;
use think\facade\Config;
class Sns
{
private $config;
/**
* 第三方登陸,執行跳轉操做
*
* @param string $name 第三方渠道名稱,目前可用的爲:weixin,qq,weibo,alipay,facebook,twitter,line,google
*/
public function login($name)
{
//獲取配置
$this->config = Config::get('sns.' . $name);
//設置回跳地址
$this->config['callback'] = $this->makeCallback($name);
//能夠設置代理服務器,通常用於調試國外平臺
$this->config['proxy'] = 'http://127.0.0.1:1080';
/**
* 對於微博,若是登陸界面要適用於手機,則須要設定->setDisplay('mobile')
*
* 對於微信,若是是公衆號登陸,則須要設定->setDisplay('mobile'),不然是WEB網站掃碼登陸
*
* 其餘登陸渠道的這個設置沒有任何影響,爲了統一,能夠都寫上
*/
return redirect(OAuth::$name($this->config)->setDisplay('mobile')->getRedirectUrl());
/**
* 若是須要微信代理登陸,則須要:
*
* 1.將wx_proxy.php放置在微信公衆號設定的回調域名某個地址,如 http://www.abc.com/proxy/wx_proxy.php
* 2.config中加入配置參數proxy_url,地址爲 http://www.abc.com/proxy/wx_proxy.php
*
* 而後獲取跳轉地址方法是getProxyURL,以下所示
*/
$this->config['proxy_url'] = 'http://www.abc.com/proxy/wx_proxy.php';
return redirect(OAuth::$name($this->config)->setDisplay('mobile')->getProxyURL());
}
public function callback($name)
{
//獲取配置
$this->config = Config::get('sns.' . $name);
//設置回跳地址
$this->config['callback'] = $this->makeCallback($name);
//獲取格式化後的第三方用戶信息
$snsInfo = OAuth::$name($this->config)->userinfo();
//獲取第三方返回的原始用戶信息
$snsInfoRaw = OAuth::$name($this->config)->userinfoRaw();
//獲取第三方openid
$openid = OAuth::$name($this->config)->openid();
}
/**
* 生成回跳地址
*
* @return string
*/
private function makeCallback($name)
{
//注意須要生成完整的帶http的地址
return url('/sns/callback/' . $name, '', 'html', true);
}
}
2.0 版本再也不經過系統自動設置 state,若有須要請自行處理驗證,state 也放入 config 裏便可
Line 和 Facebook 強制要求傳遞 state,若是你沒有設置,則會傳遞隨機值
若是要驗證 state,則在獲取用戶信息的時候要加上->mustCheckState()
方法。
$snsInfo = OAuth::$name($this->config)->mustCheckState()->userinfo();
注意,不是全部的平臺都支持傳遞 state,請自行閱讀官方文檔
客戶端登陸
public function sns()
{
$platform = $this->request->param('sns_platform');
//獲取本站的第三方登陸配置
$config = Config::get($platform . '.' . Config::get($platform));
// $config['proxy'] = 'http://127.0.0.1:1080';
//QQ,Facebook,Line,要求客戶端傳遞access_token便可
$config['access_token'] = $this->request->param('access_token', '');
//Twitter須要傳遞下面四個參數
$config['oauth_token'] = $this->request->param('oauth_token', '');
$config['oauth_token_secret'] = $this->request->param('oauth_token_secret', '');
$config['user_id'] = $this->request->param('user_id', '');
$config['screen_name'] = $this->request->param('screen_name', '');
//其餘和web登陸同樣,要求客戶端傳遞code過來便可,能夠是post也能夠是get方式
$snsInfo = OAuth::$platform($config)->userinfo();
print_r($snsInfo);
}
配置文件樣例
1.微信
'app_id' => 'wxbc4113c******',
'app_secret' => '4749970d284217d0a**********',
'scope' => 'snsapi_userinfo',//若是須要靜默受權,這裏改爲snsapi_base,掃碼登陸系統會自動改成snsapi_login
複製代碼
2.QQ
'app_id' => '1013****',
'app_secret' => '67c52bc284b32e7**********',
'scope' => 'get_user_info',
複製代碼
QQ 如今能夠獲取unionid
了,詳見: wiki.connect.qq.com/unionid%E4%… 只須要配置參數$config['withUnionid'] = true
,默認不會請求獲取 Unionid
3.微博
'app_id' => '78734****',
'app_secret' => 'd8a00617469018d61c**********',
'scope' => 'all',
複製代碼
4.支付寶
'app_id' => '2016052*******',
'scope' => 'auth_user',
'pem_private' => Env::get('ROOT_PATH') . 'pem/private.pem', // 你的私鑰
'pem_public' => Env::get('ROOT_PATH') . 'pem/public.pem', // 支付寶公鑰
複製代碼
5.Facebook
'app_id' => '2774925********',
'app_secret' => '99bfc8ad35544d7***********',
'scope' => 'public_profile,user_gender',//user_gender須要審覈,因此不必定能獲取到
複製代碼
facebook 有個特殊的配置$config['field']
,默認是'id,name,gender,picture.width(400)'
,你能夠根據需求參考官方文檔自行選擇要獲取的用戶信息
6.Twitter
'app_id' => '3nHCxZgcK1WpYV**********',
'app_secret' => '2byVAPayMrG8LISjopwIMcJGy***************',
複製代碼
7.Line
'app_id' => '159******',
'app_secret' => '1f19c98a61d148f2************',
'scope' => 'profile',
複製代碼
8.Google
'app_id' => '7682717*******************.apps.googleusercontent.com',
'app_secret' => 'w0Kq-aYA***************',
'scope' => 'https://www.googleapis.com/auth/userinfo.profile',
複製代碼
返回樣例
Array
(
[openid] => 1047776979*******
[channel] => google
[nick] => Coeus Rowe
[gender] => m //twitter和line不會返回性別,因此這裏是n,Facebook根據你的權限,可能也不會返回,因此也多是n
[avatar] => https://lh6.googleusercontent.com/-iLps1iAjL8Q/AAAAAAAAAAI/AAAAAAAAAAA/Bu5l0EIquF0/photo.jpg
)
複製代碼
微信會返回特有的 unionid 字段