Paypal php IPN 没有更新我的数据库

Paypal php IPN not updating my database

所以,我正在使用 Paypal IPN。但它不适用于更新我的数据库(购物车和发票)。请有人帮我调试我的代码吗?它正在将成功的 IPN 发送到 paypal,但没有更新任何内容。这是代码:

我们在支付页面的代码:

<form action="https://www.paypal.com/cgi-bin/webscr" name="frm" id="frm" method="post">

<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="business" value="fin@mycoupon.com.hk" />
<?

$result = mysql_query("SELECT * FROM cart, member, product
where cart.member_id = member.member_id
And cart.product_id = product.product_id
And member.email = '$_SESSION[member]'
And cart.status = 'cart'
And cart.quantity > (SELECT quantity FROM quantity where quantity.quantity_id = cart.quantity_id)
"); 

while($row = mysql_fetch_array($result))
{
$del_cart_id = $row['cart_id'];
$del_product_id = $row['product_id'];
$del_member_id = $row['member_id'];
mysql_query("UPDATE cart SET status = 'delete', last_modified = now()
where member_id = '$del_member_id'
And product_id = '$del_product_id'
And cart_id = '$del_cart_id'
"); 
}

$i =1;
$cartresult = mysql_query("SELECT * FROM cart, product
where cart.member_id = '$member_id'
And cart.product_id = product.product_id
And cart.invoice_id = '$invoice'
And cart.status = 'cart'
And cart.quantity <= (SELECT quantity FROM quantity where quantity.quantity_id = cart.quantity_id)

"); 

while($row = mysql_fetch_array($cartresult))
{
echo'<input type="hidden" name="item_number_'.$i.'" value="'.$row['cart_id'].'">';
echo'<input type="hidden" name="item_name_'.$i.'" value="'.$row['productname'].'">';
echo'<input type="hidden" name="amount_'.$i.'" value="'.$row['dprice'].'">';
echo'<input type="hidden" name="quantity_'.$i.'" value="'.$row['quantity'].'">';
mysql_query("UPDATE cart SET final_price = '$row[dprice]', last_modified = now()
where member_id = '$row[member_id]'
And product_id = '$row[product_id]'
And cart_id = '$row[cart_id]'
"); 
$i++;
}

$cartresult_rows = mysql_num_rows($cartresult); 

?>

<input type="hidden" name="currency_code" value="HKD">
<input type="hidden" name="rm" value="2">
<input type="hidden" name="lc" value="HK">
<input type="hidden" name="return" id="return" value="http://www.mycoupon.com.hk/finish.php">   
<input type="hidden" name="cancel_return" value="http://www.mycoupon.com.hk/checkout_step3.php">    
<input type="hidden" name="notify_url" value="http://www.mycoupon.com.hk/notify_return.php">

<? if ($cartresult_rows > 0) {?>    
<script language="javascript">
setTimeout("frm.submit();",1000); 
</script>
<? } else {
echo '<META HTTP-EQUIV=REFRESH CONTENT="0; index.php">';
}
?>
</form>

我们在 notify_return 页面(更新页面)上的代码:

header("content-type:text/html; charset=utf-8");
mb_internal_encoding('UTF-8');


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


// If testing on Sandbox use:
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);


// assign posted variables to local variables

$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payment_date = $_POST['payment_date'];
$payment_amount= $_POST['payment_amount'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$payment_status = $_POST['payment_status'];
$payer_email = $_POST['payer_email'];
$num_cart_items = $_POST['num_cart_items'];

//DB connect creds and email 
$notify_email = "fin@mycoupon.com.hk"; 


//email address to which debug emails are sent to
function db_connect(){
$link_id=mysql_connect('xxx','xxx','xxxx');
mysql_query("SET NAMES 'UTF8'");
if(!mysql_select_db('mycouponshop', $link_id)){
echo mysql_errno($link_id).": " . mysql_error($link_id);
}
return $link_id;
if (!$link_id)
{
die('Could not connect: ' . mysql_error());
}   
}

$link = db_connect();



if (!$fp) {
//HTTP error
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
if ($payment_status == "Refunded") {
mysql_query("UPDATE invoice SET cmd='$payment_status' WHERE txn_id='$txn_id'");
exit();
}

for($i = 1; $i <= $num_cart_items; $i++){
$cart_id = $_POST['item_number_'.$i];   
mysql_query("UPDATE cart SET status = 'finish' WHERE cart_id = '$cart_id'");
}   


$result = mysql_query("SELECT * FROM cart WHERE cart_id = '$cart_id'"); 
while($row = mysql_fetch_array($result))
{   
$invoice_id = $row['invoice_id'];
$memebr_id = $row['memebr_id'];
}


mysql_query("UPDATE invoice SET txn_id = '$txn_id',cmd = '$payment_status', pay_user='$payer_email', payment='paypal' , last_modified = now() where invoice_id = '$invoice_id'");   




}

// if the IPN POST was 'INVALID'...do this
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation

}
}
fclose ($fp);
}

mail($notify_email, "INVALID IPN", "$res - $payment_status\n $req");

查看 how to test PayPal IPN 上的这篇文章,了解有关在浏览器中进行测试的提示。这将允许您设置断点并找出什么是 运行 什么不是,以及在屏幕上查看任何错误,以便您可以相应地解决它们。