Paypal IPN未返回VERIFIED

时间:2012-08-12 20:11:11

标签: php paypal paypal-ipn paypal-sandbox

我正试图让PayPal的IPN工作,但它不断返回INVALID而不是VERIFIED,我看不出我做错了什么。

目前,我有2个php文件,使用来自paypal开发者网站的示例代码。代码似乎运行良好,我正在使用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中添加电子邮件以尝试捕获某些内容的原因,并且它正在返回:

<pre>200 - INVALID</pre>

谁能看到我做错了什么?

2 个答案:

答案 0 :(得分:1)

  1. 使用basic sample code 4b,

  2. 工作
  3. 从基本示例代码中清除$ipnNotificationUrl = "";,因为我在那里添加了一个我自己添加的值,

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

  5. 设置卖家帐户以启用ipn网址

  6. 使用以下PHP 5.2 sample code作为ipn侦听器

  7. 在监听器中添加了2行,如here所述,可以在下面看到2行:

  8. cacert.pem证书从here下载到我的服务器并将其放在与ipn listener相同的目录中:

  9. 第6点提到的2行:

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

    我不知道为什么沙盒业务专业版帐户不允许我设置ipn网址,但卖家帐户会这样做。

答案 1 :(得分:1)

这对我来说也引起了混乱。 你在谈论的是两种不同的IPTN消息:

  1. 第一个,你问题中的一个,它的url在ipnNotificationUrl中配置,转到中间化事务的站点。通过将参数发送回Paypal无法验证此问题;由于您可以自己将参数添加到该URL,因此可以实施HMAC安全机制。

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

  3. 如果您为这两个邮件设置了相同的网址,则可以同时获取这两个邮件,但只有一个可以使用Paypal进行验证。如果卖方和网站是不同的实体,换句话说,如果网站只是买方和卖方之间的交易中介,则网站收到第一个,卖方收到第二个。