QR Code Demo

Live Demo

该项目的主要目是为了学习扫码登录的主要流程。

提示:该项目没有客户端,应此需要通过调用接口模拟客户端的操作。

前提条件

用户在网页端未登录、用户在客户端已经登录(这里用接口来代表客户端)。

扫码登录步骤

用户打开网页; 网页端请求接口获取一个 uuid 并将它渲染成一张二维码图片; 网页端开始轮询检测该 uuid 的状态(即二维码的状态); 用户拿起手机并打开对应的 APP 扫描网页上的二维码; 扫描后,手机 APP 询问用户是否确认登录或者取消本次操作; 用户在手机 APP 点击确认登录按钮; 网页端检测到 uuid 变成已确认状态后,会调用 uuid 登录接口(该接口会生成保持用户状态的 Cookie); 网页端跳转到网站首页,完毕。

主要接口

获取 uuid

只用于 Web 端,初始打开登录页面或刷新登录页面都会调用。

/qrcode/get

该接口返回以下信息:

{ "uuid":"5c7ce144dbc4a0.53849626", "qrcode":"http://qrcode.example.com/qrcode/scan?uuid=5c7ce144dbc4a0.53849626" }

qrcode 就是二维码的内容,APP 扫描以后直接请求该地址即可,这有利于发版后接口的迭代。

检测 uuid 状态

只用于 Web 端,该接口会不停轮询调用。

/qrcode/check?uuid={:uuid}

uuid 有以下状态:

初始化 已扫描 已登录(即已被使用) 已过期 已取消

有两个特别的地方需要指出:

用户使用 APP 扫描二维码后,该接口会返回用户的头像,更利于用户辨认; 用户确认登录后,该接口会返回一个 ticket,用于完成 uuid 进行的登录,防止有人恶意刷登录接口;

对于以上的说明,建议直接看接口返回的内容和源代码。

扫描二维码

用户在 APP 端扫描二维码后,APP 会调用该接口。该接口地址实际上也是二维码的内容。

/qrcode/scan?uuid={:uuid}

该接口返回以下信息:

{ "confirm_url":"http://qrcode.example.com/qrcode/confirm?uuid=5c7ce20ae619a1.18514665", "cancel_url":"http://qrcode.example.com/qrcode/cancel?uuid=5c7ce20ae619a1.18514665" }

confirm_url 是确认登录时所调用的接口,而 cancel_url 是取消登录所调用的接口。

确认登录

用户在 APP 端确认登录后,APP 会调用该接口。

/qrcode/confirm?uuid={:uuid}

取消登录

当用户取消本次操作时会调用该接口。

/qrcode/cancel?uuid={:uuid}

uuid 登录

网页端获知 uuid 状态已经变成已确认后,则会调用该接口,完成登录操作。

/login/qrcode=?ticket={:ticket}&uuid={:uuid}&time={:timestamp}

上面已经提到过,ticket 是为了安全起见而添加。

部署方法

项目依赖:

PHP 7 Phalcon 3.4

能让项目跑起来就好,可不必太过受制于 Phalcon 框架本身,它只是个普通的 PHP extension.

克隆本项目

cd /path/to git clone git@github.com:aisuhua/qrcode-demo.git

修改可写权限

chmod u+w app/cache/data

Nginx 配置

server { listen 80; server_name qrcode.example.com; root /path/to/qrcode-demo/public; index index.php index.html index.htm; charset utf-8; client_max_body_size 100M; fastcgi_read_timeout 1800; location / { try_files $uri $uri/ /index.php?_url=$uri&$args; } location ~ [^/].php(/|$) { fastcgi_pass 127.0.0.1:9000; fastcgi_index /index.php; include fastcgi_params; fastcgi_split_path_info ^(.+?.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /.ht { deny all; } location ~* .(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; access_log off; } }

也可以参考 Phalcon 官方给出的示例 Web Server Setup

截图演示

初始状态

扫描二维码

二维码已过期

TODO

轮询的调用方式不止有延迟,也会增加了大量的无效请求,有待改进。

后记

如需了解微信扫码登录的实现细节,可点击这里。

参考文献

扫码登录是如何实现的? 扫码登录原理

版权声明:

1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。
2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。