我使用以下类来处理IPN数据: https://github.com/WadeShuler/PHP-PayPal-IPN(并且它已经很好地工作了很长时间)
上一次成功处理的付款是在9月28日,但是10月5日发出的下一次IPN付款返回了INVALID的回复,自那以后每次付款都是如此。
如果我在IPN模拟器中测试,则消息会成功处理。 Sandbox或Live,响应是INVALID。我本以为Sandbox会有一个工具,我可以查看为什么邮件被拒绝作为INVALID,但似乎并非如此?肯定是看到拒绝原因的简单方法,我错过了什么吗?
从我的网站带您到Paypal的链接是:
https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_ext-enter&redirect_cmd=_xclick&business=sales-facilitator@fydentry.com&item_name=QLD++%28Pacific+pines+secondary+Sat+25th+July+%29&item_number=FYD15000003&custom=0001000003¤cy_code=AUD&amount=0.01&no_shipping=1&image_url=http://www.fydentry.com/img/follow-your-dreams-100.jpg&return=http://www.fydentry.com/entry-test.php&cancel_return=http://www.fydentry.com/entry-test.php¬ify_url=http://www.fydentry.com/payback-test.php
从Paypal发回的数据是:
transaction_subject = 0001000003&安培; txn_type = web_accept&安培; PAYMENT_DATE = 07%3A05%3A07 +十月+ 15%2C + 2015 + PDT&安培;姓氏=买方安培; residence_country = AU&安培; pending_reason = multi_currency&安培; ITEM_NAME = QLD ++%28Pacific +松树+二次+周六+ 25 +月+%29&安培; payment_gross =安培; mc_currency = AUD&放大器;企业=销售调解人%40fydentry.com和放大器; payment_type =即时和放大器; protection_eligibility =不符合条件和放大器; verify_sign = Acssfl2b2v1gxOK33TD2StcDhf-OAZxwix74kxFlSgpWMku6myuy.WFL和放大器; payer_status =验证和放大器;的test_ipn = 1&安培;税= 0.00&安培; PAYER_EMAIL =销售买方%40fydentry.com&安培; txn_id = 9BV63134E20871700&安培;数量= 1&安培; RECEIVER_EMAIL =销售主持人%40fydentry.com&安培;如first_name =试验&安培; payer_id = FY3RYW98GNMXG&安培; receiver_id = 95FC3QCK53MHC&安培; ITEM_NUMBER = FYD15000003&安培; handling_amount = 0.00&安培; PAYMENT_STATUS =待定&安培;航运= 0.00&安培; mc_gross = 0.01&安培;定制= 0001000003&安培;字符集=窗口1252&安培; notify_version = 3.8&安培; ipn_track_id = cfbd422d97d69
我发回Paypal的回复是:
CMD = _notify-验证&安培; transaction_subject = 0001000003&安培; txn_type = web_accept&安培; PAYMENT_DATE = 07%3A05%3A07 +月+ 15%2C + 2015 + PDT&安培;姓氏=买方安培; residence_country = AU&安培; pending_reason = multi_currency&安培; ITEM_NAME = QLD ++ %28Pacific +松树+次级+周六+ 25 +月+%29&安培; payment_gross =安培; mc_currency = AUD&放大器;企业=销售调解人%40fydentry.com和放大器; payment_type =即时和放大器; protection_eligibility =不符合条件和放大器; verify_sign = Acssfl2b2v1gxOK33TD2StcDhf-OAZxwix74kxFlSgpWMku6myuy.WFL和放大器; payer_status =验证&安培;的test_ipn = 1&安培;税务= 0.00&安培; PAYER_EMAIL =销售买方%40fydentry.com&安培; txn_id = 9BV63134E20871700&安培;数量= 1&安培; RECEIVER_EMAIL =销售主持人%40fydentry.com&安培;如first_name =试验&安培; payer_id = FY3RYW98GNMXG&安培; receiver_id = 95FC3QCK53MHC&安培; ITEM_NUMBER = FYD15000003&安培; handling_amount = 0.00&安培; PAYMENT_STATUS =待定&安培;航运= 0.00&安培; mc_gross = 0.01&安培;定制= 0001000003&安培;字符集=窗口1252&安培; notify_version = 3.8&安培; ipn_track_id = cfbd422d97d69
payback-test.php中的代码是:
<?php
include_once("f_common.php");
include_once("IpnListener.php");
use wadeshuler\paypalipn\IpnListener;
$listener = new IpnListener();
$listener->use_sandbox = true;
$dbh = open_db();
$res = 'UNKNOWN';
try {
$listener->requirePostMethod();
$verified = $listener->processIpn();
} catch (Exception $e) {
error_log($e->getMessage());
exit(0);
}
if ($verified) {
$res = "VERIFIED";
} else {
$res = "INVALID";
}
$stmt_debug = $dbh->prepare('INSERT INTO fyd_paypal_ipn (post_data, response_data, status, message_time) VALUES (:post_data, :response_data, :status, UTC_TIMESTAMP())');
$stmt_debug->execute(array(':post_data' => $listener->rawPostData, ':response_data' => $listener->debug_response, ':status' => $res));
?>
请注意,为了本练习的目的,我还修改了IpnListener类,以便我可以获得响应的副本以进行调试。
在变量声明的文件顶部,我将$ rawPostData设为public,并添加了这个变量:
public $debug_response;
在我们使用之前存储价值:
$this->debug_response = $req;
if ($this->use_curl) {
$res = $this->curlPost($req);
} else {
$res = $this->fsockPost($req);
}
我假设Paypal方面的某些内容已经改变,以便首先停止此工作,但我无法看到它是什么,特别是因为我的回答似乎是正确的(相同),并且我无法在沙盒方面找到任何可以帮助我确定为何被视为无效的内容?不幸的是,我跟踪IPN发布数据和响应的底部的调试代码是新的,因此我没有一组较旧的(工作!)消息来比较内容。
答案 0 :(得分:1)
答案 1 :(得分:0)
我已经深究它,它似乎是一个证书问题,加上脚本错误。
我的证书文件已经过时了,目前在韦德的代码中。我发现并昨天更新了证书文件。我现在已经证实这是我原来失败的根本原因。
然而,在更新时,我还更新到了最新的类 - 这实际上只是删除了一些我不使用的已弃用的代码,并且不再受支持,但是我错过了一个小的改变,这破坏了事情。 / p>
IpnListener类中有一行设置证书位置:
curl_setopt($ch, CURLOPT_CAINFO, dirname(dirname(__FILE__)) . '/cert/api_cert_chain.crt');
但是我的服务器上的目录名称结尾错误,它无法找到证书。该类的先前版本为:
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cert/api_cert_chain.crt');
哪个有效。现在我已经改回来,一切都恢复了。请注意,我工作的域名设置在我的主域的子目录中,这可能是为什么新代码最终指向错误的位置(高于我需要它的位置)。
我仍然对IPN模拟器的工作原理感到困惑,而Sandbox和Live系统却没有。