2013-06-18 3 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» и попробовал еще раз, но все равно не повезло. i idid перед тем как «item_number», но изменил его на «счет-фактуру», чтобы узнать, поможет ли это. – paul

ответ

0

Статус возврата в PayPal IPN имеет первый символ в верхнем регистре.

So 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 рад помочь вам :) –

Смежные вопросы