2011-04-08 101 views
1

更新1:真搞不清楚PayPal付款

$res到文本文件只是返回字VERIFIED

<?php 
/* 
mysql_connect("localhost", "user", "password") or die(mysql_error()); 
mysql_select_db("PayPal") or die(mysql_error()); 
*/ 

// 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"; 

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

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

$ourFileName = "payment_successful.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fwrite($ourFileHandle, $res); 
fclose($ourFileHandle); 


} 

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

$ourFileName = "payment_failed.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fwrite($ourFileHandle, $res); 
fclose($ourFileHandle); 

} 
} 
fclose ($fp); 
} 
?> 

原題:

我有以下的IPN(即時付款通知)腳本,它可以工作,即如果成功則創建成功的文件,如果失敗則創建失敗的文件。

PayPal是否會向IPN文件返回寄存值,以便我能夠確定哪些付款已成功或付款失敗?

如果是,我該如何訪問這些值?

如果不是,我該如何確定哪些付款已被接受或拒絕?

這是IPN文件我目前擁有的腳本:

<?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.0\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); 

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

$ourFileName = "payment_successful.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fclose($ourFileHandle); 

} 

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

$ourFileName = "payment_failed.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fclose($ourFileHandle); 

} 
} 
fclose ($fp); 
} 
?> 
+0

沒關係,我想通了,什麼是貝寶返回。 – oshirowanen 2011-04-08 08:30:18

回答

3

您的通用腳本答案。

貝寶將在字符串中返回VERIFIED或INVALID字樣。

($res, "VERIFIED") == 0 

一個好的技巧是將$ res的值寫入您的日誌,您會在最後看到返回的結果。

確保您也使用沙盒進行測試。

也有在http://x.com(多少錢,他們付出代價的域?)

FWIW一個論壇,PayPal的IPN是一個PITA。

+0

是否有可能將$ res的內容寫入正在創建的文件中,因爲我認爲難以回顯內容,因爲這是由貝寶啓動的頁面。 – oshirowanen 2011-04-08 08:02:58

+0

你無法迴應內容,或者更好,你可以但誰在乎? IPN事務是server2server,因此只有服務器才能看到回顯,您必須將其寫入日誌文件或數據庫中,請注意,PayPal IPN以單向方式向您發送數據,並希望以相同方式返回數據,或更好:PayPal發送給你var1 = res1&var2 = res2&var3 = res3,你不能將它們作爲var2 = res2&var1 = res1&var3 = res3發送,你必須遵守命令...... AFAIK當我編寫自己的IPN時,我遇到了很多麻煩,因爲在我看來,$ _POST []不尊重數據順序,所以我直接通過php://輸入 – MiPnamic 2011-04-08 08:10:56

+0

@MiPnamic,將$ res的內容寫入文件,它只包含VARIFIED一詞。我不明白如何通過上述IPN文件找出Paypal正在確認的付款,所以我可以更新數據庫中的正確記錄。我更新了上述問題以顯示將$ res中的數據寫入文本文件的當前代碼。 – oshirowanen 2011-04-08 08:15:35

0

您好我實現我的這種方式

foreach ($_POST as $key => $value) 
{ 
    $data[$key] = $value; 
} 

做回聲'<pre>' .print_r($的數據,真實)。 '</pre>';

會產生這樣的:

cmd=_notify-validate 
test_ipn=1 
payment_type=echeck 
payment_date=22:21:28 Mar 24, 2011 PDT 
payment_status=Completed 
address_status=confirmed 
payer_status=verified 
first_name=John 
last_name=Smith 
[email protected] 
payer_id=TESTBUYERID01 
address_name=John+Smith 
address_country=United+States 
address_country_code=US 
address_zip=95131 
address_state=CA 
address_city=San+Jose 
address_street=123%2C+any+street 
[email protected] 
[email protected] 
receiver_id=TESTSELLERID1 
residence_country=US 
item_name=something 
item_number=AK-1234 
quantity=1 
shipping=3.04 
tax=2.02 
mc_currency=USD 
mc_fee=0.44 
mc_gross=12.34 
txn_type=web_accept 
txn_id=28325521 
notify_version=2.1 
custom=xyz123 
invoice=abc1234 
charset=windows-1252 
verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31AM3F5ODR-2hb2fIsWPHepIEPzAwg