一次公交卡被“盗刷”事件带来的思考
需求缘起
那是一个阳光明媚的早晨,笔者和往常一样背着帅气的双肩包,将头发梳成大人模样,换上一身帅气的西装前往公交站,踏上上班之路,运气不错,公交车很快就到了,刷完乘车码以后在外力的帮助下卷入人海默默的等待着下一次外力助我下车。
早晨的时光过得总是很快,中饭过后我正准备趴在桌上午休时收到了微信推送的扣费通知。
收到这种莫名奇妙的扣费通知,我第一感觉是号被盗刷了,谁偷拍了我的乘车码?
但下一秒,一个程序员的直觉告诉自己开发者应该不会犯这种低级错误,乘车码在一定程度上相当于支付条码,怎么可能不刷新呢,我亲测了确实是动态刷新的。
概念
先享后付从字面理解就是先享受服务再付费,对于用户体验来说很好,服务结束的时候可以不用关心付费,由系统自动进行扣减,尤其对一些高频使用场景,比如共享单车,地铁公交等。
使用场景
1.交通出行:滴滴打车,共享单车等,用户下车以后由系统自动付费,节约用户时间;
2.新零售:一些智能货柜,当你选完商品关上柜门以后由系统进行扣减,笔者之前使用过小e到家的智能货柜,体验非常好;
3.网络受限环境:比如公交车经过某些网络不好的路段时,无法实时扣费,但又不能耽误乘客坐车,这种情况就非常适合在刷卡机内部保存离线订单,等网络好的时候再上送订单数据到服务端由系统就行补扣(上面提到的公交车延迟扣费就是这种原因,早晨应该是网络不好没有将订单同步上去);
使用流程
笔者所在的城市目前乘坐地铁或公交时可以使用微信乘车码进行支付,使用之前需要先开通一下,开通流程如下所示:
步骤1:打开乘车码小程序,初次会提示去开通
步骤2:点击“去开通",这时会来到一个引导页,勾选协议以后点击“立即开通”
步骤3:这时会来到“开通免密支付”,点击“开通免密支付”意味着开通流程结束
这时你的乘车码已开通完毕,意味着你可以用它来坐地铁、公交了,这里画个流程图理解一下整体流程。
核心点
整个流程中有几个核心点值得关注:
1.开通免密支付免密支付指的是支付时不需要用户输入密码,由系统自动扣减,系统使用什么扣减呢?笔者翻看了相关文档,微信叫委托代扣协议id,支付宝叫代扣协议号;
2.公交车刷卡机需要保存离线订单,当机具断网以后存在本地,联网以后上送到云端进行补扣;
3.乘车码需要支持离线支付,当用户手机断网以后不影响用户乘车;
4.需要有一套追缴机制,用户乘车以后刷卡机后台还未扣款时用户关闭了免密支付,意味着之前的订单无法扣款,如下图用户在微信中关闭免密支付。
流程细化
用户签约免密支付
用户签约流程
用户乘车
这里有两个关键点重点描述一下:
1.用户打开乘车码小程序时,小程序根据用户手机网络状态决定不同的乘车码生成策略,如果有网就调用后端服务获取乘车码,如果无网就本地生成,笔者猜测码生成规则大概是qrCode=encrypt("用户id,时间戳等”,加密key),如果无网的时候会使用本地缓存的上一次的加密key,否则会动态的去服务端更新加密key;
2.用户刷卡以后,机具首先会生成本地订单,如果有网就将本地订单上送到后台服务,这里上送的目的是为了提示用户“乘车成功”,如下图3.1,3.2所示;
用户刷卡流程
乘车码后台扣款
1.后台拉取待扣款订单;
2.查询用户代扣协议id,如果用户已解约就标记订单为支付失败同时插入欠费记录为下一步的追缴做准备;
3.如果用户未解约,就调用微信免密支付接口,如果支付成功就将订单标记为支付成功,如果支付失败就标记订单为支付失败同时插入欠费记录为下一步的追缴做准备(这里的处理稍显粗暴,如果是用户余额不足等情况其实后台是可以延迟重试的,直到最大重试次数,这里为了举例就简单化处理);
后台扣款流程
追缴-提醒用户还款
当用户欠费以后后台借助平台(微信,支付宝)提供的能力提醒用户还款,当用户还款以后删除用户的欠费记录,如果用户未还款就限制用户继续使用服务,下一个流程会介绍。
提醒用户还款
欠费记录
追缴-限制欠费用户使用服务
限制使用服务
限制使用服务交互
总结
“先享后付”作为一个现在比较流行的消费方式,的确给我们带来了很多的便利,但是每种事物的出现必然是有利有弊的,我这里简单说一下自己的理解。
优点:
1.对于个人来说的确很方便,使用完服务以后不用关注付费问题,由系统自动扣减,用户体验很好;
2.对商家来说减少了结算周期,避免了某些情况下需要催款的场景(笔者以前打网约车忘记付费,收到过司机的催款电话);
缺点:
1.对于个人来说,方便的同时也带来了一定的风险,等于把自己的支付密码交给了别人;
2.对于商家来说可能会面临一定的资损,毕竟社会中还充斥着那么一些老赖;