2010-05-17 85 views
1

我正在實施PayPal IPN & PDT。在沙箱中頭痛&時間後,IPN運行良好,PDT返回正確的$ _GET數據。實現如下:在形式上與貝寶PayPal集成困境:PDT在返回網站時掛起

  • 通行證用戶ID
  • 用戶購買產品,並觸發IPN這對於給定的用戶ID更新數據庫
  • PDT返回事務ID,當用戶返回網站
  • 返回頁面上顯示「請稍候」,並重復的Ajax-檢查交易情況
  • 用戶被重定向到成功/失敗頁面

一切運行良好,除了使用PayPal就緒的PHP代碼用於PDT執行返回POST時,頁面會掛起。用戶永遠不會回到我的網站。我沒有失敗,只是沒有。有趣的是,一旦發生未知錯誤,我的測試域在短時間內變得無響應。

代碼(PHP):https://www.paypal.com/us/cgi-bin/webscr?cmd=p/xcl/rec/pdt-code-outside

如果我註釋掉POST回來,這一切工作正常。一旦代碼進入while循環,我可以將問題固定下來。不幸的是,我沒有足夠的經驗來從頭開始爲PayPal代碼編寫替代品,所以如果有什麼可能會出錯的想法,我會非常感激。

POST返回到ssl://www.sandbox.paypal.com,我使用的按鈕代碼和授權令牌都是通過沙箱測試帳戶創建的。

在此先感謝。

UPDATE:

我已經縮小問題到這一行:$line = fgets($fp, 1024);

它只是掛,我不知道爲什麼。

回答

1

解決:

切換到捲曲解決所有問題。下面是萬一有人來此,是因爲絕望,因爲我是代碼:

// Prepare data 
$req = 'cmd=_notify-synch'; 
$tx_token = $_GET['tx']; 
$auth_token = '<-- your token (sandbox or live) -->'; 
$req .= '&tx='.$tx_token.'&at='.$auth_token; 
// Post back to PayPal to validate 
$c = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); // SANDBOX 
curl_setopt($c, CURLOPT_POST, true); 
curl_setopt($c, CURLOPT_POSTFIELDS, $req); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
$contents = curl_exec($c); 
$response_code = curl_getinfo($c, CURLINFO_HTTP_CODE); 
curl_close($c); 
if(!$contents || $response_code != 200) { 
    // HTTP error or bad response, do something 
} else { 
    // Check PayPal verification (FAIL or SUCCESS) 
    $status = substr($contents, 0, 4); 
    if($status == 'FAIL') { 
     // Do fail stuff 
    } elseif($status == 'SUCC') { 
     // Do success stuff 
    } 
} 

技術上,SUBSTR()不檢查「成功」,但「SUCC」。但是,鑑於只有「成功」或「失敗」纔是可能的價值觀,這並不重要。

這個代碼也適用於IPN,並有明顯的小修改。