前几天,我跟同事聊起三个案例:
案例1:某用户在某个网上商城购买东西,准备对订单付款。单击付款按钮,被跳转到第三方付费网关,付完费返回。返回后,系统出异常,导致订单没有更新为已付款状态。于是,用户继续提交,系统却要求用户再付费一次,结果还是出现相同的错误.
案例2:某用户在某个网上商城购买东西,准备对订单付款。单击付款按钮,被跳转到第三方付费网关,付完费返回。订单转换成功,但是在订单列表中有两张已付过款的一模一样的订单.
案例3:某用户在某个网上商城购买东西,准备对订单付款。单击付款按钮,被挑转到第三方付费网关,付完费返回。第三方付费网关提示信息:网络连接超时,无法返回.
假设你是以上三个假设案例中的用户,你有何感受?四个字:极度郁闷!
对案例1的分析:
1、为什么不在异常出现后调用第三方付费网关的退款接口呢?
2、为什么还要让用户继续付款呢?既然该订单已经出现过未知异常。
3、为什么不在下次提交的时候继续使用第一次已经成功的付款项呢?
对案例2的分析:
1、该系统是如何响应多个用户同时付费?
2、该系统是如何响应同一个用户的多份订单同时付费?
3、该系统是如何响应第三方付费网关对同一份订单的多次响应?因为很多系统都是根据第三方的响应来创建新事物,如案例2,用户实际上只付款一次,但是第三方付费网关出于某种原因返回了两份付费成功的响应,导致网上商城系统创建了两份相同的已付款的订单。
对案例3的分析:
1、为什么不过一段时间再返回响应一次?
通过这三个案例,我终于明白为什么要对电子帐单和纸质帐单进行对帐。网络系统虽然方便,但是有时不可靠,可能因素是多方面的。我相信很多人都开发过和第三方付费网关交互的系统。虽然教科书上要我们建立一个事物处理(Transaction),但是在不同域的Web系统如何建立事物处理(Transaction)?更何况第三方站点出于自身利益的考虑,也不一定会支持。所以,在设计此类系统,一定要从用户的感受出发,尽量多的考虑用户的感受,方便用户,尽量减少用户时间、精神、金钱上的损失。本文之所以没有提供针对上述三个案例的解决方案,是因为每一个系统的实际情况是不一样的,交互的第三方付费网关也不一样。