2013-06-18 66 views
0

請提前原諒我的無知,但我相當新的PHP,這一個一直在竊聽我一段時間。 我正在嘗試爲銷售單個項目的在線商店編寫IPN腳本。一旦付款完成,腳本將更新數據庫並將可用性從「可用」更改爲「不可用」。 除了更新數據庫之外,IPN似乎還能正常工作。我現在正處於一種無法理解的狀態,因爲我看不到腳本有什麼問題。這裏是我有什麼:PayPal IPN不更新MySQL數據庫

curl_close($ch); 

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

$token = $_POST['invoice']; 
$item= $_POST['invoice']; 

$conn=new PDO("mysql:host=SERVER;dbname=MYDATABASE","NAME","PASS"); 
if ($_POST['payment_status'] == 'completed') 
{ 
    $sql="UPDATE `tbl_products` SET `id_status` = 3 WHERE `id_product`=:idproduct"; 
    $stmt=$conn->prepare($sql); 
    $stmt->bindParam(':idproduct',$item); 
    $stmt->execute(); 
} 
if ($_POST['payment_status'] == 'pending') 
{ 
    $sql="UPDATE `tbl_products` SET `id_status` = 2 WHERE `id_product`=:idproduct"; 
    $stmt=$conn->prepare($sql); 
    $stmt->bindValue(':idproduct',$item); 
    $stmt->execute(); 
} 
foreach ($_POST as $key => $value) 
{ 
    $emailtext .= $key . " = " .$value ."\n\n"; 
} 
mail("MYEMAIL", "Live-VALID IPN", $emailtext . "\n\n" . $req); 
} 
else if (strcmp ($res, "INVALID") == 0) 
{ 
// log for manual investigation 
foreach ($_POST as $key => $value) 
{ 
    $emailtext .= $key . " = " .$value ."\n\n"; 
} 
mail("MYEMAIL", "Live-INVALID IPN", $emailtext . "\n\n" . $req); 
} 
+0

要綁定invoice'的'到一個叫做'idproduct'參數的值的檢查。產品和發票是不同的東西,所以也許看看? –

+0

嗨克勞斯。非常感謝你的回覆。 「發票」只是我用來傳遞物料編號(即數據庫中的id_product)的格式中的一個變量。我剛把它改爲「item_number」,然後再試一次,但仍然沒有運氣。我idid有它作爲「item_number」之前,但將其改爲「發票」,看看是否會有所幫助。 – paul

回答

0

貝寶IPN返回狀態有第一個字符大寫。

因此Completed不等於completed。試試這個

curl_close($ch); 

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

$token = $_POST['invoice']; 
$item= $_POST['invoice']; 

$conn=new PDO("mysql:host=SERVER;dbname=MYDATABASE","NAME","PASS"); 
if ($_POST['payment_status'] == 'Completed') 
{ 
    $sql="UPDATE `tbl_products` SET `id_status` = 3 WHERE `id_product`=:idproduct"; 
    $stmt=$conn->prepare($sql); 
    $stmt->bindParam(':idproduct',$item); 
    $stmt->execute(); 
} 
if ($_POST['payment_status'] == 'Pending') 
{ 
    $sql="UPDATE `tbl_products` SET `id_status` = 2 WHERE `id_product`=:idproduct"; 
    $stmt=$conn->prepare($sql); 
    $stmt->bindValue(':idproduct',$item); 
    $stmt->execute(); 
} 
foreach ($_POST as $key => $value) 
{ 
    $emailtext .= $key . " = " .$value ."\n\n"; 
} 
mail("MYEMAIL", "Live-VALID IPN", $emailtext . "\n\n" . $req); 
} 
else if (strcmp ($res, "INVALID") == 0) 
{ 
// log for manual investigation 
foreach ($_POST as $key => $value) 
{ 
    $emailtext .= $key . " = " .$value ."\n\n"; 
} 
mail("MYEMAIL", "Live-INVALID IPN", $emailtext . "\n\n" . $req); 
} 

這是更好的狀態存儲在一個變量,並使用PHP strtolower功能,使他們小寫。

$paypalStatus = strtolower($_POST['payment_status']); 

比做這樣

if($paypalStatus == 'pending') 
+0

非常感謝你!你終於解決了困擾我多年的問題! – paul

+0

@ paul很高興幫助你:) –