OAuth 第三方登录

统一实现了多种第三方登录,并整合成相同的OAuth公开接口方便统一调用
目前仅实现了部分SDK,有些SDK还没验证结束

支持的登录

类名介绍状态
QqQQ登录已验证
Sina微博登录已验证
Wechat微信公众平台登录未验证
Aliyun阿里云未验证
Alipay支付宝未验证
GithubGithub未验证
Gitee码云未验证
Google谷歌未验证
Facebook脸书未验证
NaverNaver未验证
TwitterTwitter未验证
LineLine未验证
Douyin抖音 Douyin 、 头条 toutiao 、西瓜 xigua未验证
Baidu百度未验证

 

QQ 登录

需要开通 unionid接口
接口名称接口介绍API状态
登录使用QQ登录应用get_user_info已获取
unionid平台统一ID信息getUnionId已获取

公开接口

 

引入命名空间

use zxf\Login\OAuth;

1、 初始化实例类

// 实例化方式一:
$oauth = OAuth::Sina(?array $config=[]);
$oauth = OAuth::Qq(?array $config=[]);

// 实例化方式二:
$name = 'qq';
/** @var $oauth \zxf\Login\Contracts\Gateway */
$oauth = OAuth::$name(?array $config=[]);

// 实例化方式三:
$oauth = new \zxf\Login\Gateways\Qq(?array $config=[]);

2、 可选:需要强制验证回跳地址中的state参数

提示:为了不暴露参数信息,内部会自动生成和处理state参数
可以传入一个参数,例如字符串或者数组,在回调中进行自定义业务逻辑处理
// $data 为空时内部会默认生成一个值
// 传入$data数据后可以在回调中获取到
$oauth->mustCheckState(string|array $data=''); // 如需手动验证state,请关闭此行

// 微博、微信:特别指定用于手机端登录【正常情况下不设置】,则需要设定->setDisplay('mobile')

3、 得到授权跳转地址

$url = $oauth->getRedirectUrl();

4、重定向到外部第三方授权地址

// 各个框架差异,请自行参考框架文档

// Laravel
return redirect()->away($url);
// ThinkPHP
$this->redirect($url);

5、可选:回调时验证 state 并返回之前传入的参数$data

$data = $oauth->mustCheckState()->checkState(); // 如需手动验证state,请关闭此行

6、获取第三方用户信息

$userInfo = $oauth->userInfo(); // 【推荐】处理后的用户信息
// OR
$userInfo = $oauth->getUserInfo(); // 第三方返回的原始用户信息

OAuth 公共方法

// 得到跳转地址
public function getRedirectUrl();

// 获取当前授权用户的openid标识
public function openid();

// 【推荐】获取格式化后的用户信息
public function userInfo();

// 获取原始接口返回的用户信息
public function getUserInfo();

示例

<?php

namespace xxx;

use Exception;
use zxf\Login\Constants\ConstCode;
use zxf\Login\OAuth;

/**
 * QQ 互联登录
 */
class Connect
{
    /**
     * qq登录
     *
     * 可以在url 中传入 参数 callback_url 用来做通知回调 ; 例如
     * xxx.com/callback/tencent/login?callback_url=http%3A%2F%2Fwww.a.com%2Fa%2Fb%2Fc%3Fd%3D123 callback_url 参数说明
     * 传入前需要做 urlencode($callback_url) 操作 callback_url 回调地址要求允许跨域或者 csrf
     */
    public function login()
    {
        try {
            // 1、 初始化实例类
            // 实例化方式一:
            $oauth = OAuth::Qq();
            // OR 实例化方式二:
            // $oauth = new Qq($config);

            $jump_url = request()->get('callback_url', '');
            $jumpUrl = $jump_url ? urldecode($jump_url) : '';

            // 2、 可选:强制验证回跳地址中的state参数
            // 参数为空时内部会默认一个值
            $oauth->mustCheckState($jumpUrl); // 如需手动验证state,请关闭此行

            // 微博、微信:特别指定用于手机端登录【正常情况下不设置】,则需要设定->setDisplay('mobile')

            // 3、 得到授权跳转地址
            $url = $oauth->getRedirectUrl();

            // 4、重定向到外部授权地址
            return redirect()->away($url);
        } catch (Exception $e) {
            // 错误处理...
        }
    }

    /**
     * 回调&通知
     */
    public function callback()
    {
        try {
            /** 1、初始化实例类 */
            $oauth = OAuth::Qq();

            /** 2、可选:手动验证state 并返回跳转前传入的参数 */
            $callbackUrl = $oauth->mustCheckState()->checkState(); // 如需手动验证state,请关闭此行

            /** 3、获取第三方用户信息 */
            $userInfo = $oauth->userInfo(); // 【推荐】处理后的用户信息
            // OR
            // $userInfo = $oauth->getUserInfo(); // 原始用户信息

            /**
             * 如果是App登录
             * $type = "applets";
             * $userInfo = OAuth::$name($this->config)->setType($type)->userInfo();
             */
            /**
             * 如果是App登录
             * $type = "applets";
             * $userInfo = OAuth::$name($this->config)->setType($type)->userInfo();
             */

            // 获取登录类型
            // $userInfo['type'] = ConstCode::getTypeConst($userInfo['channel']);

            // 记录用户信息
            // 其他逻辑...
        } catch (Exception $e) {
            // 错误处理...
        }
    }

}