微信公众号支付和微信扫码支付在 支付结果通知上有很大的区别,公众号支付主要是以异步通知去确定支付结果,也可以通过查询接口,而扫码支付通常调用查询接口去查询支付状态。因而,公众号支付的异步通知是一个需要注意的问题。
1.异步通知回调问题,由于自己疏忽没有注意到银联商务异步通知的详细说明,导致异步通知不到,具体描述如下:
支付完成后,渠道方会通知网付前置账单系统,账单系统收到通知后会组织结果信息发送通知到商户的通知地址。商户的通知地址可以在商户信息中配置,也可以在上送详单信息时上送,若都多处都配置了通知地址,那么账单系统会把结果通知到所有的地址上。
注意:商户收到通知后,需要对通知做出响应:成功收到时响应”SUCCESS”;失败时响应”FAILED”。
针对重复收到通知的问题处理:如果网付没有收到商户响应的SUCCESS字串,或者商户应答的报文中不包含SUCCESS字串,或者网络异常,系统会在24小时内尝试多次通知。
商户收到重复通知时可以执行以下1或2进行处理:2.通知报文里面有商户订单号,商户可根据订单号和订单状态判断是否是重复通知,并忽略已经处理了的订单的重复通知。
通知会以POST形式发出,包含参数如下(出于安全考虑,实际通知报文含有个随机字段,key-value值不固定,且参与签名)
由于是做银联商务支付网关设计,在异步通知这一块仅需要接收银商传过来的异步通知数据,对数据不做任何处理,转发给请求网关的C端程序。
最开始在设计异步通知时,采用request中的forward方法,,如下图所示,实测C端接收不到转发的异步通知数据,查阅资料后发现这种方式仅限于服务内部转发消息。
因此,转手使用http通信,在接收到银联商务异步通知数据后,,通过post请求转发给C端程序。
下图为网关内部接收异步通知地址,此地址需在请求下单接口时填入
接口地址
2.针对注意:商户收到通知后,需要对通知做出响应:成功收到时响应”SUCCESS”;失败时响应”FAILED”。
针对重复收到通知的问题处理:如果网付没有收到商户响应的SUCCESS字串,或者商户应答的报文中不包含SUCCESS字串,或者网络异常,系统会在24小时内尝试多次通知。
在接收到异步通知后,没有返回SUCCESS或FAILED,导致异步通知持续不断发送。
解决:对接受的异步通知map做判断,如图示,返回响应信息。
3.在对接银联商务支付下单接口时,需上送异步通知地址,用于接收异步通知,也已经正常接收。
但是在调用退款接口时,并没有上送异步通知地址,在查看日志后发现也有退款的异步通知,其中status值为“TRADE_REFUND”(下单接口异步通知为“TRADE_SUCCESS”),这种情况在最开始接入银联商务时并没有返回退款的异步通知,今天测试时突然发现有了,,,,,可能是银联商务系统在接收下单请求时默认了用户填入的notify_url吧(强行解释一波)。