thinkphp 3.23 第三方登錄sdk集成包

轉載原文地址:https://www.cnblogs.com/ZDPPU/p/5823812.html

================================

本集成包在官方包上擴展了支付寶登錄和微信,支持最新的3.23版本 config    /* URL配置 */     'URL_CASE_INSENSITIVE' => true, //默認false 表示URL區分大小寫 true則表示不區分大小寫     'URL_MODEL' 

本集成包在官方包上擴展了支付寶登錄和微信,支持最新的3.23版本

config

  1.     /* URL配置 */
  2.     'URL_CASE_INSENSITIVE' => true, //默認false 表示URL區分大小寫 true則表示不區分大小寫
  3.     'URL_MODEL'            => 3, //URL模式
  4.     'VAR_URL_PARAMS'       => '', // PATHINFO URL參數變量
  5.     'URL_PATHINFO_DEPR'    => '/', //PATHINFO URL分割符
  6. /* 加載擴展配置文件 */
  7.     'LOAD_EXT_CONFIG' => 'sdk_config',
複製

sdk_config

  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LTHINK [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2015-2016 http://LTHINK.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 濤哥 <[email protected]>
  8. // +----------------------------------------------------------------------
  9. // | sdk_config.php 2015-12-01
  10. // +----------------------------------------------------------------------
  11. //定義回調URL通用的URL
  12. define('URL_CALLBACK', 'http://' . $_SERVER['SERVER_NAME'] . '?s=/User/Index/callback');
  13. return array(
  14.     //支付寶登錄
  15.     'THINK_SDK_ALIPAY' => array(
  16.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  17.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  18.         'CALLBACK' => URL_CALLBACK . 'alipay',
  19.     ),
  20.     //微信登錄
  21.     'THINK_SDK_WEIXIN' => array(
  22.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  23.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  24.         'CALLBACK' => URL_CALLBACK . 'weixin',
  25.     ),
  26.     //騰訊QQ登錄配置
  27.     'THINK_SDK_QQ' => array(
  28.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  29.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  30.         'CALLBACK' => URL_CALLBACK . 'qq',
  31.     ),
  32.     //騰訊微博配置
  33.     'THINK_SDK_TENCENT' => array(
  34.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  35.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  36.         'CALLBACK' => URL_CALLBACK . 'tencent',
  37.     ),
  38.     //新浪微博配置
  39.     'THINK_SDK_SINA' => array(
  40.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  41.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  42.         'CALLBACK' => URL_CALLBACK . 'sina',
  43.     ),
  44.     //網易微博配置
  45.     'THINK_SDK_T163' => array(
  46.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  47.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  48.         'CALLBACK' => URL_CALLBACK . 't163',
  49.     ),
  50.     //人人網配置
  51.     'THINK_SDK_RENREN' => array(
  52.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  53.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  54.         'CALLBACK' => URL_CALLBACK . 'renren',
  55.     ),
  56.     //360配置
  57.     'THINK_SDK_X360' => array(
  58.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  59.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  60.         'CALLBACK' => URL_CALLBACK . 'x360',
  61.     ),
  62.     //豆瓣配置
  63.     'THINK_SDK_DOUBAN' => array(
  64.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  65.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  66.         'CALLBACK' => URL_CALLBACK . 'douban',
  67.     ),
  68.     //Github配置
  69.     'THINK_SDK_GITHUB' => array(
  70.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  71.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  72.         'CALLBACK' => URL_CALLBACK . 'github',
  73.     ),
  74.     //Google配置
  75.     'THINK_SDK_GOOGLE' => array(
  76.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  77.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  78.         'CALLBACK' => URL_CALLBACK . 'google',
  79.     ),
  80.     //MSN配置
  81.     'THINK_SDK_MSN' => array(
  82.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  83.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  84.         'CALLBACK' => URL_CALLBACK . 'msn',
  85.     ),
  86.     //點點配置
  87.     'THINK_SDK_DIANDIAN' => array(
  88.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  89.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  90.         'CALLBACK' => URL_CALLBACK . 'diandian',
  91.     ),
  92.     //淘寶網配置
  93.     'THINK_SDK_TAOBAO' => array(
  94.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  95.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  96.         'CALLBACK' => URL_CALLBACK . 'taobao',
  97.     ),
  98.     //百度配置
  99.     'THINK_SDK_BAIDU' => array(
  100.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  101.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  102.         'CALLBACK' => URL_CALLBACK . 'baidu',
  103.     ),
  104.     //開心網配置
  105.     'THINK_SDK_KAIXIN' => array(
  106.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  107.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  108.         'CALLBACK' => URL_CALLBACK . 'kaixin',
  109.     ),
  110.     //搜狐微博配置
  111.     'THINK_SDK_SOHU' => array(
  112.         'APP_KEY' => '', //應用註冊成功後分配的 APP ID
  113.         'APP_SECRET' => '', //應用註冊成功後分配的KEY
  114.         'CALLBACK' => URL_CALLBACK . 'sohu',
  115.     ),
  116. );
複製

IndexController

  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LTHINK [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2015-2016 http://LTHINK.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 濤哥 <[email protected]>
  8. // +----------------------------------------------------------------------
  9. // IndexAction.class.php 2013-02-25
  10. namespace User\Controller;
  11. use Think\Controller;
  12. use LT\ThinkSDK\ThinkOauth;
  13. Header('Content-Type: text/html; charset=utf-8');
  14. class IndexController extends Controller
  15. {
  16.     //SNS登錄首頁
  17.     public function index()
  18.     {
  19.         lt(URL_CALLBACK);
  20.         $this->display();
  21.     }
  22.     //登錄地址
  23.     public function login($type = null)
  24.     {
  25.         empty($type) && $this->error('參數錯誤');
  26.         //加載ThinkOauth類並實例化一個對象
  27.         $sns = ThinkOauth::getInstance($type);
  28.         //跳轉到授權頁面
  29.         redirect($sns->getRequestCodeURL());
  30.     }
  31.     //授權回調地址
  32.     public function callback($type = null, $code = null)
  33.     {
  34.         (empty($type) || empty($code)) && $this->error('參數錯誤');
  35.         //加載ThinkOauth類並實例化一個對象
  36.         $sns = ThinkOauth::getInstance($type);
  37.         //騰訊微博需傳遞的額外參數
  38.         $extend = null;
  39.         if ($type == 'tencent') {
  40.             $extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
  41.         }
  42.         //請妥善保管這裏獲取到的Token信息,方便以後API調用
  43.         //調用方法,實例化SDK對象的時候直接作爲構造函數的第二個參數傳入
  44.         //如: $qq = ThinkOauth::getInstance('qq', $token);
  45.         $token = $sns->getAccessToken($code, $extend);
  46.         //獲取當前登錄用戶信息
  47.         if (is_array($token)) {
  48.             $user_info = A('Type', 'Event')->$type($token);
  49.             echo("<h1>恭喜!使用 {$type} 用戶登錄成功</h1><br>");
  50.             echo("授權信息爲:<br>");
  51.             dump($token);
  52.             echo("當前登錄用戶信息爲:<br>");
  53.             dump($user_info);
  54.         }
  55.     }
  56. }
    複製

TypeEvent.class

  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LTHINK [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2015-2016 http://LTHINK.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 濤哥 <[email protected]>
  8. // +----------------------------------------------------------------------
  9. // TypeEvent.class.php 2015-12-02
  10. namespace User\Event;
  11. use LT\ThinkSDK\ThinkOauth;
  12. Header('Content-Type: text/html; charset=utf-8');
  13. class TypeEvent
  14. {
  15.     //登錄成功,獲取騰訊QQ用戶信息
  16.     public function qq($token)
  17.     {
  18.         $qq = ThinkOauth::getInstance('qq', $token);
  19.         $data = $qq->call('user/get_user_info');
  20.         if ($data['ret'] == 0) {
  21.             $userInfo['type'] = 'QQ';
  22.             $userInfo['name'] = $data['nickname'];
  23.             $userInfo['nick'] = $data['nickname'];
  24.             $userInfo['head'] = $data['figureurl_2'];
  25.             return $userInfo;
  26.         } else {
  27.             throw_exception("獲取騰訊QQ用戶信息失敗:{$data['msg']}");
  28.         }
  29.     }
  30.     //登錄成功,獲取騰訊微博用戶信息
  31.     public function tencent($token)
  32.     {
  33.         $tencent = ThinkOauth::getInstance('tencent', $token);
  34.         $data = $tencent->call('user/info');
  35.         if ($data['ret'] == 0) {
  36.             $userInfo['type'] = 'TENCENT';
  37.             $userInfo['name'] = $data['data']['name'];
  38.             $userInfo['nick'] = $data['data']['nick'];
  39.             $userInfo['head'] = $data['data']['head'];
  40.             return $userInfo;
  41.         } else {
  42.             throw_exception("獲取騰訊微博用戶信息失敗:{$data['msg']}");
  43.         }
  44.     }
  45.     //登錄成功,獲取新浪微博用戶信息
  46.     public function sina($token)
  47.     {
  48.         $sina = ThinkOauth::getInstance('sina', $token);
  49.         $data = $sina->call('users/show', "uid={$sina->openid()}");
  50.         if ($data['error_code'] == 0) {
  51.             $userInfo['type'] = 'SINA';
  52.             $userInfo['name'] = $data['name'];
  53.             $userInfo['nick'] = $data['screen_name'];
  54.             $userInfo['head'] = $data['avatar_large'];
  55.             return $userInfo;
  56.         } else {
  57.             throw_exception("獲取新浪微博用戶信息失敗:{$data['error']}");
  58.         }
  59.     }
  60.     //登錄成功,獲取網易微博用戶信息
  61.     public function t163($token)
  62.     {
  63.         $t163 = ThinkOauth::getInstance('t163', $token);
  64.         $data = $t163->call('users/show');
  65.         if ($data['error_code'] == 0) {
  66.             $userInfo['type'] = 'T163';
  67.             $userInfo['name'] = $data['name'];
  68.             $userInfo['nick'] = $data['screen_name'];
  69.             $userInfo['head'] = str_replace('w=48&h=48', 'w=180&h=180', $data['profile_image_url']);
  70.             return $userInfo;
  71.         } else {
  72.             throw_exception("獲取網易微博用戶信息失敗:{$data['error']}");
  73.         }
  74.     }
  75.     //登錄成功,獲取人人網用戶信息
  76.     public function renren($token)
  77.     {
  78.         $renren = ThinkOauth::getInstance('renren', $token);
  79.         $data = $renren->call('users.getInfo');
  80.         if (!isset($data['error_code'])) {
  81.             $userInfo['type'] = 'RENREN';
  82.             $userInfo['name'] = $data[0]['name'];
  83.             $userInfo['nick'] = $data[0]['name'];
  84.             $userInfo['head'] = $data[0]['headurl'];
  85.             return $userInfo;
  86.         } else {
  87.             throw_exception("獲取人人網用戶信息失敗:{$data['error_msg']}");
  88.         }
  89.     }
  90.     //登錄成功,獲取360用戶信息
  91.     public function x360($token)
  92.     {
  93.         $x360 = ThinkOauth::getInstance('x360', $token);
  94.         $data = $x360->call('user/me');
  95.         if ($data['error_code'] == 0) {
  96.             $userInfo['type'] = 'X360';
  97.             $userInfo['name'] = $data['name'];
  98.             $userInfo['nick'] = $data['name'];
  99.             $userInfo['head'] = $data['avatar'];
  100.             return $userInfo;
  101.         } else {
  102.             throw_exception("獲取360用戶信息失敗:{$data['error']}");
  103.         }
  104.     }
  105.     //登錄成功,獲取豆瓣用戶信息
  106.     public function douban($token)
  107.     {
  108.         $douban = ThinkOauth::getInstance('douban', $token);
  109.         $data = $douban->call('user/~me');
  110.         if (empty($data['code'])) {
  111.             $userInfo['type'] = 'DOUBAN';
  112.             $userInfo['name'] = $data['name'];
  113.             $userInfo['nick'] = $data['name'];
  114.             $userInfo['head'] = $data['avatar'];
  115.             return $userInfo;
  116.         } else {
  117.             throw_exception("獲取豆瓣用戶信息失敗:{$data['msg']}");
  118.         }
  119.     }
  120.     //登錄成功,獲取Github用戶信息
  121.     public function github($token)
  122.     {
  123.         $github = ThinkOauth::getInstance('github', $token);
  124.         $data = $github->call('user');
  125.         if (empty($data['code'])) {
  126.             $userInfo['type'] = 'GITHUB';
  127.             $userInfo['name'] = $data['login'];
  128.             $userInfo['nick'] = $data['name'];
  129.             $userInfo['head'] = $data['avatar_url'];
  130.             return $userInfo;
  131.         } else {
  132.             throw_exception("獲取Github用戶信息失敗:{$data}");
  133.         }
  134.     }
  135.     //登錄成功,獲取Google用戶信息
  136.     public function google($token)
  137.     {
  138.         $google = ThinkOauth::getInstance('google', $token);
  139.         $data = $google->call('userinfo');
  140.         if (!empty($data['id'])) {
  141.             $userInfo['type'] = 'GOOGLE';
  142.             $userInfo['name'] = $data['name'];
  143.             $userInfo['nick'] = $data['name'];
  144.             $userInfo['head'] = $data['picture'];
  145.             return $userInfo;
  146.         } else {
  147.             throw_exception("獲取Google用戶信息失敗:{$data}");
  148.         }
  149.     }
  150.     //登錄成功,獲取Google用戶信息
  151.     public function msn($token)
  152.     {
  153.         $msn = ThinkOauth::getInstance('msn', $token);
  154.         $data = $msn->call('me');
  155.         if (!empty($data['id'])) {
  156.             $userInfo['type'] = 'MSN';
  157.             $userInfo['name'] = $data['name'];
  158.             $userInfo['nick'] = $data['name'];
  159.             $userInfo['head'] = '微軟暫未提供頭像URL,請通過 me/picture 接口下載';
  160.             return $userInfo;
  161.         } else {
  162.             throw_exception("獲取msn用戶信息失敗:{$data}");
  163.         }
  164.     }
  165.     //登錄成功,獲取點點用戶信息
  166.     public function diandian($token)
  167.     {
  168.         $diandian = ThinkOauth::getInstance('diandian', $token);
  169.         $data = $diandian->call('user/info');
  170.         if (!empty($data['meta']['status']) && $data['meta']['status'] == 200) {
  171.             $userInfo['type'] = 'DIANDIAN';
  172.             $userInfo['name'] = $data['response']['name'];
  173.             $userInfo['nick'] = $data['response']['name'];
  174.             $userInfo['head'] = "https://api.diandian.com/v1/blog/{$data['response']['blogs'][0]['blogUuid']}/avatar/144";
  175.             return $userInfo;
  176.         } else {
  177.             throw_exception("獲取點點用戶信息失敗:{$data}");
  178.         }
  179.     }
  180.     //登錄成功,獲取淘寶網用戶信息
  181.     public function taobao($token)
  182.     {
  183.         $taobao = ThinkOauth::getInstance('taobao', $token);
  184.         $fields = 'user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info';
  185.         $data = $taobao->call('taobao.user.buyer.get', "fields={$fields}");
  186.         if (!empty($data['user_buyer_get_response']['user'])) {
  187.             $user = $data['user_buyer_get_response']['user'];
  188.             $userInfo['type'] = 'TAOBAO';
  189.             $userInfo['name'] = $user['user_id'];
  190.             $userInfo['nick'] = $user['nick'];
  191.             $userInfo['head'] = $user['avatar'];
  192.             return $userInfo;
  193.         } else {
  194.             throw_exception("獲取淘寶網用戶信息失敗:{$data['error_response']['msg']}");
  195.         }
  196.     }
  197.     //登錄成功,獲取百度用戶信息
  198.     public function baidu($token)
  199.     {
  200.         $baidu = ThinkOauth::getInstance('baidu', $token);
  201.         $data = $baidu->call('passport/users/getLoggedInUser');
  202.         if (!empty($data['uid'])) {
  203.             $userInfo['type'] = 'BAIDU';
  204.             $userInfo['name'] = $data['uid'];
  205.             $userInfo['nick'] = $data['uname'];
  206.             $userInfo['head'] = "http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']}";
  207.             return $userInfo;
  208.         } else {
  209.             throw_exception("獲取百度用戶信息失敗:{$data['error_msg']}");
  210.         }
  211.     }
  212.     //登錄成功,獲取開心網用戶信息
  213.     public function kaixin($token)
  214.     {
  215.         $kaixin = ThinkOauth::getInstance('kaixin', $token);
  216.         $data = $kaixin->call('users/me');
  217.         if (!empty($data['uid'])) {
  218.             $userInfo['type'] = 'KAIXIN';
  219.             $userInfo['name'] = $data['uid'];
  220.             $userInfo['nick'] = $data['name'];
  221.             $userInfo['head'] = $data['logo50'];
  222.             return $userInfo;
  223.         } else {
  224.             throw_exception("獲取開心網用戶信息失敗:{$data['error']}");
  225.         }
  226.     }
  227.     //登錄成功,獲取搜狐用戶信息
  228.     public function sohu($token)
  229.     {
  230.         $sohu = ThinkOauth::getInstance('sohu', $token);
  231.         $data = $sohu->call('i/prv/1/user/get-basic-info');
  232.         if ('success' == $data['message'] && !empty($data['data'])) {
  233.             $userInfo['type'] = 'SOHU';
  234.             $userInfo['name'] = $data['data']['open_id'];
  235.             $userInfo['nick'] = $data['data']['nick'];
  236.             $userInfo['head'] = $data['data']['icon'];
  237.             return $userInfo;
  238.         } else {
  239.             throw_exception("獲取搜狐用戶信息失敗:{$data['message']}");
  240.         }
  241.     }
  242. }
    複製

使用方式:
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']);
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章