2013-07-18 222 views
6

我已經在試用沙盒模式的開發人員中設置了測試帳戶Business和Personal。Paypal IPN沙盒 - IPN監聽器 - 無驗證或無效

我在我的網站上做了一個付款按鈕。我點擊按鈕並轉到PayPal。 測試用戶個人帳戶用於支付。 付款經過並且在我查看貝寶公司賬戶時完成。 重定向到我的網站效果很好。

所以在我眼中,我應該有一個「工作」系統。

我的IPN Listener雖然不返回驗證或無效。

這是我的聽衆:

<?php 
require("../widgets/init.inc.php"); 

//Test the script is launced 
$log_query = mysql_query("INSERT INTO `log` VALUES (' ','zz','ff','rr', 'rr')");     

// Link to PayPal Codes // 
// https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables // 

// 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.0\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

//For the below line i have tried "www.sandbox.paypal" as well as "www.paypal" 
$fp = fsockopen ('ssl://www.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']; 
$txnId = $_POST['txn_id']; 
$receiverEmail = $_POST['receiver_email']; 
$payerEmail = $_POST['payer_email']; 
//$id = ($_POST['custom']); 

if (!$fp) { 

} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
if (strcmp ($res, "VERIFIED") == 0) { 

if ($payment_status=='Completed') { 

//$txnIdCheck = mysql_query("SELECT `txnId` FROM `log` WHERE `txnId`='".$txnId."'"); 
//if (mysql_num_rows($txnIdCheck) !=1) { 

// enter your email address associated with your paypal account here // 
if ($receiverEmail=='[email protected]') { 

/* when a new premium member makes payment paypal will update our database. The txn_id from paypal, members email address, date of payment and members id we gave them when they joined our site will be inserted into the log table. At the same time the memberAdmin table for the member will be updated by adding a '1' to premium and the date of payment so the new premium member will have access to premium areas of your site. */ 

//Check if verified is launced   
$log_query_2 = mysql_query("INSERT INTO `log` VALUES (' ','yes','yes','yes', 'yes')");   

//$log_query = mysql_query("INSERT INTO `log` VALUES (' ','".intval($id)."','".$txnId."','".$payerEmail."', now())");     

//$update_premium = mysql_query("UPDATE `memberAdmin` SET `premium`=1, `premiumDate`=now() WHERE `id`=".intval($id)."");  

}  
//} 
} 
} 
else if (strcmp ($res, "INVALID") == 0) {   
//Check if invalid is launced 
$log_query_2 = mysql_query("INSERT INTO `log` VALUES (' ','no','no','no', 'no'"); 
} 
} 
fclose ($fp); 
} 
?> 

我已經激活了IPN的貝寶企業賬戶的網站。 我已經從貝寶返回的信息一個txt文件,它看起來像這樣:

==== Thu, 18 Jul 2013 01:34:21 +0200 ==== 
POST: mc_gross = 0.01 
POST: protection_eligibility = Ineligible 
POST: payer_id = 73WPPK8HKSW7C 
POST: tax = 0.00 
POST: payment_date = 15:15:20 Jul 17, 2013 PDT 
POST: payment_status = Completed 
POST: charset = windows-1252 
POST: first_name = Niels 
POST: mc_fee = 0.01 
POST: notify_version = 3.7 
POST: payer_status = verified 
POST: business = [email protected] 
POST: quantity = 1 
POST: verify_sign = A-ddKAwtxju4TpHGJOGq6c3ewj26AyiHsD.XO90coZ.4rVzOT7VyooKO 
POST: payer_email = [email protected] 
POST: txn_id = 6WH41489RE087103M 
POST: payment_type = instant 
POST: last_name = Tester 
POST: receiver_email = [email protected] 
POST: payment_fee = 0.01 
POST: receiver_id = PCX638B2M7WPA 
POST: txn_type = web_accept 
POST: item_name = 500Credits 
POST: mc_currency = USD 
POST: item_number = 1 
POST: residence_country = DE 
POST: test_ipn = 1 
POST: handling_amount = 0.00 
POST: transaction_subject = 500Credits 
POST: payment_gross = 0.01 
POST: shipping = 0.00 
POST: ipn_track_id = 2dffcbf8767d3 
InvoiceID: 
Custom1: 
Custom2: 
Custom3: 

現在看來似乎是很多困難得到這個比我想應該是工作。

回答

13

我發現問題..和惱人的事情是,PAYPAL文檔是錯誤的..我不明白,文檔可以狀態按此按鈕,然後按此按鈕..當沒有這樣的按鈕該網站...

對於此問題 - 該文檔確實聲明瞭一個錯誤的方法/不包括所需的完整代碼。

問題: 的$ RES返回此:

HTTP/1.0 400 Bad Request 
Server: BigIP 
Connection: close 
Content-Length: 19 
Invalid Host header 

需要添加的是:

$header .= "Host: www.sandbox.paypal.com\r\n"; 

,然後將上面的代碼看起來是這樣的:

// post back to PayPal system to validate // 
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Host: www.sandbox.paypal.com\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

這是我最終使用的完整代碼:

<?php 
require("../widgets/init.inc.php");   

// Link to PayPal Codes // 
// https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables // 

// 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.0\r\n"; 
$header .= "Host: www.sandbox.paypal.com\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 
$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']; 
$txnId = $_POST['txn_id']; 
$receiverEmail = $_POST['receiver_email']; 
$payerEmail = $_POST['payer_email']; 
//$id = ($_POST['custom']); 


if (!$fp) { 

} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 

$log_query_pre = mysql_query("INSERT INTO `log` VALUES (' ','$receiverEmail','$payment_status','$res', 'yes')");  

    if (strcmp ($res, "VERIFIED") == 0) { 

if ($payment_status=='Completed') { 

//$txnIdCheck = mysql_query("SELECT `txnId` FROM `log` WHERE `txnId`='".$txnId."'"); 
//if (mysql_num_rows($txnIdCheck) !=1) { 

// enter your email address associated with your paypal account here // 
if ($receiverEmail=='[email protected]') { 

/* when a new premium member makes payment paypal will update our database. The txn_id from paypal, members email address, date of payment and members id we gave them when they joined our site will be inserted into the log table. At the same time the memberAdmin table for the member will be updated by adding a '1' to premium and the date of payment so the new premium member will have access to premium areas of your site. */ 

//Check if verified is launced   
$log_query_2 = mysql_query("INSERT INTO `log` VALUES (' ','yes','yes','yes', 'yes')");  

//$log_query = mysql_query("INSERT INTO `log` VALUES (' ','".intval($id)."','".$txnId."','".$payerEmail."', now())");     

//$update_premium = mysql_query("UPDATE `memberAdmin` SET `premium`=1, `premiumDate`=now() WHERE `id`=".intval($id)."");  

}  
//} 
} 
} 
else if (strcmp ($res, "INVALID") == 0) {   
//Check if invalid is launced 
$log_query_2 = mysql_query("INSERT INTO `log` VALUES (' ','no','no','no', 'no')"); 
} 
} 
fclose ($fp); 
} 
?> 
+1

謝謝!我整個下午都遇到同樣的麻煩。很高興我找到了這個。令人沮喪的是,這是一個文檔錯誤... –

+1

謝謝!我有完全相同的問題。 – oliverbj

+0

@Niels我按照上面的步驟,但是$ res返回HTTP/1.1 200 OK,我怎麼能得到VERIFIED或INVALID消息? – oletob