微信支付的接口开发完了,支付流程的测试也成功了,这个时候我们还应该做什么?
异常
微信支付侧会不会不通知我支付成功?
网络故障的时候,我连退款都做不了,应该怎么办?
每一次返回的信息,我是不是都应该验证签名,如果签名不对的话,应该怎么办?
……其他更多
商户在开发中,一定会遇到各种各样的疑问,有的来自开发中的思考,有的是老板的询问,有的是顾客的顾虑。这些问题只有部分在微信支付的文档里能找到推荐的方案,大部分根本没有任何提示。即使上网搜索,也因为别人使用的是闸机,自己开发的是自动售货机等实际情况差异,导致方案不可以用。
这是正常的。异常的情况肯定是无穷多。
面对这些异常,我们首先要坚守两大原则:
第一原则
遇到支付状态不能确定的时候,先向顾客表示交易作废,承诺若有扣款一定会退款,如果有单据可以给与顾客单据,并重新发起支付。
第二原则
支付结果仅以微信支付服务器的支付结果或者查询订单结果为准,如果没有办法从微信支付服务器确认支付状态,参见第一原则。
这个是不会给顾客和商户带来损失的最基本逻辑。在此之上,我们提供了更多的工具,供商户在开发的时候对自己的异常处理参考和测试,见后文工具部分。
常用的方案
这里列举两个最常见,文档上也有简单描述,但是还是有商家看不懂含义的方案:
查单和支付结果通知互补
支付结果通知是由微信支付服务器作为客户端,对商户下单时设置的notify_url的地址进行post访问。这个方案很容易受到网络影响,而且难以察觉。故我们都推荐设置一个超时时间,数值取决于场景,超时未收到支付结果通知,就调用查单接口来同步订单状态,遇到NOTPAY/USERPAYING的则继续等待。
同时由于支付结果通知更加及时,我们依然推荐首要选择支付结果通知,而不是仅凭查单来确认订单状态。
遇事不决先重入
接口文档上有描述,微信支付的所有接口都允许重入。这里的允许重入,意思是同样的请求内容,多次发送,造成的效果不变。这个是很值得利用的一点,可以减少一些异常的发生。常见的有网络超时,http code不为0,收到的返回解析不对,遇到SYSTEMERROR错误码,这些全都可以先原参数重试1~2次再说,不会造成重复扣费,重复下单,重复退款等等问题。
工具
目前微信支付正在各种加强对商户的接入质量支持,并推出了很多辅助的工具,让商户在开发和维护的时候,有更好的支持。