2012-11-26 44 views
3

我只是在這裏測試PayPal IPN。我已經設置了沙箱。我發送假IPN請求,並且它正在接收IPN。然後,我得到它來返回驗證信息,並且我正在寫一個文本文件的響應,以便我可以自己檢查。 IPN正在開火,並且響應正在寫入文本文件。Paypal IPN獲得空白確認(應該是「VERIFIED」或「無效」)

只有一個問題......答案是空白的。

回覆應該被認爲是「VERIFIED」或「INVALID」,並且這些是唯一的2個可能的回答......所以發生了什麼= S。任何幫助是極大的讚賞。

整個代碼下面貼:

$ipn_post_data = $_POST; 

$response = ""; 

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

    // Set up request to PayPal 
    $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, 
     CURLOPT_SSL_VERIFYPEER => TRUE, 
     CURLOPT_CAINFO => 'cacert.pem', 
    )); 

    // Execute request and get response and status code 
    $response = curl_exec($request); 
    $status = curl_getinfo($request, CURLINFO_HTTP_CODE); 

    // Close connection 
    curl_close($request); 


$fh = fopen("ipntest.txt", 'a+'); 
$date = date("Y-M-j H:i"); 
fwrite($fh, $date . " Response: " . $response . "\n"); 
fclose($fh); 

if($status == 200 && $response == 'VERIFIED') 
{ 
    // All good! Proceed... 
} 
else 
{ 
    // Not good. Ignore, or log for investigation... 
} 

文本文件輸出:

2012-Nov-26 23:24 Response: 
2012-Nov-26 23:25 Response: 

我一直在使用這個代碼之前,我一直在試圖得到它的一個星期工作,所以這不僅僅是一個暫時的失敗或者什麼......

乾杯傢伙。

+1

給這個圖書館一試:https://github.com/Quixotix/PHP-PayPal-IPN 我在開發的某些點有同樣的問題。 ..我退出故障排除並開始使用這個夢幻般的圖書館。 – eldblz

+1

這可能只是一個https的事情。你確定了curl_exec()的返回值嗎?它可能是假的嗎? –

+0

這個eldblz的Bigups,這使我的生活如此之多問題在於我沒有CA文件,請參閱答案I張貼在下面。 – connorbode

回答

3

所以只是以供將來參考,爲人與此相同的問題:

這裏是沒有一個CA文件的問題。

我不確定CA文件的確切含義,但我知道它與Paypal的SSL證書有關並建立SSL連接。當我開始尋找捲曲的錯誤,我看到以下內容:

[27-Nov-2012 21:46:11 UTC] cURL error: [77] error setting certificate verify locations: 
    CAfile: /etc/ssl/certs/api_cert_chain.crt 
    CApath: /etc/ssl/certs 

快速的解決方案,我發現下載IpnListener.php級。 (這是由eldblz推薦的,它使IPN處理方式變得更容易,併爲我沒有CAFile提供了一個解決方案,如果你下載了整個IpnListener.php包,它包含一個名爲cert的文件夾,其中包含api_cert_chain.crt你所需要的,並且已經配置它使用

+2

建立SSL連接時,服務器將返回自己的證書(用於保護連接)以及一系列導致權限的中間證書;後者然後在證書頒發機構捆綁文件(CA文件)中查找並進行驗證,以確保您正在與正確的人交談。希望有幫助:) –

+1

實際的問題是,你沒有檢查'curl_exec()'的結果,在這種情況下它是'false';然後用'curl_error($ ch)'你可以檢查錯誤是什麼。 –

0

我一直使用以下命令,它很好地工作......

// Validate with curl 
$curl_result=$curl_err=''; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,'https://'.$ppHost.'/cgi-bin/webscr'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req))); 
curl_setopt($ch, CURLOPT_HEADER , 1); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 

$curl_result = curl_exec($ch); 
$curl_err = curl_error($ch); 
curl_close($ch); 

//are we verified? If so, let's process the IPN 
if (strpos($curl_result, "VERIFIED")!==false) 
    $valid = true; 
else 
    $valid = false; 

你只需要確保$ ppHost此示例中是正確的取決於交易是否從沙箱或來在線服務器,然後相應地填寫$ req和$ ssl。

0
class Paypal_IPN 
{ 
    /** @var string $_url The paypal url to go to through cURL 
    private $_url; 

    /** 
    * @param string $mode 'live' or 'sandbox' 
    */ 
    public function __construct($mode = 'live') 
    { 
     if ($mode == 'live') 
     $this->_url = 'https://www.paypal.com/cgi-bin/webscr'; 

     else 
     $this->_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; 
    } 

    public function run() 
    { 
     $postFields = 'cmd=_notify-validate'; 

     foreach($_POST as $key => $value) 
     { 
      $postFields .= "&$key=".urlencode($value); 
     } 

     $ch = curl_init(); 

     curl_setopt_array($ch, array(
      CURLOPT_URL => $this->_url, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_SSL_VERIFYPEER => false, 
      CURLOPT_POST => true, 
      CURLOPT_POSTFIELDS => $postFields 
     )); 

     $result = curl_exec($ch); 
     curl_close($ch); 

     $fh = fopen('result.txt', 'w'); 
     fwrite($fh, $result . ' -- ' . $postFields); 
     fclose($fh); 

     echo $result; 
    } 
} 

稱這種現象的另一個PHP文件:

<?php 
require 'Paypal_IPN.php'; 
$paypal= new Paypal_IPN('sandbox'); 
$paypal->run(); 

?>