【问题标题】:How am I losing POST data within my PayPal IPN script..?我如何在我的 PayPal IPN 脚本中丢失 POST 数据..?
【发布时间】:2013-06-30 11:13:33
【问题描述】:

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

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

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

// 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 数据,但没有给我任何警告或任何东西。不过,我没有找到任何有关可能导致此问题或如何解决此问题的信息..??

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

【问题讨论】:

  • 在循环完成后执行var_dump($mass_payments),看看你的代码有什么结果。确保数据在前往贝宝之前就在那里。请注意,循环将在 FIRST 缺少的数字处终止,因此如果您的字段发生跳转(例如,99 => 101),则缺少 100 将导致循环中止并提前退出。跨度>
  • 我不确定我是否关注你..??这是我从 PayPal 收到的数据,而不是发送给他们的数据。至少目前不是。我正在使用 MassPay API 生成付款,当我仔细检查那里生成的请求时,它确实有我期望的所有付款。 PayPal 帐户中的批量支付交易也正确地分解了所有付款,并显示有多少已完成、无人认领等,这一切都很好。只是不知何故我在没有任何来自 PHP 的错误/通知的情况下丢失数据。
  • 我想知道,即使 PayPal IPN 历史记录显示了所有数据,它实际上并没有全部发送。也许 PayPal 系统以某种方式记录了它要发送的内容,但是当它发送它时,它会被截断或类似的东西。我无法证明这一点,所以我所能做的就是反驳我正在丢失数据,但我需要一些针对此类事情的故障排除技巧。
  • 文本不太可能有问题,但是你的 post_max_size 值是多少?
  • post_max_size 为 100M

标签: php apache paypal paypal-ipn


【解决方案1】:
file_put_contents('ipnlog.txt', print_r($_POST, true), FILE_APPEND);

有数据吗?

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

【讨论】:

  • 好的,我这样做了,它很好地保存了数据,但我仍然只得到大约 1k 个参数,其中 PayPal 中的 IPN 历史显示它向我发送了 2k+。因此,要么 PayPal 没有像 IPN 历史所说的那样向我发送数据,要么我的服务器没有处理所有数据..??
  • 不能肯定地说,但我相信它可能只发送前 1k 的数据,是的。我曾经遇到过与订单项类似的问题。
【解决方案2】:

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

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

max_input_vars=3000

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 2011-01-09
    • 2015-09-26
    • 1970-01-01
    • 2010-11-10
    • 2018-02-05
    • 2015-07-04
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多