18910140161

Laravel + laravel-echo + EasyWeChat 实现微信扫码登录

顺晟科技

2021-06-16 10:40:14

653

扫描代码登录已经成为一种越来越流行的登录方式,安全性高。同时,也让我们从大量记忆账户密码、手工输入的繁琐过程中解脱出来。有些平台甚至不用账号就可以扫描代码登录,省去注册的麻烦。

对于访问微信开放平台的微信官方账号应用来说,实现扫码登录还是挺容易的。在easy微信SDK的加持下,按下公文即可快速完成。不过,本文要讨论的是另一种情况。有时候因为某些原因,你的微信官方账号无法访问开放平台,但你想扫描微信代码登录。在这种情况下,你不能改变官方的套路。但只要我们做一些改变,就能实现这个需求。

#基本想法:

登录页面显示微信二维码(easy微信SDK创建,短命临时二维码)

用户扫码后将消息推送至服务器界面,界面根据业务情况进行判断处理,符合条件时触发微信可登录事件

微信可以登录事件实现了ShouldBroadcast接口,所以当它被触发时,也会广播到指定的频道

前端laravel-echo监控并处理通道中用户扫描码登录的消息

下面介绍具体实现,先展示渲染。

屏幕上显示程序运行的图片

#具体实施

有了这篇文章,我创建了一个简单的示例项目,可以和源代码一起克隆,效果更好。项目地址:https://github.com/tianyong90/laravel-qrcode-login

当然,件事是创建Laravel项目,同时安装前端和后端的依赖项

前端主要依靠laravel-echo和socket.io-client

事件广播的前端监控是关键,我们需要一个websocket服务器。Laravel官方文档在介绍消息广播时提到了Pusher和laravel-echo-server。因为我用laradock作为开发环境,它内置了laravel-echo-server容器,非常方便,所以我决定直接使用。其实也可以使用Pusher服务,所以需要安装pusher.js而不是socket.io-client,在中修改相关配置。同时env

配置项目

主要是配置数据库和redis连接,然后将BROADCAST_DRIVER设置为redis(这个很重要,如果使用pusher,需要修改为pusher)

如果QUEUE_CONNECTION设置为redis,请记住启动queue worker。

要启动语音应答服务器

因为使用了laradock,所以启动时只需要带laravel-echo-server参数,输入laradock目录

docker-compose up-d nginx PHP-worker nginx MySQL redis laravel-echo-server

创建微信登录事件

php artisan make:event微信登录

类微信可以登录实现ShouldBroadcast

{

使用可分派的、交互的套接字、序列化模型;

public $ token

/**

*创建新的事件实例。

*

* @ param $标记

*/

public function _ _ construct($ token)

{

$ this-token=$ token;

}

/**

*获取该活动应该播放的频道。

*

* @返回\照明\广播\频道|阵列

*/

公共函数broadcastOn()

{

返回新频道(“扫描-登录”);

}

}

最重要的是,事件应该实现ShouldBroadcast接口,并在broadcastOn方法中指定要广播的频道。微信可登录的公共属性令牌自动包含在广播数据中。

对接微信消息服务器

laravel-微信的配置和对接请阅读易微信SDK官方文档。

接收扫码消息并进行相关处理。

公共功能服务()

{

$app=app('微信. official _ account ');

$app-server-push(函数($message) {

if($ message[' Event ']==' SCAN '){

$ OpenID=$ message[' FromUserName '];

$ user=user : where(' open id ',$ open id)-first();

if ($user) {

//TODO:根据这里的情况添加其他认证逻辑

//使用laravel-passport的个人访问令牌

$ token=$ user-create token($ user-name)-access token;

//广播扫描码登录消息进行前端处理

事件(新微信登录($ token));

\Log:info('哈哈登录');

返回“登录成功!”;

}

返回“失败的鸟”;

} else {

//TODO:当用户不存在时,可以直接返回登录失败,也可以新建一个用户,登录该用户返回。

返回“登录失败”;

}

},\easy微信\内核\消息\消息: event);

return $ app-server-serve();

}

用easy微信创建一个临时二维码,显示在页面上。

公共函数索引()

{

$微信=app('微信. official _ account ');

$ result=$微信-二维码-临时(' foo ',600);

$ qrcodeUrl=$微信-QRcode-URL($ result[' ticket ']);

返回视图(' index ',compact(' QRcodeURl '));

}

img src={{ qrcodeUrl }} /

前端使用laravel-echo订阅对应的微信扫码登录事件,并接收其中的令牌,存储在本地存储器中,作为判断是否登录的凭证。同时,这个令牌也将作为访问后端api的授权基础。请注意,在前面的代码中,laravel-passport用于生成此个人访问令牌。如果不理解这个原理,可以参考Laravel官方文件。

从“laravel-echo”导入Echo

从“socket.io-client”导入io

window.io=io

让回声实例=新回声({

broadcaster: 'socket.io ',

host : window . location . hostname ' :6001 ',

})

echo instance . channel(' scan-log in ')。倾听('微信可登录',e={

localStorage.setItem('my_token ',this.token)

//其他处理

})

#摘要

此时,简单的扫描代码登录完成。当然,本文的示例代码并不优雅,流程可能不完善,主要是提供一个大概的思路。有了这个思路,我们就可以实现其他功能,如扫码登录、扫码投票等。取决于每个人的创造力。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航