我如何在PayPal IPN脚本中丢失POST数据..?

时间:2013-07-02 22:00:54

标签: php apache paypal paypal-ipn

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

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

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

// 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数据但没有给我任何警告或任何东西。我找不到任何可能导致这种情况或如何修复它的信息,但是...... ??

有关此的任何信息将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

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

那里有数据吗?

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

答案 1 :(得分:0)

好的,我解决了这个问题。事实证明,PHP中存在一个隐藏的宝石max_input_vars,在许多情况下默认为1k。在我的服务器上确实如此,导致我的POST数据被截断为1k名称/值对。

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

max_input_vars=3000