PayPal IPN не обновляет базу данных MySQL

пожалуйста, извините мое невежество заранее, но я довольно новичок в php, и этот меня прослушивал какое-то время. Я пытаюсь написать сценарий IPN для интернет-магазина, который продает отдельные предметы. как только платеж будет завершен, скрипт обновит базу данных и изменит доступность с «доступного» на «недоступный». IPN, похоже, отлично работает, кроме обновления базы данных. Я нахожусь на своем конце, потому что не вижу, что не так с сценарием. вот что у меня есть:

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); } 

Статус возврата в PayPal 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')