代码改变世界

针对异常的微信支付开发 坚守两大原则(分享)

2016-12-13 17:29  ehekeji  阅读(203)  评论(0编辑  收藏  举报

      成都亿合科技微信开发公司发现,微信支付的接口开发完了,支付流程的测试也成功了,这个时候我们还应该做什么?

      异常:如微信支付侧会不会不通知我支付成功?网络故障的时候,我连退款都做不了,应该怎么办?每一次返回的信息,我是不是都应该验证签名,如果签名不对的话,应该怎么办?……其他更多

      商户在开发中,一定会遇到各种各样的疑问,有的来自开发中的思考,有的是老板的询问,有的是顾客的顾虑。这些问题只有部分在微信支付的文档里能找到推荐的方案,大部分根本没有任何提示。即使上网搜索,也因为别人使用的是闸机,自己开发的是自动售货机等实际情况差异,导致方案不可以用。

      这是正常的。异常的情况肯定是无穷多。

      面对这些异常,我们首先要坚守两大原则:

      第一原则

      遇到支付状态不能确定的时候,先向顾客表示交易作废,承诺若有扣款一定会退款,如果有单据可以给与顾客单据,并重新发起支付。

      第二原则

      支付结果仅以微信支付服务器的支付结果或者查询订单结果为准,如果没有办法从微信支付服务器确认支付状态,参见第一原则。

      这个是不会给顾客和商户带来损失的最基本逻辑。在此之上,我们提供了更多的工具,供商户在开发的时候对自己的异常处理参考和测试。

      常用的方案

      这里列举两个最常见,文档上也有简单描述,但是还是有商家看不懂含义的方案:

      查单和支付结果通知互补 支付结果通知是由微信支付服务器作为客户端,对商户下单时设置的notify_url的地址进行post访问。这个方案很容易受到网络影响,而且难以察觉。故我们都推荐设置一个超时时间,数值取决于场景,超时未收到支付结果通知,就调用查单接口来同步订单状态,遇到NOTPAY/USERPAYING的则继续等待。

      同时由于支付结果通知更加及时,我们依然推荐首要选择支付结果通知,而不是仅凭查单来确认订单状态。

      遇事不决先重入

      接口文档上有描述,微信支付的所有接口都允许重入。这里的允许重入,意思是同样的请求内容,多次发送,造成的效果不变。这个是很值得利用的一点,可以减少一些异常的发生。常见的有网络超时,http code不为0,收到的返回解析不对,遇到SYSTEMERROR错误码,这些全都可以先原参数重试1~2次再说,不会造成重复扣费,重复下单,重复退款等等问题。

      工具

      目前微信支付正在各种加强对商户的接入质量支持,并推出了很多辅助的工具,让商户在开发和维护的时候,有更好的支持。