2012-08-12 151 views
0

我想從PayPal獲得IPN工作,但它不斷返回INVALID而不是VERIFIED,我看不到我做錯了什麼。PayPal IPN不返回驗證

目前,我有2個PHP文件使用貝寶開發人員網站的示例代碼。代碼似乎運行良好,我使用​​,所以我可以看到付款被轉移,所以我不明白爲什麼我得到INVALID

有人可以看看代碼,因爲我看不到我做錯了什麼。

1. basic_payment.php(在該付款數據發送到貝寶文件)

<?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('[email protected]'); 
    $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 = "[email protected]"; 
    $from = "[email protected]"; 
    $subject = "response"; 
    $message = "<pre>".print_r($status,true)." - ".print_r($response,true)."</pre>\n"; 

    $header = 'To: Oshirowanen <[email protected]>' . "\r\n"; 
    $header .= 'From: Me <[email protected]>' . "\r\n"; 

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

?> 

錯誤消息:

Apache的錯誤日誌 - 沒有錯誤

這就是爲什麼我在ipn.php增加了電子郵件的東西,儘量爭取什麼,它返回:

<pre>200 - INVALID</pre>

任何人都可以看到我做錯了什麼?

+0

PayPal API是否有一個地方告訴你它發送給服務器的內容?我們可以看到這些數據嗎? – David 2012-08-12 20:16:33

+0

@大衛,我已經添加了你請求的代碼。 – oshirowanen 2012-08-12 20:38:31

+0

我已經更新了這個問題,希望能夠更容易理解。 – oshirowanen 2012-08-13 12:19:00

回答

1
  1. 得到它的工作使用basic sample code 4B,

  2. 從基本樣本代碼清$ipnNotificationUrl = "";,因爲我曾在我加入自己有沒有價值,

  3. 創建賣家帳戶,而不是沙盒中的商業專業帳戶,

  4. 設置賣家帳戶以啓用ipn網址,

  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網址,但賣家帳戶呢。

1

這對我造成了困擾。 你所談論的是2種不同IPTN消息:

  1. 第一,一個從你的問題,它的網址被配置在ipnNotificationUrl,進入網站,中間體的交易。通過將參數發送回PayPal無法驗證這一個;因爲您可以自己將參數添加到該網址,因此可以實施安全性的HMAC機制。

  2. 如果在設置中啓用IPTN,則第二個來自您的解決方案的帳戶將轉到接收資金的帳戶。可以通過將參數發送回PayPal進行驗證。

如果您爲這兩個郵件設置了相同的URL,那麼您可以同時使用這兩個郵件,但只能使用Paypal進行驗證。如果賣方和網站是不同的實體,換句話說,如果網站只是中間買賣雙方之間的交易,網站會收到第一個,賣方則收到第二個。