laravel5实现微信第三方登录功能


Posted in PHP onDecember 06, 2018

背景

最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4。

实现过程以微信网页版第三方登录,其他于此类似,在此不做重复。

准备工作

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。
在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

总结下来就是:

1.进入微信开放平台注册开发者账号
2.根据项目类型创建应用,再此我创建的是网站应用.
3.接入微信登陆功能,让用户可使用微信登录你的网站应用
4.获得AppID和AppSectet

到此微信第三方登录的准备工作就完成了。

授权流程说明

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

laravel5实现微信第三方登录功能

在框架中实现(laravel)

Laravel Socialite简介

除了传统的基于表单的登录认证外,Laravel 还可以通过Laravel Socialite 提供 OAuth 认证,目前支持的认证驱动包括 Facebook、Twitter、Google、LinkedIn、GitHub 和 Bitbucket。

安装相关依赖

composer require laravel/socialite

安装weixin-web

composer require socialiteproviders/weixin-web

注意网站实现微信登录需要的依赖包为socialiteproviders/weixin-web,如果是手机端App那么可以用socialiteproviders/weixin。

shanlei@shanlei-Lenovo-ideapad-110-15ISK:/var/www/html/zslm_back$ composer search socialiteproviders/weixin
socialiteproviders/weixin Weixin OAuth2 Provider for Laravel Socialite
socialiteproviders/weixin-web Weixin-Web OAuth2 Provider for Laravel Socialite
socialiteproviders/weixin-web Weixin-Web OAuth2 Provider for Laravel Socialite
socialiteproviders/weixin Weixin OAuth2 Provider for Laravel Socialite

相关配置

1. 设置app/config.php

添加providers:

'providers' => [
SocialiteProviders\Manager\ServiceProvider::class,
],

添加aliases:

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

2. 配置config/services.php

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

3. 设置app/Providers/EventServiceProvider.php

添加事件监听

use SocialiteProviders\Manager\SocialiteWasCalled;
 protected $listen = [
 'SocialiteProviders\Manager\SocialiteWasCalled' => [
  'SocialiteProviders\WeixinWeb\WeixinWebExtendSocialite@handle',
 ],
 ];

4. 添加路由

Route::get('auth/weixin', 'Auto\ThirdLogin\WeixinController@redirectToProvider');
Route::get('auth/weixin/callback','Auto\ThirdLogin\WeixinController@handleProviderCallback');

5. 编写WeixinController

<?php
/**
 * Created by PhpStorm.
 * User: shanlei
 * Date: 1/6/2017
 * Time: 11:34 AM
 */

namespace App\Http\Controllers\Auto\ThirdLogin;

use Socialite;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use SocialiteProviders\WeixinWeb\Provider;

class WeixinController extends Controller{
 public function redirectToProvider(Request $request)
 { 
 return Socialite::with('weixinweb')->redirect();
 }
 public function handleProviderCallback(Request $request)
 {
 $user_data = Socialite::with('weixinweb')->stateless()->user();
 dd($user_data);
 }
}

访问auth/weixin,获得返回数据。

laravel5实现微信第三方登录功能

常见错误

1. 微信授权回调域不符(redirect_uri不符),参见下面规范:​

laravel5实现微信第三方登录功能

2. 执行过程中出现一下错误:

exception 'Laravel\Socialite\Two\InvalidStateException'
in /example/vendor/laravel/socialite/src/Two/AbstractProvider.php:161

解决:

通过stateless()方法禁止会话状态验证

Socialite::driver('weixinweb')->stateless()->user()

总结

以上所述是小编给大家介绍的laravel5实现微信第三方登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php下实现农历日历的代码
Mar 07 PHP
基于PHP文件操作的详细诠释
Jun 21 PHP
php对数组排序代码分享
Feb 24 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
Dec 09 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
浅谈php调用python文件
Mar 29 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
PHP实现简单计算器小程序
Aug 28 #PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 #PHP
php实现算术验证码功能
Dec 05 #PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 05 #PHP
Yii支持多域名cors原理的实现
Dec 05 #PHP
php判断电子邮件是否正确方法
Dec 04 #PHP
浅谈Laravel核心解读之Console内核
Dec 02 #PHP
You might like
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
如何利用PHP执行.SQL文件
2013/07/05 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP扩展开发入门教程
2015/02/26 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
python实现定时播放mp3
2015/03/29 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
拆迁委托协议书
2014/09/15 职场文书
军事博物馆观后感
2015/06/05 职场文书
少年雷锋观后感
2015/06/10 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis