移动支付现在非常的普及,最常用的支付宝和微信支付相信已经有非常多的用户在使用了。微信,支付宝都可以实现离线支付。那么在没网络的情况下,离线支付如何实现。
一、前提条件:
1.离线支付功能只支持已签约免密支付/自动扣款的项目,比如支付宝或者微信的付款码。不能超过免密支付限额。
2.商家手持扫码枪扫码,在金额比较少的情况下,不需要输入支付密码验证就可以完成支付的。
3.手机可以离线,但是作为收款方的商户需要自己的扫码设备保持在线,通过在线的收款方搭桥,将离线的付款信息传到支付宝服务器端进行校验,最后完成支付操作
二、支付流程图:
三、实现流程:
1.离线生成的付款码:
1.用户打开支付宝客户端选择付款码,软件会向服务端申请令牌种子
2.支付宝服务器会根据算法生成一个令牌种子,返回给支付宝客户端
3.支付宝客户端得到令牌种子后,根据算法生成付款码(可以离线生成)
2.付款码是一次性且动态更新
1.支付宝客户端生成的付款码会包含有用户标识、令牌值等信息
2.付款码是一次性的,且每分钟会更新一次,有效避免出现别人把你的付款码打印出来再去付款
3.扫码枪在线
1.线下支付时,打开支付宝客户端,出示付款码(可以离线状态)
2.商家扫码枪读取付款码,通过商家的设备上传至支付宝服务器
3.支付宝服务器收到商家传来的付款码后,与令牌系统里保存的信息进行对比
4.比对匹配则创建支付订单,并返回给商户订单信息,如果用户的余额足够便可完成支付
四.离线码的劣势:
一.算法调整不灵活,如果相关算法较大的调整,可能需要升级客户端,并且这个期间服务端还需要兼容新老算法产生的付款码。
二.安全性问题,正常的情况相关密钥无法被普通用户获取,但是架不住有有心之人。他们可能通过获取手机用户 Root 权限或者越狱手机,利用恶意程序获取密钥,然后随意生成付款码。
不过这一点,我觉得不过过分担心,蚂蚁集团这么多大神,不是吃干饭的,他们肯定有很多措施保证支付安全。
三.数据碰撞问题,A 用户生成付款码算出来与 B 用户一致,这就 Hash 算法一样,再怎么优秀的算法,也有概率才生一样的额 Hash 值。
这就导致原本是扣用户 A 的钱,最后却扣了 B 用户。这样一来,确实很乌龙,对于 B 用户来讲,莫名其妙被扣钱了。
不过这种事放到放到现在,我觉得还是比买彩票中奖低,所以这种事还是不用过分担心了。
总结:
总结一下,我们平常使用付款码支付,其实原理就是商家端获取我们手机 APP 付款码(「其实就是一串数字」),然后后台调用支付宝支付接口完成扣款。
这个流程商家端后台程序必须联网在线,但是对于我们客户端来讲可以在线,也可以离线。
如果我们客户端在线,那就可以通过服务端向客户端发送付款码,这种方式更加安全,灵活,但是对于弱网环境下,体验就很差。
如果我们客户端没网,那就通过客户端通过一定算法生成付款码,服务端收到经过相关校验,确认是哪个用户,确认码有效性,并且完成扣款。这种方式,适合客户端没有网络的情况,不过相对不灵活,且安全性稍差。
了解原理,有没有觉得还是挺有意思的下次排队付款钱,如果手机没网,不要担心尴尬,放心拿出手机付钱
- 本文作者: Grx
- 本文链接: https://ruixiaoguo.github.io/Grx.github.io/Grx.github.io/2022/05/01/微信支付宝离线支付原理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!