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调用mysql存储过程
Feb 14 PHP
php下几个常用的去空、分组、调试数组函数
Feb 22 PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 PHP
PHP中CURL方法curl_setopt()函数的参数分享
Jan 19 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
PHP字符串word末字符实现大小写互换的方法
Nov 10 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
YII框架批量插入数据的方法
Mar 18 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
Protoss建筑一览
2020/03/14 星际争霸
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
Python实现一个简单的MySQL类
2015/01/07 Python
Python算术运算符实例详解
2017/05/31 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
python3.x上post发送json数据
2018/03/04 Python
Python反转序列的方法实例分析
2018/03/21 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
《1942》观后感
2015/06/08 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
利用 JavaScript 构建命令行应用
2021/11/17 Javascript