пожалуйста, извините мое невежество заранее, но я довольно новичок в 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')