0

我正在使用 PayPal IPN。我正在使用我使用多年的脚本并且从未遇到任何问题,但是,现在我正在使用 MassPay API 并在单个请求中包含 250 个。因此,发送的 IPN 数据比我通常处理的要大得多,并且不知何故我正在丢失数据。

在我的 IPN 脚本中,我要做的第一件事是序列化 POST 数据并将其保存到 MySQL 中的 TEXT 字段。当我这样做时,我没有从 PHP 或 MySQL 得到任何错误,并且数据很好地显示在我的表中,但是,当我将其与显示的内容进行比较时,它几乎丢失了 POST 中实际包含的数据的一半在 PayPal IPN 历史记录日志中。

除了保存原始 IPN 数据之外,我还在脚本中遍历所有 MassPay 项目以单独处理付款。这是我如何在 IPN 中编译所有个人批量付款的 PHP 片段...

// Mass Payments   
$i = 1;   
$mass_payments = array();   
while(isset($_POST['masspay_txn_id_' . $i]))   
{   
 $masspay_txn_id = isset($_POST['masspay_txn_id_' . $i]) ? $_POST['masspay_txn_id_' . $i] : '';   
 $mc_currency = isset($_POST['mc_currency_' . $i]) ? $_POST['mc_currency_' . $i] : '';   
 $mc_fee = isset($_POST['mc_fee_' . $i]) ? $_POST['mc_fee_' . $i] : 0;   
 $mc_gross = isset($_POST['mc_gross_' . $i]) ? $_POST['mc_gross_' . $i] : 0;   
 $receiver_email = isset($_POST['receiver_email_' . $i]) ? $_POST['receiver_email_' . $i] : '';   
 $status = isset($_POST['status_' . $i]) ? $_POST['status_' . $i] : '';   
 $unique_id = isset($_POST['unique_id_' . $i]) ? $_POST['unique_id_' . $i] : '';   

 $current_payment_data_set = array(   
          'masspay_txn_id' => $masspay_txn_id,   
          'mc_currency' => $mc_currency,   
          'mc_fee' => $mc_fee,   
          'mc_gross' => $mc_gross,   
          'receiver_email' => $receiver_email,   
          'status' => $status,   
          'unique_id' => $unique_id  
         );   

 array_push($mass_payments, $current_payment_data_set);   
 $i++;   
}

同样,我没有收到任何 PHP 警告、通知、错误等,并且 IPN 脚本成功完成,结果为 200 OK,但是,我系统中的一半付款记录没有像应有的那样更新,因为它们是不包括我从 PayPal 得到的东西。确实出现在我收到的 IPN 数据中的数据会在我的系统中按预期更新。

同样,当我检查 PayPal IPN 历史记录时,它显示 IPN 包含了我似乎丢失的所有数据,当我比较两者时,IPN 历史记录中的一个是从 masspay_txn_id_1 到 masspay_txn_id_250 的所有数据。它对所有东西都有唯一的 ID,等等。不过,我的脚本只看到唯一的 ID 100 - 199,它遗漏了许多其他通用的东西,比如 txn_type。

是否有任何服务器设置或任何可能导致我丢失 POST 数据的东西,即使我在任何地方都没有收到任何错误?

更新 我最终采取了 PayPal IPN 历史显示的内容,其中包括所有内容,并将其放入一个 PHP 脚本中,该脚本将数据发布到我的 IPN 侦听器。不过,我仍然在丢失数据,所以我的服务器以某种方式截断了 POST 数据,但没有给我任何警告或任何东西。不过,我没有找到任何有关可能导致此问题或如何解决此问题的信息..??

任何有关这方面的信息将不胜感激。谢谢!

4

2 回答 2

0
file_put_contents('ipnlog.txt', print_r($_POST, true), FILE_APPEND);

数据在吗?

我记得有一个问题,IPN 消息被限制在一定的字节大小并被切断,但我不知道细节。

于 2013-07-02T22:20:22.023 回答
0

好的,我解决了这个问题。原来在 PHP 中有一个隐藏的 gem,max_input_vars,在许多情况下默认为 1k。在我的服务器上确实是这种情况,并导致我的 POST 数据在 1k 名称/值对处被截断。

我在 php.ini 中添加了以下行并重新启动了 Apache,现在一切都很好。

max_input_vars=3000
于 2013-07-05T10:16:53.613 回答