php的laravel框架快速集成微信登录的方法


Posted in PHP onDecember 12, 2016

本文面向的是php语言laravel框架的用户,介绍的是基于该框架实现的一个简易集成微信登录的方法。使用方法如下:

1. 安装php_weixin_provider

在项目下运行composer require thirdproviders/weixin,即可完成安装。安装成功后,在项目的vendor目录下应该能看到php_weixin_provider的库文件:

php的laravel框架快速集成微信登录的方法

2. 配置微信登录的参数

一共有7个参数可以配置,分别是:

  • client_id:对应公众号创建的应用appid
  • client_secret:对应公众号创建的应用appid
  • redirect:对应微信授权成功后的回调地址
  • proxy_url:对应微信授权的代理服务地址(其作用可阅读这篇文章了解)
  • device:区别是PC端微信登录还是移动端微信登录,默认值为pc,如果是移动端,可设置为空
  • state_cookie_name:授权链接中会包含随机的state参数,这个参数在微信回调的时候会原封不动的返回来,届时可通过验证state参数是否与授权链接中传入的参数相同,来判断请求是否有效,防止CSRF攻击。这个方案,会在授权时把state参数先存到cookie里面,所以这个参数用来指定这个state参数存入的cookie名称,默认值是wx_state_cookie
  • state_cookie_time:指定wx_state_cookie的有效时长,默认是5分钟
  • 这七个参数有2种设置方式。

第一种是把这些参数以大写的形式配置到.env配置文件里面:

php的laravel框架快速集成微信登录的方法

注:1、每个配置项都是大写,且以WEIXIN_开头;2、前三个配置项与前面介绍的参数名称不完全一致,KEY对应client_id,SECRET对应client_secret,REDIRECT_URI对应redirect;3、其它的与前面介绍的参数名称一致。

第二种是把这些参数配置到config/services.php文件里面去:

php的laravel框架快速集成微信登录的方法

这种方式的配置,每个配置项的名称与前面介绍的一致。

要注意的内容:

由于php_weixin_provider是基于laravel/socialite实现的,它要求必须配置client_id,client_secret和redirect,否则php_weixin_provider实例化过程就会出错;对于client_id和client_secret,我认为统一配置在一个地方是没有问题的,但是对于redirect,如果统一配置,不一定符合所有场景的需求,因为不是每一个用到微信登录的地方,最后的回调地址都是同一个;所以建议把redirect先配置成一个有效或无效非空的回调地址;反正在后面使用php_weixin_provider的时候还可以在调用的时候更改这个参数的值。

proxy_url如果有,也建议配置在公共的地方;

state_cookie_name和state_cookie_time由于都有默认值,基本上无需重新配置;
device可以在使用的时候再指定。

所有配置参数都可以在使用的时候重新指定。

3. 注册php_weixin_provider

在项目的config/app.php文件里面,找到providers配置节,把如下代码加到它的配置数组里面:

php的laravel框架快速集成微信登录的方法

4. 注册第三方登录事件的监听

在项目的app/Providers/EventServiceProvider.php里面加入以下代码:

php的laravel框架快速集成微信登录的方法

laravel框架整体上是一种IOC跟事件驱动的思想,熟悉js就会对事件驱动非常熟悉,熟悉设计模式,就会对IOC(控制反转,也称为DI:依赖注入)比较熟悉,这个是理解第3步和第4步配置作用的关键。

5. 编写微信登录的接口

举例如下:

//采用代理跳转,从PC端微信登录
Route::get('/login', function () {
 return Socialite::with('weixin')
  ->setProxyUrl('http://proxy.your.com')
  ->setRedirectUrl(url('/login/notify'))
  ->redirect();
});
//采用代理跳转,从手机端微信登录
Route::get('/login2', function () {
 return Socialite::with('weixin')
  ->setProxyUrl('http://proxy.your.com')
  ->setDevice('')
  ->setRedirectUrl(url('/login/notify'))
  ->redirect();
});
//不采用代理跳转,从PC端微信登录
Route::get('/login', function () {
 return Socialite::with('weixin')
  ->setRedirectUrl(url('/login/notify'))
  ->redirect();
});
//不采用代理跳转,从手机端微信登录
Route::get('/login4', function () {
 return Socialite::with('weixin')
  ->setDevice('')
  ->setRedirectUrl(url('/login/notify'))
  ->redirect();
});

Socialite::with('weixin')会返回php_weixin_provider的实例,也就是它:

php的laravel框架快速集成微信登录的方法

拿到这个实例之后,就可以采用链式的方式调用它提供的所有public方法,比如设置配置参数,setDevice等等。

6. 编写微信登录回调的接口

举例如下:

//登录回调
Route::get('/login/notify', function () {
 $user = null;
 try {
  $user = Socialite::with('weixin')->user();
 } catch(\Exception $e) {
  return '获取微信用户异常';
 }
 return $user->nickname;
});

通过Socialite::with('weixin')拿到php_weixin_provider实例后,调用user方法,就会自动跟微信调用相关接口,并把微信的返回值封装成对象返回。如果在此过程中,有任何错误都会以异常的形式抛出,比如state参数校验失败,比如code失效等。

返回的$user对象包含的有效属性有:

php的laravel框架快速集成微信登录的方法

小结:

这个方案是基于laravel/socialite实现,并发布到composer来使用的。laravel/socialite是laravel官方提供的第三方登录的模块,基于它可以很方便的集成大部分第三方平台的认证,目前它官方已经提供很多第三方的登录实现:https://socialiteproviders.github.io/。除了国外的facebook,google,github等,国内的微信,微博,qq也都有提供。我在一开始也用的是它官方提供的默认的微信登录provider来做的,但是后来我发现了以下几个问题:

1. 不支持微信授权的代理;

2. pc端跟移动端竟然还是分两个项目来做的:

php的laravel框架快速集成微信登录的方法

3. 它封装的user对象里竟然不包含unionid

4. 更改配置参数的方式,实在是让人觉得难以使用:

php的laravel框架快速集成微信登录的方法

所以我就在它官方的微信登录provider基础上,按照自己的想法,重新实现了一个来解决我发现的这些问题。

PHP 相关文章推荐
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
php 归并排序 数组交集
May 10 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
php实现无限级分类(递归方法)
Aug 06 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 #PHP
php+ajax+json 详解及实例代码
Dec 12 #PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 #PHP
Zend Framework数据库操作方法实例总结
Dec 11 #PHP
smarty模板数学运算示例
Dec 11 #PHP
Zend Framework入门应用实例详解
Dec 11 #PHP
Zend Framework前端控制器用法示例
Dec 11 #PHP
You might like
用PHP实现小型站点广告管理(修正版)
2006/10/09 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python模块restful使用方法实例
2013/12/10 Python
Python实现的检测网站挂马程序
2014/11/30 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
初学者学习Python好还是Java好
2020/05/26 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
母亲节感恩活动记录
2014/03/16 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
三峡人家导游词
2015/01/31 职场文书
工商局调档介绍信
2015/10/22 职场文书