PayPal IPN不再工作

4
自昨天以来,PayPal IPN 一直正常工作,但今天我无法收到任何 IPN。我检查了 MySQL,检查了 IPN 地址,一切都很正常。我认为 PayPal 在其 IPN 服务器上进行了一些更改,但电话中的女士告诉我没有。有点奇怪。
所以,有人可以检查一下 ipn.php 和 add.php 吗? add.php
<?
define('BASEPATH', true);
require_once("../../config.php");
if(!$is_online){
    redirect('../../../index.php');
    exit;
}

$s_host = parse_url($site['site_url']);

if($_GET['cash'] != '' && is_numeric($_GET['cash'])){
    $cash = ($_GET['cash'] < 1 ? 1 : $_GET['cash']);
    $cash = number_format($cash, 2, '.', '');
}else{
    redirect('../../../index.php');
    exit;
}
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Redirecting...</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<style>body{background: #fff;font: 13px Trebuchet MS, Arial, Helvetica, Sans-Serif;color: #333;line-height: 160%;margin: 0;padding: 0;text-align: center;}h1{font-size: 200%;font-weight: normal}.centerdiv{position: absolute;top: 50%; left: 50%; width: 340px; height: 200px;margin-top: -100px; margin-left: -160px;}</style>
<script type="text/javascript">
    setTimeout('document.paypalform.submit()',1000);
</script>
</head>
<body>
<div class="centerdiv"><h1>Connecting to Paypal <img src="<?=$site['site_url']?>/img/go_loader.gif" /></h1></div>
<form name="paypalform" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="<?=$site['paypal']?>">
<input type="hidden" name="item_name" value="<?='Add Funds - '.$data['login'].' - '.$s_host['host']?>">
<input type="hidden" name="custom" value="<?=($data['id'].'|'.$cash.'|'.VisitorIP())?>">
<input type="hidden" name="amount" value="<?=$cash?>">
<input type="hidden" name="currency_code" value="<?=($site['currency_code'] == '' ? 'USD' : $site['currency_code'])?>">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="no_shipping" value="2">
<input type="hidden" name="rm" value="1">
<input type="hidden" name="return" value="<?=$site['site_url']?>/bank.php?success">
<input type="hidden" name="cancel_return" value="<?=$site['site_url']?>/bank.php?cancel">
<input type="hidden" name="notify_url" value="<?=$site['site_url']?>/system/payments/paypal/ipn.php">
</form>
</body>
</html>

ipn

<?php
define('BASEPATH', true);
require("../../config.php");

$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.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
    $res = fgets ($fp, 1024);
    if (strcmp ($res, "VERIFIED") == 0) {
        $get_data = explode('|', $custom); 

        if($site['paypal_auto'] == 1){
            if($payment_status == 'Completed'){
                $user = $db->QueryFetchArray("SELECT id,login FROM `users` WHERE `id`='".$get_data[0]."'");
                $check = $db->QueryGetNumRows("SELECT id FROM `transactions` WHERE `gateway`='paypal' AND `trans_id`='".$txn_id."'");
                if($check == 0){
                    $db->Query("INSERT INTO `transactions` (user, user_id, money, gateway, date, user_ip, trans_id) VALUES('".$user['login']."','".$user['id']."', '".$payment_amount."', 'paypal', NOW(), '".$get_data[2]."', '".$txn_id."')");
                    if($user['id'] > 0){
                        $db->Query("UPDATE `users` SET `account_balance`=`account_balance`+'".$payment_amount."' WHERE `id`='".$user['id']."'");            
                    }
                }
            }
        }else{
            $user = $db->QueryFetchArray("SELECT id,login FROM `users` WHERE `id`='".$get_data[0]."'");
            $check = $db->QueryGetNumRows("SELECT id FROM `transactions` WHERE `gateway`='paypal' AND `trans_id`='".$txn_id."'");
            if($check == 0){
                $db->Query("INSERT INTO `transactions` (user, user_id, money, gateway, date, paid, user_ip, trans_id) VALUES('".$user['login']."','".$user['id']."', '".$payment_amount."', 'paypal', NOW(), '0', '".$get_data[2]."', '".$txn_id."')");
            }
        }
    }
}
fclose ($fp);
}
?>

1
这个问题似乎与编程无关,因为它涉及到PayPal服务。 - chrylis -cautiouslyoptimistic-
2
@chrylis 完全不同意-我们有PayPal和PayPal-ipn标签是为了与之相关的编程问题。这个变化让我遇到了困难,而这个答案救了我。 - rickyduck
2个回答

7

我曾经遇到过同样的问题。他们开始在响应末尾添加"\r\n",因此我将"VERIFIED"与"VERIFIED\r\n"进行比较,结果失败了。您可以在测试VERIFIED之前执行:

trim($res)

或者您可以使用strpos而不是strcmp:

if (strpos($res, "VERIFIED") === 0)(需要===,而不是==)

最后,他们要求所有客户在一段时间内开始添加连接标头:

$header .= "Connection: close\r\n";


你救了我的一天 :) 谢谢 - roroland
哇 - 一年多后,这也为我解决了问题。 - Bysander

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接