在本站之前的文章中,我为大家介绍了在 WordPress 中使用Alipay paymentrespond in singingWeChat Payment的开发方法,那两篇文章中,只介绍了处理同步返回数据的方法,而没有介绍怎么处理支付平台异步通知返回数据的方法,只有同步而没有异步通知的处理显然是不完整的,如果用户支付完成之后,没有等待支付网站跳转回发起支付的网站就关闭了页面,发起支付的网站是收不到支付结果通知的。今天我就为大家介绍一下怎么在支付发起网站增加处理异步通知的方法。
异步通知和同步通知的相同和不同
两种通知方式的相同之处就是返回的数据完全相同,不同之处主要有以下两点。
- 同步通知返回数据的方法为 GET 请求,我们可以很方法的通过 $_GET 全局变量获取返回的数据并进行处理。而异步通知的请求方法为 POST 方法。
- 同步通知返回的数据,我们可以很轻松的打印出来,出现错误方便排查原因,而同步通知返回的数据没有办法直接打印,只能通过写入 Log 或数据库的方式来查看返回的数据。
有了以上两点不同,处理异步通知的方法肯定就和处理同步通知的方法不一样了,其实主要的不同在于返回数据的方法,一个是 GET 请求,一个是 POST 请求。下面我们来看一下具体的处理代码。
处理异步通知的注意事项
不管是通知通知,还是异步通知,在发起支付的网站,处理通知的业务逻辑其实是一样的,基于 DRY 原则,我们完全可以把两种处理方式放在一起处理,在两种支付方法不同的地方做出判断,各自处理就可以了。下面是支付宝支付和微信支付获取请求数据的方法,如果通知方法是同步通知,直接通过 $_GET 变量获取订单号,如果是异步通知,支付宝可以直接通过 $_POST 变量获取数据,而微信支付返回的数据是 XML 格式的,我们需要通过辅助函数转换为数据,然后获取数据。
/**
* 获取支付网关返回的 out_trade_no
*/
if ( $notify == 'return' ) {
$out_trade_no = $_GET[ 'out_trade_no' ];
} else {
if ( $method == 'alipay' ) {
$out_trade_no = $_POST[ 'out_trade_no' ];
} else {
$out_trade_no = Helper::xml2array( file_get_contents( 'php://input' ) )[ 'out_trade_no' ];
}
}
验证同步通知成功,我们需要返回一个成功消息 “success” 给支付网关,以免支付网关重复发送通知。
if ( $response->isPaid() ) {
if ( $notify == 'notify' ) {
echo 'success';
}
}
有了异步通知的方法,支付接口的开发才算是完整的,就是用户支付完成后关闭了支付网关页面,发起支付的网站也能很快判断用户的支付状态,并根据用户的支付状态做出自动处理订单、自动发货等后续的业务处理。
支付宝微信支付开发的重点
其实在支付宝微信支付开放的过程中,支付接口的对接并不是最重要的部分,接口的注意事项是固定的,总共就有那么多,不会有太多变化。而处理订单的业务逻辑却是千变万化的,而因为支付直接设计到交易,在业务逻辑的处理过程中,我们一定要小心慎重,尽量完整地考虑各种情况的发生及处理方法,这样才能做到万无一失。