二维码分类与应用场景
在回顾一些系统设计时,发现了二维码应用场景非常广泛,所以发散与汇总下。
从生成方式来说,二维码可以分为动态二维码、静态二维码。
动态二维码即为需要展示时,动态生成的二维码,一些常见的应用场景有:
- 扫码登陆:用户通过扫描动态二维码进行网站或应用的登录验证。
- 扫码支付:用户通过扫描网站的动态二维码完成支付操作。
静态二维码即为生成后内容固定不变的二维码,一些常见的应用场景有:
- 扫码支付:用户通过扫码支付宝、微信的付款码来进行支付操作。
- 物流跟踪:快递单上的二维码可以包含物流信息,用户扫码后可以实时查看包裹状态。
- 名片分享:微信中个人二维码、公众号二维码等,通过扫码可以查看个人或公众号。
当然静态二维码并非一定不变,在支付宝、微信平台上提供了更新二维码的功能,使旧二维码失效、生成新二维码。
动态扫码登陆
动态扫码登陆分为几个关键阶段:生成二维码、扫码二维码、确认登陆。
生成二维码
- 网页前端/PC 端发送生成二维码请求、并携带可以标识该设备的信息;
- 后端生成与设备绑定的二维码 ID,返回给前端/PC 端;
- 前端/PC 端进行展示;
- 通过长轮询机制获得用户扫码状态。
扫码二维码
- 用户扫码二维码,获得二维码 ID
- 将手机端登陆生成的 token、二维码信息发送给服务端
- 服务端将二维码 ID、用户身份绑定,生成临时 token,返回给手机端
- 前端/PC 端在长轮询下获得用户扫码状态,变更为待确认状态
确认登陆
- 用户在手机端点击确认登陆,手机端携带临时 token 发送确认登陆请求
- 服务端生成 token 返回给前端/PC 端,后续前端/PC 端将基于该 token 访问服务端接口。
动态扫码支付
扫码支付相对于扫码登陆,对数据不丢失性、安全性等有更高的要求。
-
生成订单:用户在电商平台或线下商家处选择商品或服务,点击支付后,系统生成包含商品详情、价格、数量、订单编号等信息的订单数据,发送至商家端和支付核心系统进行存储。
-
生成动态二维码:支付核心系统接收到订单信息后,生成一个唯一的支付标识 PayToken,并将 PayToken 与订单信息关联,存储到缓存中,设置较短的过期时间(如 15 分钟)。同时,根据 PayToken 和订单信息生成动态二维码数据,返回给用户端展示。动态二维码中包含支付链接,该链接携带 PayToken 和订单相关信息,确保支付的准确性和安全性。
-
扫码支付:用户使用手机端支付应用(如微信支付、支付宝)扫描动态二维码,支付应用识别二维码中的支付链接,向支付核心系统发送支付请求,携带 PayToken。支付核心系统验证 PayToken 在缓存中是否存在且未过期,若验证通过,将支付请求转发至对应的第三方支付平台。其中,用户手机端显示的费用等信息,可能是二维码中携带的,也可能是调用后端获取的。
-
支付处理:第三方支付平台接收到支付请求后,根据用户选择的支付方式(如银行卡支付、余额支付等)引导用户完成支付操作。支付完成后,第三方支付平台将支付结果(成功或失败)通知支付核心系统。
-
订单状态更新:支付核心系统接收到支付结果通知后,更新订单状态为 “已支付” 或 “支付失败”,并将结果同步至商家端和用户端。若支付成功,商家端可进行发货等后续操作;若支付失败,用户端可提示用户重新支付或选择其他支付方式。
为了安全保障,还会进行数据加密(如银行卡、支付密码、身份证)、身份验证(指纹识别、面部识别)、风险控制。
微信个人二维码
微信扫码登陆中使用长轮询机制,该机制可以参考 Websocket 介绍长轮询中探测的网页请求。
微信二维码中的内容并非简单的短链接,其域名会根据应用场景不同而改变。比如,网页端微信登陆时,二维码内容为 https://login.weixin.qq.com/l/xxxxxxx;个人二维码的内容为 https://u.wechat.com/xxxxxxx。