不知道大家有没有注意到,在支付的时候,即便没有网络,依然可以将支付码给商家扫描就能成功支付。这是怎么做到的呢?今天芝麻给大家简单讲解一下。
其实,微信、支付宝的“面对面支付”产品是需要在线支付的产品,所以这里说的“无网络”仅仅是指消费者客户端不在线的情况,商户需要在线才能收款(这点和公交卡充值支付不同,公交卡近场支付允许双方都不在线)。所以严格来说,面对面支付产品(具体指商户主动在消费者钱包客户端上扫码支付的支付场景)一定是在商户在线的情况下进行交易,主要有以下两个原因:
1、为保证交易安全,支付公司在支付后必须保证每笔交易都有资金实际扣除,并且需要商家当场确认,所以需要商家在线,双方不能离线。
2、为保证支付结果的真实性,商户必须自己从支付接口或终端获取支付结果,消费者出示的支付凭证不能作为最终支付结果。原因也很容易理解,第一,消费者给出的扣款凭证不一定真实有效。第二,订单本身需要返回一个正常的收款结果才能完成交易。就像POS业务收款一样,商户必须看到POS机打印出来的收据才算付款有效。客户手里的银行扣款通知单是不会放过客户的,只会把金额改正,让客户重新刷卡。所以商户必须在线才能成功收款。
那么这种面对面支付在客户离线的情况下是如何收款的呢?我们以支付宝为例,看一下一个标准的面对面支付产品的信息流是什么样的:
图中红圈部分,商户系统和支付宝系统需要联网,所以商户必须线上收款,消费者刷卡支付时可以线下生成支付码,因为微信和支付宝都支持线上线下两种方式生成支付码。
在线代码比较好理解,当客户点击“支付”时,客户端会向服务器申请一个支付凭证代码给客户,并展示在客户端上。这个支付凭证代码在服务器上会有一套数据库记录它和真实客户账户的关联,而这个关联只有60秒的有效期,过了有效期之后,支付代码就会失效。每次用户点击【支付】、等待超过60秒或者主动刷新支付代码,都会触发客户端重新向服务器发起请求获取新的代码。
此在线代码的优点是:
l 相对安全,在线实时生成,且有效期仅为60秒,不存在支付码被盗用或冒用的风险。
l 服务灵活,由服务端直接生成并发送,即使代码的安全算法有较大调整,也不需要升级客户端。
缺点也很明显:必须在线生成,如果没有网络或者网速差的话,支付体验会很差。
因此,为了避免必须连接互联网的限制,引入了离线代码。
离线代码生成流程如下:
1、用户登录客户端后,自动向服务端申请一个种子;
2、服务端通过可信网络向客户端发送令牌种子(每个客户的令牌种子都是唯一的,客户登录后原有种子销毁,重新下载种子)并保存在本地;
3、当用户点击【支付】时,客户端利用种子+时间戳+一组安全算法生成一串数字,即离线码。
当用户使用离线码支付时,服务器会通过算法验证该码是否来自对应用户,只有验证通过,才会授权支付。
离线代码的优点:
(1)无需连接互联网即可生成,没有互联网也能顺利使用;
(2)支付码在本地生成并保存,一键显示,提供更好的客户体验。
但也有缺点:
(1)由于离线代码存储在本地,如果用户手机被root,那么机密存储的种子数据可能会被不法分子窃取并任意使用。
但针对这个缺陷,微信和支付宝肯定有相应的技术来保证用户支付的安全,不过这个技术属于商业机密,芝麻也不是很清楚。
(2)业务调整不如在线代码灵活,因为离线代码的生成逻辑是在客户端完成的,因此如果修改算法,需要升级客户端,影响客户体验。
(3)算法导致的小概率错误。这涉及到一些算法问题。简单来说,用户A计算出来的代码恰好和用户B的代码一模一样,都是有效的。但这种情况发生的概率极低,可以忽略不计。
最后芝麻给大家一个提醒,移动支付在打开便捷之门的同时,也给我们的信息和金融安全带来了隐患。所以大家一定要注意健康使用手机软件,一般情况下,除非有特殊用途,否则不要root。另外重要的密码和证书也不要集中记录在一个地方,避免手机丢失造成不可挽回的损失。