Paypal IPN现在返回无效- PHP代码以前工作正常


Paypal IPN now returns INVALID - PHP code previously working fine

我使用下面的类来处理IPN数据:https://github.com/WadeShuler/PHP-PayPal-IPN(它已经工作很长时间了)

最后一次成功处理的付款是在9月28日,下一个IPN付款是在10月5日,返回了一个无效的响应,从那以后每次付款都是无效的。

如果我在IPN模拟器中测试,消息处理成功。沙箱或活动,响应无效。我本以为沙盒会有一个设施,我可以审查为什么一个消息被拒绝为无效,但这似乎不是情况?这当然是看到拒绝原因的简单方法,我错过了什么吗?

把你从我的网站带到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&currency_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&notify_url=http://www.fydentry.com/payback-test.php

从Paypal传回的数据是:

transaction_subject = 0001000003, txn_type = web_accept& payment_date = 07% 3 a05 % 3 a07 + 2015年10月+ 15% 2 c + + PDT& last_name = buyer& residence_country = AU& pending_reason = multi_currency& item_name =昆士兰太平洋+松树+二次+ + + % 28坐+ 25 + 7 + % 29,payment_gross =, mc_currency = AUD&业务= sales-facilitator % 40 fydentry.com& payment_type = instant& protection_eligibility = Ineligible& verify_sign = Acssfl2b2v1gxOK33TD2StcDhf-OAZxwix74kxFlSgpWMku6myuy.WFL& payer_status = verified& test_ipn = 1,税= 0.00,payer_email = sales-buyer % 40 fydentry.com& txn_id = 9 bv63134e20871700&数量= 1,receiver_email = sales-facilitator % 40 fydentry.com& first_name = test& payer_id = FY3RYW98GNMXG& receiver_id = 95 fc3qck53mhc& item_number = FYD15000003& handling_amount = 0.00, payment_status = Pending&航运= 0.00,mc_gross = 0.01,自定义= 0001000003,charset = windows - 1252, notify_version = 3.8, ipn_track_id = cfbd422d97d69

我发送回Paypal的响应是:

cmd = _notify-validate& transaction_subject = 0001000003, txn_type = web_accept& payment_date = 07% 3 a05 % 3 a07 + 2015年10月+ 15% 2 c + + PDT& last_name = buyer& residence_country = AU& pending_reason = multi_currency& item_name =昆士兰太平洋+松树+二次+ + + % 28坐+ 25 + 7 + % 29,payment_gross =, mc_currency = AUD&业务= sales-facilitator % 40 fydentry.com& payment_type = instant& protection_eligibility = Ineligible& verify_sign = Acssfl2b2v1gxOK33TD2StcDhf-OAZxwix74kxFlSgpWMku6myuy.WFL&payer_status = verified& test_ipn = 1,税= 0.00,payer_email = sales-buyer % 40 fydentry.com& txn_id = 9 bv63134e20871700&数量= 1,receiver_email = sales-facilitator % 40 fydentry.com& first_name = test& payer_id = FY3RYW98GNMXG& receiver_id = 95 fc3qck53mhc& item_number = FYD15000003& handling_amount = 0.00, payment_status = Pending&航运= 0.00,mc_gross = 0.01,自定义= 0001000003,charset = windows - 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 $debug_response;

并在使用它之前存储它的值:

        $this->debug_response = $req;
        if ($this->use_curl) {
            $res = $this->curlPost($req);
        } else {
            $res = $this->fsockPost($req);
        }

我假设贝宝方面发生了一些变化,首先阻止这种工作,但我看不出它是什么,特别是因为我的反应似乎是正确的(相同),我在沙盒方面找不到任何东西,帮助我确定为什么它被视为无效?不幸的是,我在底部跟踪IPN帖子数据和响应的调试代码是新的,所以我没有较旧的(工作的!)消息集来比较内容。

哼,从10月1日起paypal将sha-1改为sha-2https://www.paypal-knowledge.com/infocenter/index?page=content& id = FAQ1766&扩大= true&地区= en_US

我已经找到了它的底部,它似乎是一个证书问题,结合一个脚本错误。

我的证书文件是过期的,目前在韦德的代码。我发现了这个问题,昨天更新了证书文件。我现在已经证实这是我最初失败的根本原因。

然而,在更新的同时,我也更新到了最新的类——这实际上只是删除了一些我不使用并且不再支持的废弃代码,但是我错过了一个小的改变,它破坏了东西。

在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系统没有。