【问题标题】:Paypal IPN not returning VERIFIEDPaypal IPN 未返回已验证
【发布时间】:2012-08-12 20:11:10
【问题描述】:

我正在尝试从 PayPal 获取 IPN,但它一直返回 INVALID 而不是 VERIFIED,我看不出我做错了什么。

目前,我有 2 个使用来自 paypal 开发者网站的示例代码的 php 文件。代码似乎运行良好,我使用的是sandbox,所以我可以看到正在转移的付款,所以我不明白为什么我会收到INVALID。

谁能看一下代码,因为我看不到我做错了什么。

1. basic_payment.php(发送支付数据到paypal的文件)

<?php
  require_once ("paypalplatform.php");

  $actionType = "PAY";
  $cancelUrl = "http://[my server details go here]/cancel.php";
  $returnUrl = "http://[my server details go here]/success.php";  
  $currencyCode = "GBP";
  $receiverEmailArray = array( 'seller_15456764326_biz@mail.com' );
  $receiverAmountArray = array( '2' );
  $receiverPrimaryArray = array();
  $senderEmail = "";      
  $feesPayer = "";
  $ipnNotificationUrl = "http://[my server details go here]/ipn.php";
  $memo = "";     
  $pin = "";      
  $preapprovalKey = "";       
  $reverseAllParallelPaymentsOnError = "";        
  $trackingId = generateTrackingID(); 
  $receiverInvoiceIdArray = array( $trackingId );
  $resArray = CallPay ($actionType, $cancelUrl, $returnUrl, $currencyCode, $receiverEmailArray,
                          $receiverAmountArray, $receiverPrimaryArray, $receiverInvoiceIdArray,
                          $feesPayer, $ipnNotificationUrl, $memo, $pin, $preapprovalKey,
                          $reverseAllParallelPaymentsOnError, $senderEmail, $trackingId
  );
  $ack = strtoupper($resArray["responseEnvelope.ack"]);
  if($ack=="SUCCESS")
  {
      if ("" == $preapprovalKey)
      {
          $cmd = "cmd=_ap-payment&paykey=" . urldecode($resArray["payKey"]);
          RedirectToPayPal ( $cmd );
      }
      else
      {
          $payKey = urldecode($resArray["payKey"]);
          $paymentExecStatus = urldecode($resArray["paymentExecStatus"]);
      }
  } 
?>

2。 ipn.php(监听paypals响应的文件)

<?php

    $ipn_post_data = $_POST;

    $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

    $request = curl_init();
    curl_setopt_array($request, array
    (
        CURLOPT_URL => $url,
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data),
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_HEADER => FALSE,
    ));

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

    curl_close($request);

    $to = "oshirowanen@mail.com";
    $from = "me@desktop.com";
    $subject = "response";
    $message = "<pre>".print_r($status,true)." - ".print_r($response,true)."</pre>\n";

    $header = 'To: Oshirowanen <oshirowanen@mail.com>' . "\r\n";
    $header .= 'From: Me <me@desktop.com>' . "\r\n";

    mail($to,$subject,$message,$header);

?>

错误信息:

Apache 错误日志 - 无错误

这就是为什么我在 ipn.php 中添加电子邮件内容以尝试捕获某些内容,并且它正在返回:

&lt;pre&gt;200 - INVALID&lt;/pre&gt;

谁能看出我做错了什么?

【问题讨论】:

  • 难道 PayPal API 没有一个地方可以告诉您它发送到服务器的内容吗?我们能看到这些数据吗?
  • @David,我已经添加了您要求的代码。
  • 我已经更新了这个问题,希望它更容易理解。

标签: php paypal paypal-ipn paypal-sandbox


【解决方案1】:
  1. 使用basic sample code 4b 让它工作,

  2. 从基本示例代码中清除了$ipnNotificationUrl = "";,因为我在其中添加了自己的值,

  3. 在沙盒中创建了卖家帐户而不是商业专业帐户,

  4. 设置卖家账号启用ipn url,

  5. 使用以下 PHP 5.2 sample code 作为 ipn 监听器

  6. 将2行添加到监听器中,如here所述,2行如下:

  7. 将cacert.pem证书从here下载到我的服务器,并放在与ipn监听器相同的目录下:

第 6 点中提到的 2 行:

CURLOPT_SSL_VERIFYPEER => TRUE,
CURLOPT_CAINFO => 'cacert.pem',

我不知道为什么沙盒商业专业帐户不允许我设置 ipn url,但卖家帐户可以。

【讨论】:

    【解决方案2】:

    起初这也让我感到困惑。 你说的是两种不同的IPTN 消息:

    1. 第一个,来自您的问题,它的 url 在 ipnNotificationUrl 中配置,转到中间交易的站点。无法通过将参数发送回 Paypal 来验证这一点;由于您可以自己向该网址添加参数,因此您可以实现HMAC 安全机制。

    2. 如果在设置中启用了IPTN,则第二个,即您的解决方案中的一个,将转到接收资金的帐户。可以通过将参数发送回 Paypal 来验证这一点。

    如果您为两条消息设置了相同的 URL,您将同时获得它们,但只能使用 Paypal 验证一条消息。如果卖家和网站是不同的实体,换句话说,如果网站只是在买家和卖家之间进行交易,那么网站会收到第一个交易,而卖家会收到第二个交易。

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2017-02-17
      • 2014-05-22
      • 2016-05-27
      • 2012-03-09
      • 2016-06-26
      相关资源
      最近更新 更多