zoukankan      html  css  js  c++  java
  • thinkphp 3.23 第三方登录sdk集成包

    本集成包在官方包上扩展了支付宝登录和微信,支持最新的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: 涛哥 <liangtao.gz@foxmail.com>
    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: 涛哥 <liangtao.gz@foxmail.com>
    8. // +----------------------------------------------------------------------
    9. // IndexAction.class.php 2013-02-25
    10. namespace UserController;
    11. use ThinkController;
    12. use LTThinkSDKThinkOauth;
    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: 涛哥 <liangtao.gz@foxmail.com>
    8. // +----------------------------------------------------------------------
    9. // TypeEvent.class.php 2015-12-02
    10. namespace UserEvent;
    11. use LTThinkSDKThinkOauth;
    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 LTThinkSDKThinkOauth;
    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']);
    }
    }


  • 相关阅读:
    十分钟内学会:将HTML格式化为合法的XML
    十分钟内学会:根据数据库生成站点导航
    Adobe Apollo vs Joyeur Slingshot
    英语阅读推荐:你真的懂UPDATE语句吗 & 当有layout之时
    欲练 CSS ,必先宫 IE
    英语阅读推荐:海明威写作技巧 & UpdatePanel为何失灵
    英语阅读推荐:在AJAX中制作自定义验证服务 & 优秀网站的5个因素
    Code is Configuration
    十分钟内学会:自动识别GB2312与UTF8编码的文件
    学习 Ruby on Rails 真的很爽!
  • 原文地址:https://www.cnblogs.com/ZDPPU/p/5823812.html
Copyright © 2011-2022 走看看