Laravel5.1 实现第三方登录认证教程之 - 微信登录

前言

近期开发了 PHPHub 的网站应用微信登录,因此编写此文记录开发的过程,希望能帮助到有同样需求的同学。

文章概览

  1. 准备工作;
  2. 集成 Package;
  3. 代码调用。

接下来是详细解说。

准备工作

首先到微信开放平台申请相关的 网站应用,用以获取接口所需的 AppID 和 AppSecret。

一般来说需要花费 3 - 5 个工作日。

file

集成 Package

我们使用 laravel/socialite 扩展包来进行 OAuth 认证,它提供了完整且上手毫无难度的 OAuth 解决方案。

在此基础上使用其 Driver 扩展 socialiteProviders/weixin 来完成微信的 OAuth 认证流程。

1. 安装 laravel/socialite

如果你已经安装过此 Package,则可以跳过此步骤。

1). 直接运行以下命令安装扩展包

composer require laravel/socialite

2). 在你的 config/app.php 文件中添加以下配置信息

'providers' => [
    ...
    // 注意:下文中要集成 Socialite Driver 扩展,因此将会删除此行配置。
    Laravel\Socialite\SocialiteServiceProvider::class,
],

'aliases' => [
    ...
    'Socialite' => Laravel\Socialite\Facades\Socialite::class,
],

2. 安装 socialiteProviders/weixin

1). 直接运行以下命令安装扩展包

composer require socialiteproviders/weixin

2). 在你的 config/app.php 文件中添加以下配置信息

'providers' => [
    ...
    # 注意:如果你之前已经安装了 laravel/socialite,则务必删除掉下面的配置
    // 删除这行配置 Laravel\Socialite\SocialiteServiceProvider::class,

    # 新增配置
     \SocialiteProviders\Manager\ServiceProvider::class,
],

3). 在你的 app/Providers/EventServiceProvider.php 文件中添加以下事件处理器

protected $listen = [
    \SocialiteProviders\Manager\SocialiteWasCalled::class => [
        'SocialiteProviders\Weixin\WeixinExtendSocialite@handle',
    ],
];

3. 添加配置

1). 在你的 .env 文件中添加以下配置

WEIXIN_KEY=你的AppID
WEIXIN_SECRET=你的AppSecret
WEIXIN_REDIRECT_URI=你的回调地址

# 例如
WEIXIN_KEY=wxba52fab0726b9023
WEIXIN_SECRET=xxxxxxxxxxxxxxxxxx
WEIXIN_REDIRECT_URI=https://laravel-china.org/auth/callback?driver=wechat

2). 在你的 config/services.php 文件中添加以下配置

'weixin' => [
   'client_id'     => env('WEIXIN_KEY'),
   'client_secret' => env('WEIXIN_SECRET'),
   'redirect'      => env('WEIXIN_REDIRECT_URI'),

   # 这一行配置非常重要,必须要写成这个地址。
   'auth_base_uri' => 'https://open.weixin.qq.com/connect/qrconnect',
],

至此,安装全部完成。

代码调用

准备工作都完成以后,现在就到了接口对接阶段。

1). 添加路由

# 用户点击登录按钮时请求的地址
Route::get('/auth/oauth', 'Auth\AuthController@oauth');

# 微信接口回调地址
Route::get('/auth/callback', 'Auth\AuthController@callback');

2). 在你的 app/Http/Controllers/Auth/AuthController.php 文件里添加以下方法

# 用户点击微信登录按钮后,调用此方法请求微信接口
public function oauth(Request $request)
{
    return \Socialite::with('weixin')->redirect();
}

# 微信的回调地址
public function callback(Request $request)
{
    $oauthUser = \Socialite::with('weixin')->user();

    // 在这里可以获取到用户在微信的资料
    dd($oauthUser);

    // 接下来处理相关的业务逻辑

    ...

}

下图是打印 oauthUser 的结果,供大家参考

file

至此,已经能获取到用户的微信资料了,接下来你们就可以根据此数据处理自己的相关业务逻辑了。

在这里值得一提的是,我们通过微信的 unionid 来记录用户的信息,而不是 openid。因为针对一个微信开放平台帐号下的应用,同一用户的 unionid 是相同的,这样方便我们以后做多站点的用户数据统一。

附录

网站应用微信登录开发指南

本帖已被设为精华帖!
本帖由 Summer 于 4年前 加精
monkey
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 23

:+1: monkey 变鹰眼了

4年前 评论
Summer

百步穿杨,百步穿杨 :clap::clap::clap:

4年前 评论

啊噢,感谢分享,好像github登陆也是用的这个包

4年前 评论

:cold_sweat: 我的github账号在github上被封了,求开启

4年前 评论
monkey

@不知火舞 你的 GitHub 账号如果被封了,那应该找 GitHub 解封哦~

4年前 评论
monkey

@mcxzyang GitHub 登录用的是 laravel/socialite,这个 Package 的 Readme 已经很详细的介绍了如何集成 GitHub 登录,因此我就不专门写教程了 :smile:

4年前 评论
Alex89

微信登录挺方便,Github 太慢了

4年前 评论

@monkey 不是啊,我的github账号在phphub上被封了

4年前 评论

还可以通过微信带参数二维码来扫码登录,这样就可以免去一次跳转

4年前 评论

求助
$oauthUser = \Socialite::with('weixin')->user();当程序运行到这行的时候报 InvalidStateException in AbstractProvider.php line 32:

4年前 评论

请问一下大神,我自己做了一个 API 接口,然后在另一个网站作为第三方调用该接口,获取到用户信息并登陆。当我退出登录后,再次以该接口登录,又需要重新进行授权,生成另外一个 access_token。这显然是有问题的,我用 Github 第三方登录就不需要每次都授权。我想问下,出现这种问题是我的 API 接口的问题,还是我接口对接的问题?

4年前 评论

Auth\AuthController 控制器中需要写命名空间吗?

Class SocialiteProviders\Weixin\WeixinExtendSocialite does not exist
4年前 评论
沈益飞

SocialiteProviders/Weixin 这个这个包有问题了,在外面设置 auth_base_uri 无效,需要直接修改文件里面的。scope 也需要修改

3年前 评论

@沈益飞 scope怎么修改啊?

3年前 评论
沈益飞

@streetlamp 看一下源码,里面可以修改的。

3年前 评论
xin6841414

InvalidArgumentException in Manager.php line 90:
Driver [Weixin] not supported. 按楼主教程走, 最后调用提示这个,知道的告知下,谢谢

2年前 评论
xin6841414

上面问题已处理, 楼主
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
'SocialiteProviders\Weixin\WeixinExtendSocialite@handle',
],
这一步,改为
‘SocialiteProviders\Manager\SocialiteWasCalled‘ => [
'SocialiteProviders\Weixin\WeixinExtendSocialite@handle',
],
问题解决, 不晓得什么原因,知道的小伙伴解释下!

2年前 评论

Class 'Socialite' not found ??

7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!