paypal支付状态有4种,预授权,完成收款,交易作废,退款。今天朋友联系我说他的网站,预授权和交易作废不能正常处理了。完成收款和退款的回调确都能正常处理。
我看了一下代码,支付回调的处理都在一个方法里面,而且他说之前都是可以正常处理的,最近一段时间才出现这种情况。
我看了一下代码,没什么异常,其中几行是这样:
$post = request()->post();
$url = 'https://' . config('paypal')['action'] . '/cgi-bin/webscr';
$data['cmd'] = '_notify-validate';
foreach ($post as $key => $item) $data[$key] = ($item);
$res = http($url, $data, 'POST');
$res返回的是INVALID,搜了一下PayPal的文档,其中有说到除了附加一个名为cmd,值为_notify-validate的变量,这里发送的所有表单变量必须与接收到的完全相同。PayPal通过检查加密字符串对交易进行认证。然后在响应正文中以一个词(VERIFIED或INVALID)发回确认。
看着个说明,好像没有什么问题,但“发送的所有表单变量必须与接收到的完全相同”引起了我的注意,于是试着把代码改成这样:
$url = 'https://' . config('paypal')['action'] . '/cgi-bin/webscr';
$data = 'cmd=_notify-validate&' . file_get_contents("php://input");
$res = http($url, $data, 'POST');
经测试,paypal对接回调验证_notify-validate报INVALID问题完美解决。
原来的代码出现问题,可能是框架内置的处理方法对数据的编码或其他特殊字符产生了影响