php - PayPal IPN 不再工作

标签 php post paypal paypal-ipn

从昨天开始,PayPal IPN 就可以正常工作,但今天我收不到任何 IPN。我检查了 MySQL,检查了 IPN 地址,一切都很好。我在想 PayPal 在他们的 IPN 服务器上做了一些改变,电话里的那个女人告诉我没有。有点奇怪。

那么有人可以检查 ipn.php 和 add.php 吗?

添加 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);
}
?>

最佳答案

我遇到了同样的问题。他们开始在响应的末尾添加“\r\n”,所以我将“VERIFIED”与“VERIFIED\r\n”进行比较,但失败了。你可以这样做:

修剪($res)

在测试 VERIFIED 之前,或者您可以使用 strpos 而不是 strcmp:

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

最后,他们还要求所有客户前一段时间开始添加 Connection header :

$header .= "连接:关闭\r\n";

关于php - PayPal IPN 不再工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285079/

相关文章:

javascript - React Native - 获取 POST 不起作用

php - 如何在一个站点中创建将登录另一个站点的链接?

php - Paypal 沙箱 notify_url 文件不工作

javascript - 为什么在 ajax 表单中出现名称为 javascript 错误的无效表单控件

PHP 添加破折号进行解码

reactjs - 如何在 URL axios post 方法中使用 id 使用react?

javascript - 如何在满足条件之前取消/防止弹出 PayPal 的结帐模式?

android - Paypal 安全异常 : Requires READ_PHONE_STATE

php - 使用 Facebook Graph API 创建 "Timeline Photos"相册

php - 如何仅在最后出现的分隔符上 explode ?