我们可以看到在这个图里红色圈圈部分,商户系统和支付宝系统是对接上的,所以商户系统是联机的——而用户的手机,在展示 code 的时候,我并未强调是否和支付宝服务端联机。
事实上,不论是微信还是支付宝都支持两种用户码生成模式,即在线码和离线码。
在线码其实很容易理解,用户目前是登录钱包的状态,只要点击「付款」按钮,客户端就向支付宝的服务端申请一个针对这个客户账户的支付凭证码并展现到客户手机上。
这个支付凭证码在支付宝的服务端会有一组数据库记录其与真实客户账户之间的关联,并且这份关联的有效期为 60S,超过时效即便商户上送这个码,支付宝也会认为这是作废码而不予处理。
用户每次点开「付款」、等待超过 60S、主动刷新付款码,都会触发客户端向服务器申请一个新码的请求。
这个方案的好处是:
那离线码的劣势呢,我们看看:
恩……怎么说呢,毕竟现在不是发烧友主动 root 越狱的用户并不多,这是其一。
即便是 root 越狱,如果用户使用手机的习惯良好,被恶意程序攻击手机的概率也很低,这是其二。
每家公司都有自己的安全团队去保障自己客户端的数据安全,并不是说 root 的用户就只能坐以待毙了,否则微信和支付宝早被搞破产了,这是其三。
当然从我个人的角度来说,普通用户我都不建议去 root 或者越狱。
这个问题最粗暴的方案就跟反方向的钟所说的一样,监测到系统被 root 了就对用户限权(很多银行的客户端方案都是这么搞的)。
作为直接面向消费者市场且充分竞争的产品,微信支付和支付宝断然不会采用上面那个方案的。