400 0867 457

NEWS/新闻

分享你我感悟

您当前位置> 主页 > 新闻 > 技术开发

Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录

发表时间:2025-12-25 00:00:00

文章作者:裘德小鎮的故事

浏览次数:

Laravel通过Socialite及社区扩展包实现微信、QQ、微博登录,需安装laravel/socialite和对应平台包,配置服务信息、环境变量并注册事件监听,再创建控制器处理授权流程与回调,最后定义路由和前端按钮即可完成集成。

Laravel 提供了非常优雅的方式来实现第三方登录,其中 Laravel Socialite 是官方推荐的扩展包,支持 OAuth1 和 OAuth2 协议的平台,如微信、QQ、微博等主流社交平台。虽然 Socialite 原生主要支持 GitHub、Google、Facebook 等国际平台,但通过社区扩展包可以轻松集成微信、QQ、微博等国内服务。

安装 Laravel Socialite

在 Laravel 项目根目录下运行以下命令安装 Socialite:

composer require laravel/socialite

如果你使用的是 Laravel 8 及以下版本,还需要手动注册服务提供者和门面(Laravel 9+ 已自动注册):

  • config/app.php 中添加服务提供者:
'providers' => [
    // ...
    Laravel\Socialite\SocialiteServiceProvider::class,
]
  • 添加门面别名:
'aliases' => [
    // ...
    'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]

安装支持国内平台的扩展包

Socialite 原生不支持微信、QQ、微博,需借助社区维护的扩展包:

  • 微信登录:使用 overtrue/laravel-socialitesocialiteproviders/weixin
  • QQ 登录:使用 socialiteproviders/qq
  • 微博登录:使用 socialiteproviders/weibo

socialiteproviders 系列为例如下:

composer require socialiteproviders/weixin
composer require socialiteproviders/qq
composer require socialiteproviders/weibo

配置第三方应用信息

前往各平台开发者中心创建应用,获取 Client ID (App ID)Client Secret (App Key),并设置回调地址(如:http://your-domain.com/login/weixin/callback)。

将配置写入 config/services.php

'weixin' => [
    'client_id' => env('WEIXIN_APP_ID'),
    'client_secret' => env('WEIXIN_APP_SECRET'),
    'redirect' => env('WEIXIN_REDIRECT_URI'),
],

'qq' => [
    'client_id' => env('QQ_APP_ID'),
    'client_secret' => env('QQ_APP_SECRET'),
    'redirect' => env('QQ_REDIRECT_URI'),
],

'weibo' => [
    'client_id' => env('WEIBO_APP_ID'),
    'client_secret' => env('WEIBO_APP_SECRET'),
    'redirect' => env('WEIBO_REDIRECT_URI'),
],

然后在 .env 文件中添加对应变量:

WEIXIN_APP_ID=your_weixin_appid
WEIXIN_APP_SECRET=your_weixin_secret
WEIXIN_REDIRECT_URI=http://localhost/login/weixin/callback

QQ_APP_ID=your_qq_appid
QQ_APP_SECRET=your_qq_secret
QQ_REDIRECT_URI=http://localhost/login/qq/callback

WEIBO_APP_ID=your_weibo_appid
WEIBO_APP_SECRET=your_weibo_secret
WEIBO_REDIRECT_URI=http://localhost/login/weibo/callback

启用 SocialiteProviders 事件监听

EventServiceProvider 中注册事件,确保扩展驱动被加载:

  • 打开 app/Providers/EventServiceProvider.php
  • 添加以下事件监听:
protected $listen = [
    \SocialiteProviders\Manager\SocialiteWasCalled::class => [
        \SocialiteProviders\Weixin\WeixinExtendSocialite::class,
        \SocialiteProviders\QQ\QqExtendSocialite::class,
        \SocialiteProviders\Weibo\WeiboExtendSocialite::class,
    ],
];

编写控制器处理登录流程

创建一个控制器来处理跳转授权和回调:

php artisan make:controller SocialAuthController

示例代码:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;
use Exception;

class SocialAuthController extends Controller
{
    // 微信登录重定向
    public function redirectToWeixin()
    {
        return Socialite::driver('weixin')->redirect();
    }

    // 微信回调处理
    public function handleWeixinCallback()
    {
        try {
            $user = Socialite::driver('weixin')->user();
        } catch (Exception $e) {
            return redirect('/login')->withErrors(['error' => '微信登录失败']);
        }

        // 获取用户信息后,执行登录或注册逻辑
        $this->loginOrRegister($user, 'weixin');
        return redirect()->intended('/home');
    }

    // QQ 登录
    public function redirectToQQ()
    {
        return Socialite::driver('qq')->redirect();
    }

    public function handleQQCallback()
    {
        $user = Socialite::driver('qq')->user();
        $this->loginOrRegister($user, 'qq');
        return redirect()->intended('/home');
    }

    // 微博登录
    public function redirectToWeibo()
    {
        return Socialite::driver('weibo')->redirect();
    }

    public function handleWeiboCallback()
    {
        $user = Socialite::driver('weibo')->user();
        $this->loginOrRegister($user, 'weibo');
        return redirect()->intended('/home');
    }

    // 统一登录/注册逻辑
    protected function loginOrRegister($socialUser, $provider)
    {
        // 示例:根据 provider 和 openid 查找用户
        $user = User::where('provider', $provider)
                    ->where('provider_id', $socialUser->getId())
                    ->first();

        if (!$user) {
            // 创建新用户
            $user = User::create([
                'name' => $socialUser->getNickname(),
                'avatar' => $socialUser->getAvatar(),
                'provider' => $provider,
                'provider_id' => $socialUser->getId(),
                'email' => $socialUser->getEmail() ?? uniqid(). '@example.com',
            ]);
        }

        auth()->login($user);
    }
}

定义路由

routes/web.php 中添加路由:

Route::get('/login/weixin', [SocialAuthController::class, 'redirectToWeixin'])->name('login.weixin');
Route::get('/login/weixin/callback', [SocialAuthController::class, 'handleWeixinCallback']);

Route::get('/login/qq', [SocialAuthController::class, 'redirectToQQ'])->name('login.qq');
Route::get('/login/qq/callback', [SocialAuthController::class, 'handleQQCallback']);

Route::get('/login/weibo', [SocialAuthController::class, 'redirectToWeibo'])->name('login.weibo');
Route::get('/login/weibo/callback', [SocialAuthController::class, 'handleWeiboCallback']);

前端添加登录按钮

在登录页面添加链接:

微信登录
QQ 登录
微博登录

基本上就这些。只要配置正确,用户点击按钮即可跳转到对应平台授权,回调后完成登录。注意线上环境必须使用 HTTPS,否则部分平台(如微信)会拒绝回调。

相关案例查看更多