支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位为秒)。
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄露导致出现“假通知”,造成资金损失。
用户在微信客户端完成支付后(提示已经成功付费),微信会发送给第三方服务器XML格式的数据通知包,在返回的参数中可以看到,用户发送的数据会原样返回,如订单号(out_rade_no)等,用户可以根据此参数值定位到自己系统里面的订单进行处理。同时,也返回了微信交易订单号(transaction_id),可以通过它进行数据正确性的核对。
在index()方法的统一下单接口中设置的notify_url为:
http://域名/wxpay
新增wxnotify()方法,增加以下代码:
在数据库中新增db_logs表,数据表仅有id(int4)主键和content(text)两个字段,方便记录接收到的请求信息。
在方法中,首先,获取微信下发的数据信息(XML格式,POST类型):
$xml=$GLOBALS['HTTP_RAW_POST_DATA'];
其次,把XML格式的数据转换为数组类型,并记录到数据库logs表中,然后,对接收到的数据进行验证:
接着,对验证结果进行匹配对比:
最后,构建响应参数并发送给微信通知接口: