手机版

基于Swoole的微信扫码登录功能实现代码

时间:2021-09-01 来源:互联网 编辑:宝哥软件园 浏览:

随着微信的普及,扫码登录在当前应用中的使用越来越多。它不需要记住密码,只要有微信号,就可以快速方便的登录。微信的开放平台本来就有支持扫码登录的功能,但大部分人还是使用公共平台,所以扫码登录只能自己实现。这里基于微信公众平台的带参数的临时二维码,结合Swoole的WebSocket服务,实现扫码登录。一般流程如下:

客户端打开登录界面,连接到WebSocket服务WebSocket服务生成带参数的二维码,并返回给客户端用户扫描显示带参数的二维码。微信服务器回调代码扫描事件,通知开发者服务器通知WebSocket服务WebSocket服务通知客户端成功登录并连接到WebSocket服务

安装Swoole后,我们需要使用WebSocket服务。创建新的网络套接字服务非常简单:

$ server=new swoole _ web socket _ server(' 0 . 0 . 0 . 0 ',1099);$server-on('open ',function(swoole _ web socket _ server $ server,$ request)use($ config){ echo ' server :与fd握手成功{ $ request-FD } \ n ';});$server-on('message ',函数(swoole_websocket_server $server,$ frame){ });其实这里的消息回调是不能用的,因为所有的消息都是服务器发送的,但是必须设置一个。如果设置的端口号低于1024,你必须有根权限,服务器要记得去防火墙打开端口。

生成带参数的二维码

WebSocket服务需要生成一个带有参数的微信二维码,在客户端连接成功后返回给客户端显示:

$server-on('open '),函数(swoole_websocket_server $server,$ request)use($ config){ $ app=factory : officelaccount($ config['微信']);$ result=$ app-二维码-临时($request-fd,120);$ URL=$ app-QR code-URL($ result[' ticket ']);$server-push($request-fd,JSON _ encode([' message _ type '=' QR code _ URL ',' URL '=$ URL]);});在开放回调中,我们生成一个临时二维码,二维码的场景值就是客户端连接的文件描述符,这样就可以保证每个客户端的唯一性。有效时间设置为120秒,以防止二维码被多次代码扫描使用。消息推送到客户端时需要Json,方便客户端处理。客户端代码也很简单:

const socket=new WebSocket(' ws ://127 . 0 . 0 . 1:1099 ');socket . addeventlistener(' message '),function(event){ var data=JSON . parse(event . data);if(data . message _ type==' QR code _ URL '){ $(' # QR code ')。attr('src ',data . URL);} });回调扫描代码事件

在客户端显示二维码后,需要提示用户扫码。当用户扫描临时二维码时,微信会触发相应的回拨事件,在这个回拨事件中我们需要处理用户的扫码行为。其中,我们需要用到微信传递的一些参数:

FromUserName发送者帐户(一个OpenID)MsgType消息类型,eventEvent类型,subscribeEventKey事件Key值,qrscene_ as前缀,后跟二维码的参数值。这里需要注意的是,关注扫码后微信推送的EventKey没有qrscene_ prefix,只有关注扫码后才会有。

收到微信回拨后,首先要根据不同的事件类型做不同的处理:

if($ message[' msgtype ']==' event '){ if($ message[' event ']==' subscribe '){//注意返回$ this-subscribe($ message);} if($ message[' event ']==' unsubscribe '){//注意返回$ this-unsubscribe($ message);} if($ message[' event ']==' scan '){//注意扫描代码返回$ this-scan($ message);}}else{ return' hello!欢迎使用SwooleWechat扫描登录';}这里只解释相关事件的一个业务逻辑,其他的根据需要自行编码:

公共函数subscribe($ message){ $ event key=int val(str _ replace(' QR scene _ ','',$ message[' event key ']));$ OpenID=$ message[' FrOm USERNAME '];$ user=$ this-app-user-get($ OpenID);$ this-notify(JSON _ encode([' type '=' scan ',' fd'=$eventKey,'昵称'=$user['昵称']]);$ count=$ this-count($ OpenID);$ MSgtEmp=“% s”,登录成功!\n这是您的%s登录,玩得开心!”;返回sprintf($msgTemp,$user['昵称'],$ count);}这里的EventKey实际上是连接到WebSocket的客户端文件描述符,获取扫码用户的OPEN_ID,根据用户的OPEN_ID获取用户信息,通知WebSocket服务,并将短信回复到微信。

这里的一个麻烦点是如何通知WebSocket服务。我们知道处理微信回调的代码不在WebSocket服务上,那么不同的Server是如何进行通信的呢?Swoole官方给出了两种解决方案:

收听一个额外的UDP端口,并使用swoole_client作为客户端来访问服务器。这里我们选择第二种方案。swole版支持一台服务器监听多个端口。我们在WebSocket服务中添加了一个新端口来监听TCP:

$ TCP _ server=$ server-addListener(' 0 . 0 . 0 . 0 ',9999,SWOOLE _ SOCK _ TCP);$ TCP _ server-set([]);$tcp_server-on('receive ',函数($serv,$fd,$threadId,$ data){ });主服务器为WebSocket或Http协议,新监控的TCP端口默认会继承主服务器的协议设置,因此只有单独调用set方法设置新协议才能启用新协议。

然后我们可以在代码扫描回调过程中通知WebSocket服务:

公共函数notify($ message){ $ client=new SWOOLE _ client(SWOOLE _ SOCK _ TCP);if(!$client-connect('127.0.0.1 ',$this-config['notify_port'],-1)) { return 'connect失败。error : { $ client-errCode } \ n ';} $ ret=$ client-send($ message);}通知登录成功

WebSocket服务收到成功登录的通知后,可以根据需要对用户信息进行处理,然后将用户信息传递给客户端的浏览器显示结果。还记得我们刚才听的那个TCP端口吗?您可以在接收事件中处理它:

$tcp_server-on('receive ',函数($serv,$fd,$threadId,$data) { $data=json_decode($data,true);if($ data[' type ']==' scan '){ $ server-push($ data[' FD '],JSON _ encode([' message _ type '=' scan _ success ',' user'=$data['昵称']));} $ server-close($ FD);});上次登录界面:

摘要

整个过程并不难,主要的两个难点是连接用户对应的扫描用户与不同的Server之间的通信。我们的解决方案是把连接的文件描述符作为临时二维码场景值(这里也可以用Redis存储映射关系),监听新的TCP端口接收通知消息。你可以去http://wechat.sunnyshift.com/index.php试试。记得用电脑打开。

以上是边肖介绍的基于Swoole的微信扫码登录功能的实现代码。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:基于Swoole的微信扫码登录功能实现代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。