Paypal 付款数据传输 (PDT) 错误 4002

Posted

技术标签:

【中文标题】Paypal 付款数据传输 (PDT) 错误 4002【英文标题】:Paypal Payment Data Transfer(PDT) Error 4002 【发布时间】:2014-01-13 21:54:38 【问题描述】:

我正在努力将我的网站与贝宝集成,并使其在沙盒模式下运行。我在 Codeigniter (php) 工作。我已经让 IPN 通知正常工作,但似乎无法弄清楚我在 PDT 上哪里出了问题(需要这个来显示正确的确认页面并返回)。我已经多次检查身份令牌,确保 htaccess 文件不会限制回调访问,确保电子邮件已针对业务领域进行验证,确保所有内容都进入沙盒而不是实时站点,并制作确保使用正确的参数启用自动返回,甚至询问技术支持(没有得到任何有用的帮助)。但我不断收到“FAIL”的返回 ($response),错误代码为 4002。任何有关如何调试此问题的帮助将不胜感激。

这是我的表格:

<form class="paypal login" action="http://########.com/paypal/purchase" method="post" id="paypal_form">    
    <fieldset id="inputs">
        <input type="hidden" name="first_name" value=""> 
        <input type="hidden" name="last_name" value="">
        <input type="hidden" name="email" value="">
        <input type="hidden" name="quantity" value="">
        <input type="hidden" name="order_tc_id" value="###########">
    </fieldset>
    <fieldset id="actions">
        <input type="submit" id="paypal-btn" class="paypal-order"  value="Purchase"/>
    </fieldset>
</form>

这里是它的去处:

$querystring = '?';
$querystring .= "business=".urlencode("paypal@#######.net")."&";
$querystring .= "cmd=".urlencode("_xclick")."&";
$querystring .= "amount=".urlencode(krw_usd($items_no_tax_price))."&";
$querystring .= "rm=".urlencode(2)."&";
$querystring .= "quantity=".urlencode($quant)."&";
$querystring .= "first_name=".urlencode($first_name)."&";
$querystring .= "last_name=".urlencode($last_name)."&";
$querystring .= "email=".urlencode($email)."&";
$querystring .= "currency_code=".urlencode("USD")."&";
$querystring .= "return=".urlencode(stripslashes($return_url))."&";
$querystring .= "cancel_return=".urlencode(stripslashes($cancel_url))."&";
$querystring .= "notify_url=".urlencode(stripslashes($notify_url));

header('location:https://www.sandbox.paypal.com/cgi-bin/webscr'.$querystring);

这里是返回网址:

$request = curl_init();

curl_setopt_array($request, array
(
  CURLOPT_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr',
  CURLOPT_POST => 1,
  CURLOPT_POSTFIELDS => http_build_query(array
    (
      'cmd' => '_notify-synch',
      'tx' => $tx,
      'at' => '#############################',
    )),
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_HEADER => 0,
));

$response = curl_exec($request);
$status   = curl_getinfo($request, CURLINFO_HTTP_CODE);

curl_close($request);

$response = substr($response, 7);
$response = urldecode($response);

preg_match_all('/^([^=\s]++)=(.*+)/m', $response, $m, PREG_PATTERN_ORDER);
$response = array_combine($m[1], $m[2]);

if(isset($response['charset']) AND strtoupper($response['charset']) !== 'UTF-8')

  foreach($response as $key => &$value)
  
    $value = mb_convert_encoding($value, 'UTF-8', $response['charset']);
  
  $response['charset_original'] = $response['charset'];
  $response['charset'] = 'UTF-8';


ksort($response);

foreach($response as $k=>$v)

    echo "Key: " . $k . ", Value: " . $v;
    echo "<br>";

【问题讨论】:

返回url好像有问题,paypal付款后无法返回,给你4002(内部错误)。请确保您可以到达您指定的返回网址 感谢您的回答,但我认为返回 url 绝对可以访问,因为重定向完美地到达那里。并且 IPN 通知可以毫无问题地到达其具有相同设置的类似路由的页面。 【参考方案1】:

$tx_token = strtoupper($_GET['tx']),它的工作。

【讨论】:

不清楚你建议 OP 应该做什么。您是说在将交易 ID 发送到 PayPal 之前将其转换为大写应该可以解决他们的问题吗?如果是这样,你能解释一下原因吗? 是的,发送前转换交易ID 哇,这实际上似乎是问题所在。在 2015 年 5 月 7 日左右,我们开始出现间歇性 PDT 通知同步失败,错误为 4002——代码已经运行了一段时间。我可以确认curl --data 'cmd=_notify-synch&amp;tx=abcde12345&amp;at=MyToken' https://www.paypal.com/cgi-bin/webscr 失败,但与 tx 大写的完全相同的命令成功(其中“abcde12345”是返回 url 中提供的 tx PayPal,MyToken 是我们的实时 PayPal 令牌)。 是的,我在paypal notify的返回数据中看到tx是大写​​的 似乎有一个最近引入的(2015 年 5 月)PayPal 错误,其中 PayPal 将 all 的 return-url 查询参数转换为小写 - 这可能需要解决方法您自己的 PDT 代码。该错误在用户单击事务结束时的“单击此处返回...”链接时发生。 (如果他们等待自动重定向回您的站点,则参数是正确的情况。)我已向 PayPal 报告;回复后会更新。

以上是关于Paypal 付款数据传输 (PDT) 错误 4002的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 中的 IPN 与 PDT

如果客户在完成付款后关闭浏览器,如何获得 PayPal PDT?

使用 Paypal ipn 和 pdt 进行付款

PayPal IPN 和 PDT 突然不再工作了

PDT 的 PayPal 方向与沙盒设置不匹配

Paypal PDT 未返回所有变量