Skip to main content
 首页 » 支付技术

针对异常的微信支付开发

2016年12月02日1921

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

异常

微信支付侧会不会不通知我支付成功?

网络故障的时候,我连退款都做不了,应该怎么办?

每一次返回的信息,我是不是都应该验证签名,如果签名不对的话,应该怎么办?

……其他更多

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

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

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

第一原则

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

第二原则

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

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

常用的方案

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

查单和支付结果通知互补

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

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

遇事不决先重入

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

工具

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

开发者问答

http://wxpay.weixin.qq.com/qa/index.php

这是技术支持同事们从日常的常见问题中整理出来的集锦。包括了笔者在公众号里发过的一些内容。

验收环境

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=21_1