利用Swoole怎么实现一个微信扫码登录功能

  介绍

今天就跟大家聊聊有关利用Swoole怎么实现一个微信扫码登录功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

大体流程如下:

<李>

客户端打开登录界面,连接到WebSocket服务

<李>

WebScoket服务生成带参数二维码返回给客户端

<李>

用户扫描展示的带参数二维码

<李>

微信服务器回调扫码事件并通知开发者服务器

<李>

开发者服务器通知WebSocket服务

<李>

WebSocket服务通知客户端登录成功

<强>连接WebSocket服务

安装完Swoole之后,我们需用使用到WebSocket服务。新建一个WebSocket服务非常简单:

server 美元;=,new  swoole_websocket_server (“0.0.0.0",, 1099);   服务器→美元(& # 39;开放# 39;,,function  (swoole_websocket_server 服务器,美元,美元请求),use  ($ config) {   echo “服务器:才能,handshake  success  with  fd{$请求→fd} \ n";   });   服务器→美元(& # 39;消息# 39;,,function  (swoole_websocket_server 服务器,美元,美元的框架),{   });

这里的消息回调其实用不到,因为都是服务端下发消息的,但是必须设定一个。设定的端口号如果低于1024年则必须要有根权限,服务器记得去防火墙开启该端口。

<强>生成带参数二维码

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

服务器→美元(& # 39;开放# 39;,,function  (swoole_websocket_server 服务器,美元,美元请求),use  ($ config) {   时间=美元才能app 工厂:officialAccount ($ config (& # 39; wechat& # 39;]);   时间=美元才能result 应用程序→美元qrcode→临时(请求→美元fd, 120);   时间=美元才能url 应用程序→美元qrcode→url($结果[& # 39;机票# 39;]);   服务器→美元才能推动(请求→美元fd,, json_encode ([   ,,,& # 39;message_type& # 39;,,=祝辞,& # 39;qrcode_url& # 39;   ,,,& # 39;url # 39;,,,,=在$ url   ])才能);   });

我们在开放的回调中,生成一张临时的二维码,二维码的场景值就是客户端连接的文件描述符,这样就可以保证每个客户端的唯一性。有效时间设置为120秒,防止一张二维码被多次扫码使用。消息推到客户端的时候必须要json,方便客户端处理。客户端代码也很简单:

const  socket =, new  WebSocket (& # 39; ws://127.0.0.1:1099& # 39;);   socket.addEventListener才能(& # 39;消息# 39;,,function (事件),{   ,,,var  data =, JSON.parse (event.data);   ,,,if  (data.message_type ==, & # 39; qrcode_url& # 39;) {   ,,,,,美元(& # 39;# qrcode& # 39;) .attr (& # 39; src # 39;,, data.url);   ,,,}   });才能

<强>回调扫码事件

在客户端展示二维码后,需要提示用户扫码。对于用户扫临时的二维码,微信会触发相应的回调事件,我们需要在该回调事件中处理用户的扫码行为。其中我们需要用到微信传递过来的一些参数:

FromUserName ,发送方帐号(一个OpenID)   MsgType ,,,,,消息类型,事件   Event ,,,,,事件类型,订阅   EventKey ,,,事件,KEY 值,qrscene_为前缀,后面为二维码的参数值

这里要注意一点:微信已关注扫码推送的EventKey是没有qrscene_前缀的,只有未关注扫码然后关注才有。

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

if (美元消息[& # 39;MsgType& # 39;],==, & # 39;事件# 39;){   if 才能;($消息[& # 39;事件# 39;],==,& # 39;订阅# 39;){,//关注   ,,,return  $ this→订阅($消息);   ,,}   if 才能;($消息[& # 39;事件# 39;],==,& # 39;退订# 39;),{,//取消关注   ,,,return  $ this→退订($消息);   ,,}   if 才能;($消息[& # 39;事件# 39;],==,& # 39;扫描# 39;){//已才能关注扫码   ,,,return  $ this→扫描($消息);   ,,}   其他}{   return 才能;“您好!欢迎使用,SwooleWechat 扫描登录“;   }

这里只讲解一个关注事件的业务逻辑,其他根据需要自行编码:

public  function 订阅(消息){   时间=美元才能eventKey  intval中(str_replace (& # 39; qrscene_& # 39;,, & # 39; & # 39;,,美元消息[& # 39;EventKey& # 39;]));   时间=美元才能openId 美元消息[& # 39;FromUserName& # 39;];=美元才能user  $ this→程序→用户→(openId美元);   这→美元才能通知(json_encode ([   ,,,& # 39;类型# 39;,=祝辞,& # 39;扫描# 39;   ,,,& # 39;fd # 39;,,=祝辞,eventKey美元,   ,,,& # 39;昵称# 39;,=祝辞,$ user(& # 39;昵称# 39;】   ])才能);=美元才能count  $ this→count ($ openId);   msgTemp 美元;=,才能“% s,登录成功! \ n这是你第% s次登录,玩的开心!“;   return 才能;sprintf (msgTemp美元,,用户(& # 39;昵称# 39;],,美元数);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

利用Swoole怎么实现一个微信扫码登录功能