本集成包在官方包上擴展了支付寶登錄和微信,支持最新的3.23版本
config
/* URL配置 */
'URL_CASE_INSENSITIVE' => true, //默認false 表示URL區分大小寫 true則表示不區分大小寫
'URL_MODEL' => 3, //URL模式
'VAR_URL_PARAMS' => '', // PATHINFO URL參數變量
'URL_PATHINFO_DEPR' => '/', //PATHINFO URL分割符
/* 加載擴展配置文件 */
'LOAD_EXT_CONFIG' => 'sdk_config',
sdk_config
<?php
// +----------------------------------------------------------------------
// | LTHINK [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://LTHINK.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 濤哥 <liangtao.gz@foxmail.com>
// +----------------------------------------------------------------------
// | sdk_config.php 2015-12-01
// +----------------------------------------------------------------------
//定義回調URL通用的URL
define('URL_CALLBACK', 'http://' . $_SERVER['SERVER_NAME'] . '?s=/User/Index/callback');
return array(
//支付寶登錄
'THINK_SDK_ALIPAY' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'alipay',
),
//微信登錄
'THINK_SDK_WEIXIN' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'weixin',
),
//騰訊QQ登錄配置
'THINK_SDK_QQ' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'qq',
),
//騰訊微博配置
'THINK_SDK_TENCENT' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'tencent',
),
//新浪微博配置
'THINK_SDK_SINA' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'sina',
),
//網易微博配置
'THINK_SDK_T163' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 't163',
),
//人人網配置
'THINK_SDK_RENREN' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'renren',
),
//360配置
'THINK_SDK_X360' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'x360',
),
//豆瓣配置
'THINK_SDK_DOUBAN' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'douban',
),
//Github配置
'THINK_SDK_GITHUB' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'github',
),
//Google配置
'THINK_SDK_GOOGLE' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'google',
),
//MSN配置
'THINK_SDK_MSN' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'msn',
),
//點點配置
'THINK_SDK_DIANDIAN' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'diandian',
),
//淘寶網配置
'THINK_SDK_TAOBAO' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'taobao',
),
//百度配置
'THINK_SDK_BAIDU' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'baidu',
),
//開心網配置
'THINK_SDK_KAIXIN' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'kaixin',
),
//搜狐微博配置
'THINK_SDK_SOHU' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'sohu',
),
);
IndexController
<?php
// +----------------------------------------------------------------------
// | LTHINK [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://LTHINK.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 濤哥 <liangtao.gz@foxmail.com>
// +----------------------------------------------------------------------
// IndexAction.class.php 2013-02-25
namespace User\Controller;
use Think\Controller;
use LT\ThinkSDK\ThinkOauth;
Header('Content-Type: text/html; charset=utf-8');
class IndexController extends Controller
{
//SNS登錄首頁
public function index()
{
lt(URL_CALLBACK);
$this->display();
}
//登錄地址
public function login($type = null)
{
empty($type) && $this->error('參數錯誤');
//加載ThinkOauth類並實例化一個對象
$sns = ThinkOauth::getInstance($type);
//跳轉到授權頁面
redirect($sns->getRequestCodeURL());
}
//授權回調地址
public function callback($type = null, $code = null)
{
(empty($type) || empty($code)) && $this->error('參數錯誤');
//加載ThinkOauth類並實例化一個對象
$sns = ThinkOauth::getInstance($type);
//騰訊微博需傳遞的額外參數
$extend = null;
if ($type == 'tencent') {
$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
}
//請妥善保管這里獲取到的Token信息,方便以后API調用
//調用方法,實例化SDK對象的時候直接作為構造函數的第二個參數傳入
//如: $qq = ThinkOauth::getInstance('qq', $token);
$token = $sns->getAccessToken($code, $extend);
//獲取當前登錄用戶信息
if (is_array($token)) {
$user_info = A('Type', 'Event')->$type($token);
echo("<h1>恭喜!使用 {$type} 用戶登錄成功</h1><br>");
echo("授權信息為:<br>");
dump($token);
echo("當前登錄用戶信息為:<br>");
dump($user_info);
}
}
}
復制
TypeEvent.class
<?php
// +----------------------------------------------------------------------
// | LTHINK [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://LTHINK.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 濤哥 <liangtao.gz@foxmail.com>
// +----------------------------------------------------------------------
// TypeEvent.class.php 2015-12-02
namespace User\Event;
use LT\ThinkSDK\ThinkOauth;
Header('Content-Type: text/html; charset=utf-8');
class TypeEvent
{
//登錄成功,獲取騰訊QQ用戶信息
public function qq($token)
{
$qq = ThinkOauth::getInstance('qq', $token);
$data = $qq->call('user/get_user_info');
if ($data['ret'] == 0) {
$userInfo['type'] = 'QQ';
$userInfo['name'] = $data['nickname'];
$userInfo['nick'] = $data['nickname'];
$userInfo['head'] = $data['figureurl_2'];
return $userInfo;
} else {
throw_exception("獲取騰訊QQ用戶信息失敗:{$data['msg']}");
}
}
//登錄成功,獲取騰訊微博用戶信息
public function tencent($token)
{
$tencent = ThinkOauth::getInstance('tencent', $token);
$data = $tencent->call('user/info');
if ($data['ret'] == 0) {
$userInfo['type'] = 'TENCENT';
$userInfo['name'] = $data['data']['name'];
$userInfo['nick'] = $data['data']['nick'];
$userInfo['head'] = $data['data']['head'];
return $userInfo;
} else {
throw_exception("獲取騰訊微博用戶信息失敗:{$data['msg']}");
}
}
//登錄成功,獲取新浪微博用戶信息
public function sina($token)
{
$sina = ThinkOauth::getInstance('sina', $token);
$data = $sina->call('users/show', "uid={$sina->openid()}");
if ($data['error_code'] == 0) {
$userInfo['type'] = 'SINA';
$userInfo['name'] = $data['name'];
$userInfo['nick'] = $data['screen_name'];
$userInfo['head'] = $data['avatar_large'];
return $userInfo;
} else {
throw_exception("獲取新浪微博用戶信息失敗:{$data['error']}");
}
}
//登錄成功,獲取網易微博用戶信息
public function t163($token)
{
$t163 = ThinkOauth::getInstance('t163', $token);
$data = $t163->call('users/show');
if ($data['error_code'] == 0) {
$userInfo['type'] = 'T163';
$userInfo['name'] = $data['name'];
$userInfo['nick'] = $data['screen_name'];
$userInfo['head'] = str_replace('w=48&h=48', 'w=180&h=180', $data['profile_image_url']);
return $userInfo;
} else {
throw_exception("獲取網易微博用戶信息失敗:{$data['error']}");
}
}
//登錄成功,獲取人人網用戶信息
public function renren($token)
{
$renren = ThinkOauth::getInstance('renren', $token);
$data = $renren->call('users.getInfo');
if (!isset($data['error_code'])) {
$userInfo['type'] = 'RENREN';
$userInfo['name'] = $data[0]['name'];
$userInfo['nick'] = $data[0]['name'];
$userInfo['head'] = $data[0]['headurl'];
return $userInfo;
} else {
throw_exception("獲取人人網用戶信息失敗:{$data['error_msg']}");
}
}
//登錄成功,獲取360用戶信息
public function x360($token)
{
$x360 = ThinkOauth::getInstance('x360', $token);
$data = $x360->call('user/me');
if ($data['error_code'] == 0) {
$userInfo['type'] = 'X360';
$userInfo['name'] = $data['name'];
$userInfo['nick'] = $data['name'];
$userInfo['head'] = $data['avatar'];
return $userInfo;
} else {
throw_exception("獲取360用戶信息失敗:{$data['error']}");
}
}
//登錄成功,獲取豆瓣用戶信息
public function douban($token)
{
$douban = ThinkOauth::getInstance('douban', $token);
$data = $douban->call('user/~me');
if (empty($data['code'])) {
$userInfo['type'] = 'DOUBAN';
$userInfo['name'] = $data['name'];
$userInfo['nick'] = $data['name'];
$userInfo['head'] = $data['avatar'];
return $userInfo;
} else {
throw_exception("獲取豆瓣用戶信息失敗:{$data['msg']}");
}
}
//登錄成功,獲取Github用戶信息
public function github($token)
{
$github = ThinkOauth::getInstance('github', $token);
$data = $github->call('user');
if (empty($data['code'])) {
$userInfo['type'] = 'GITHUB';
$userInfo['name'] = $data['login'];
$userInfo['nick'] = $data['name'];
$userInfo['head'] = $data['avatar_url'];
return $userInfo;
} else {
throw_exception("獲取Github用戶信息失敗:{$data}");
}
}
//登錄成功,獲取Google用戶信息
public function google($token)
{
$google = ThinkOauth::getInstance('google', $token);
$data = $google->call('userinfo');
if (!empty($data['id'])) {
$userInfo['type'] = 'GOOGLE';
$userInfo['name'] = $data['name'];
$userInfo['nick'] = $data['name'];
$userInfo['head'] = $data['picture'];
return $userInfo;
} else {
throw_exception("獲取Google用戶信息失敗:{$data}");
}
}
//登錄成功,獲取Google用戶信息
public function msn($token)
{
$msn = ThinkOauth::getInstance('msn', $token);
$data = $msn->call('me');
if (!empty($data['id'])) {
$userInfo['type'] = 'MSN';
$userInfo['name'] = $data['name'];
$userInfo['nick'] = $data['name'];
$userInfo['head'] = '微軟暫未提供頭像URL,請通過 me/picture 接口下載';
return $userInfo;
} else {
throw_exception("獲取msn用戶信息失敗:{$data}");
}
}
//登錄成功,獲取點點用戶信息
public function diandian($token)
{
$diandian = ThinkOauth::getInstance('diandian', $token);
$data = $diandian->call('user/info');
if (!empty($data['meta']['status']) && $data['meta']['status'] == 200) {
$userInfo['type'] = 'DIANDIAN';
$userInfo['name'] = $data['response']['name'];
$userInfo['nick'] = $data['response']['name'];
$userInfo['head'] = "https://api.diandian.com/v1/blog/{$data['response']['blogs'][0]['blogUuid']}/avatar/144";
return $userInfo;
} else {
throw_exception("獲取點點用戶信息失敗:{$data}");
}
}
//登錄成功,獲取淘寶網用戶信息
public function taobao($token)
{
$taobao = ThinkOauth::getInstance('taobao', $token);
$fields = 'user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info';
$data = $taobao->call('taobao.user.buyer.get', "fields={$fields}");
if (!empty($data['user_buyer_get_response']['user'])) {
$user = $data['user_buyer_get_response']['user'];
$userInfo['type'] = 'TAOBAO';
$userInfo['name'] = $user['user_id'];
$userInfo['nick'] = $user['nick'];
$userInfo['head'] = $user['avatar'];
return $userInfo;
} else {
throw_exception("獲取淘寶網用戶信息失敗:{$data['error_response']['msg']}");
}
}
//登錄成功,獲取百度用戶信息
public function baidu($token)
{
$baidu = ThinkOauth::getInstance('baidu', $token);
$data = $baidu->call('passport/users/getLoggedInUser');
if (!empty($data['uid'])) {
$userInfo['type'] = 'BAIDU';
$userInfo['name'] = $data['uid'];
$userInfo['nick'] = $data['uname'];
$userInfo['head'] = "http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']}";
return $userInfo;
} else {
throw_exception("獲取百度用戶信息失敗:{$data['error_msg']}");
}
}
//登錄成功,獲取開心網用戶信息
public function kaixin($token)
{
$kaixin = ThinkOauth::getInstance('kaixin', $token);
$data = $kaixin->call('users/me');
if (!empty($data['uid'])) {
$userInfo['type'] = 'KAIXIN';
$userInfo['name'] = $data['uid'];
$userInfo['nick'] = $data['name'];
$userInfo['head'] = $data['logo50'];
return $userInfo;
} else {
throw_exception("獲取開心網用戶信息失敗:{$data['error']}");
}
}
//登錄成功,獲取搜狐用戶信息
public function sohu($token)
{
$sohu = ThinkOauth::getInstance('sohu', $token);
$data = $sohu->call('i/prv/1/user/get-basic-info');
if ('success' == $data['message'] && !empty($data['data'])) {
$userInfo['type'] = 'SOHU';
$userInfo['name'] = $data['data']['open_id'];
$userInfo['nick'] = $data['data']['nick'];
$userInfo['head'] = $data['data']['icon'];
return $userInfo;
} else {
throw_exception("獲取搜狐用戶信息失敗:{$data['message']}");
}
}
}
復制
使用方式:
1、使用命名空間
use LT\ThinkSDK\ThinkOauth;
2、設置三方登錄的類別並賦予一個變量
$type = ThinkOauth::getInstance('qq');
3、設置配置文件
'THINK_SDK_(TYPE)' => array(
'APP_KEY' => '', //應用注冊成功后分配的 APP ID
'APP_SECRET' => '', //應用注冊成功后分配的KEY
'CALLBACK' => '', //注冊應用填寫的callback
),
上文中的(TYPE)為設置的類別,其值目前有以下幾個:
//支付寶登錄 THINK_SDK_ALIPAY
//微信登錄 THINK_SDK_WEIXIN
//騰訊QQ登錄配置 THINK_SDK_QQ
// 用戶基本信息API接口 user/get_user_info
//騰訊微博配置 THINK_SDK_TENCENT
// 用戶基本信息API接口 user/info
//新浪微博配 THINK_SDK_SINA
// 用戶基本信息API接口 users/show。附加參數:'uid='.$obj->openid()
//網易微博配置 THINK_SDK_T163
// 用戶基本信息API接口 users/show
//人人網配置 THINK_SDK_RENREN
// 用戶基本信息API接口 users.getInfo
//360配置 THINK_SDK_X360
// 用戶基本信息API接口 user/me
//豆瓣配置 THINK_SDK_DOUBAN
// 用戶基本信息API接口 user/~me
//Github配置 THINK_SDK_GITHUB
// 用戶基本信息API接口 user
//Google配置 THINK_SDK_GOOGLE
// 用戶基本信息API接口 userinfo
//MSN配置 THINK_SDK_MSN
// 用戶基本信息API接口 msn。附加參數:token
//點點配置 THINK_SDK_DIANDIAN
// 用戶基本信息API接口 user/info
//淘寶網配置 THINK_SDK_TAOBAO
// 用戶基本信息API接口 taobao.user.buyer.get。附加參數:'fields=user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info'
//百度配置 THINK_SDK_BAIDU
// 用戶基本信息API接口 passport/users/getLoggedInUser
// 注意,百度的頭像位置是http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']}
//開心網配置 THINK_SDK_KAIXIN
// 用戶基本信息API接口 users/me
//搜狐微博配置 THINK_SDK_SOHU
// 用戶基本信息API接口 i/prv/1/user/get-basic-info
4、實例化一個登錄頁面
redirect($type->getRequestCodeURL());
這里的$type是第二部獲取的結果
5、回調頁面
$code = $this->get('code');
$type = 'QQ';
$sns = ThinkOauth::getInstance($type);
//騰訊微博需傳遞的額外參數
$extend = null;
if($type == 'tencent'){
$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
}
//請妥善保管這里獲取到的Token信息,方便以后API調用
//調用方法,實例化SDK對象的時候直接作為構造函數的第二個參數傳入
//如: $qq = ThinkOauth::getInstance('qq', $token);
$token = $sns->getAccessToken($code , $extend);
//獲取當前登錄用戶信息
if(is_array($token)){
$data = $sns->call('user/get_user_info');
if($data['ret'] == 0){
$userInfo['type'] = 'QQ';
$userInfo['name'] = $data['nickname'];
$userInfo['nick'] = $data['nickname'];
$userInfo['head'] = $data['figureurl_2'];
// 此處的$userInfo就是需要的用戶信息
} else {
E('獲取騰訊QQ用戶信息失敗 : '.$data['msg']);
}
}