今天就跟大家聊聊有关利用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怎么实现一个微信扫码登录功能