我正在使用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数据但没有给我任何警告或任何东西。我找不到任何可能导致这种情况或如何修复它的信息,但是...... ??
有关此的任何信息将不胜感激。谢谢!
答案 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