2013-06-13 116 views
4

我有一個wordpress 1頁的網站,可以選擇在paypal捐款後下載音樂曲目 - 最低金額爲3.99美元。Paypal IPN Donations

該按鈕工作正常,貝寶付款通過 - 但我只是從貝寶收回無效 - 它似乎沒有寫回正確的貝寶內容。

此外 - 我怎樣才能看到什麼貝寶回覆給我?

任何幫助,非常感謝!

包含的PHP文件中:

<?php echo "<p class='small-donate'>Minimum ammount for donation is $3.99</p> 
<form method='POST' action='' target='_top'> 
$<input type='text' name='donate_amount' value='0' size='4' class='donate-input'> 
<input type='submit' name='submit' value='Donate' class='donate-submit'></form>"; 
if(!empty($_POST['submit'])) { 
// Form has been submitted 
    if($_POST['donate_amount'] >= 3.99) { 
// Redirect to PayPal 
$myurl = site_url(); 
$fileurl = site_url('wp-content/themes/MY_THEME/content-download-file.php'); 
header('Location: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_donations&item_name=Donation for music track&amount='.$_POST['donate_amount'].'&currency_code=USD&business=MY_SANDBOX_TEST_EMAIL&cbt=Download the file&return='.$fileurl.'&cancel_return='.$myurl); 
} 
else { 
echo '<span class="error">Donation must be at least $3.99</span>'; 
} 
} 
?> 

內容下載-file.php內

(我得到這個來自PayPal開發者)

<?php 
// STEP 1: read POST data 

// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST. 
// Instead, read raw POST data from the input stream. 
$raw_post_data = file_get_contents('php://input'); 
$raw_post_array = explode('&', $raw_post_data); 
$myPost = array(); 
foreach ($raw_post_array as $keyval) { 
    $keyval = explode ('=', $keyval); 
    if (count($keyval) == 2) 
    $myPost[$keyval[0]] = urldecode($keyval[1]); 
} 
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate' 
$req = 'cmd=_notify-validate'; 
if(function_exists('get_magic_quotes_gpc')) { 
    $get_magic_quotes_exists = true; 
} 
foreach ($myPost as $key => $value) {   
    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { 
     $value = urlencode(stripslashes($value)); 
    } else { 
     $value = urlencode($value); 
    } 
    $req .= "&$key=$value"; 
} 


// Step 2: POST IPN data back to PayPal to validate 

$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); 


// In wamp-like environments that do not come bundled with root authority certificates, 
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set 
// the directory path of the certificate as shown below: 
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); 
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); 
if(!($res = curl_exec($ch))) { 
    //error_log("Got " . curl_error($ch) . " when processing IPN data"); 
    curl_close($ch); 
    exit; 
} 
curl_close($ch); 
// inspect IPN validation result and act accordingly 

if (strcmp ($res, "VERIFIED") == 0) { 
     echo '<section id="download"> 
<h2>Download song</h2> 
<a href="FILE_PATH">FILE Here</a> 
</section>'; 

    } 

else if (strcmp ($res, "INVALID") == 0) { 
    echo "The response from IPN was: <b>" .$res ."</b>"; 
} 
?> 
+0

您是否傳遞任何非URL編碼的特殊字符?你能提供一個我可以查詢的交易ID嗎? – Gerzie

+0

@PayPal_Patrick你是什麼意思?即時通訊仍在尋找一種方式來回應paypal的迴應。 – Mark

+0

如果您傳遞的是諸如&* ^%之類的字符或類似的字符,而沒有在響應中將它們編碼爲PayPal,則您會收到無效的回覆。 讓我抓住其中一個發送電子郵件的測試IPN腳本。它會寫出完整的回覆並生成電子郵件到您定義的任何位置,併爲您提供驗證響應。你可以用它來測試。我將添加它作爲答案。 – Gerzie

回答

2

這裏我提到的腳本:

<?php 
// read the post from PayPal system and add 'cmd' 
$req = 'cmd=_notify-validate'; 

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

// post back to PayPal system to validate 

$header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; 

    // If testing on Sandbox use: 
$header .= "Host: www.sandbox.paypal.com\r\n"; 
$header .= "Connection: close\r\n"; 
//$header .= "Host: www.paypal.com:443\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

    // If testing on Sandbox use: 
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 


// assign posted variables to local variables 
$item_name = $_POST['item_name']; 
$item_number = $_POST['item_number']; 
$payment_status = $_POST['payment_status']; 
$payment_amount = $_POST['mc_gross']; 
$payment_currency = $_POST['mc_currency']; 
$txn_id = $_POST['txn_id']; 
$receiver_email = $_POST['receiver_email']; 
$payer_email = $_POST['payer_email']; 

if (!$fp) { 
// HTTP ERROR 
} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
if (strcmp (trim($res), "VERIFIED") == 0) { 
// check the payment_status is Completed 
// check that txn_id has not been previously processed 
// check that receiver_email is your Primary PayPal email 
// check that payment_amount/payment_currency are correct 
// process payment 

$mail_From = "From: address-here"; 
$mail_To = "address-here"; 
$mail_Subject = "VERIFIED IPN"; 
$mail_Body = $req; 

//error_log($res, 1, "address-here"); 

foreach ($_POST as $key => $value){ 
$emailtext .= $key . " = " .$value ."\n\n"; 
} 

mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From); 


} 
else if (strcmp (trim($res), "INVALID") == 0) { 


$mail_From = "From: address-here"; 
$mail_To = "address-here"; 
$mail_Subject = "INVALID IPN"; 
$mail_Body = $req; 

//error_log($res, 1, "address-here"); 

foreach ($_POST as $key => $value){ 
$emailtext .= $key . " = " .$value ."\n\n"; 
} 

mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From); 

} 
} 
fclose ($fp); 
} 
?> 

在「address-here」部分中,您需要在相應的電子郵件地址中添加部分。這一切都發回貝寶,它只是返回一個「VERIFIED」響應。

這一切都爲沙盒現在。

+0

真棒 - 我的嘗試 – Mark

+0

我得到這個在電子郵件中:**主題:**無效IPN和**正文:** My_EMAIL_ADDRESS cmd = _notify驗證 – Mark

+0

什麼是交易ID? – Gerzie