简体   繁体   English

Paypal不会通知我的IPN侦听器

[英]Paypal doesn't notify my IPN listener

I have this code: 我有以下代码:

<?php

// CONFIG: Enable debug mode. This means we'll log requests into 'ipn.log' in the same directory.
// Especially useful if you encounter network errors or other intermittent problems with IPN (validation).
// Set this to 0 once you go live or don't require logging.
define("DEBUG", 1);
// Set to 0 once you're ready to go live
define("USE_SANDBOX", 1);
define("LOG_FILE", "./ipn.log");
// Read POST data
// reading posted data directly from $_POST causes serialization
// issues with array data in POST. Reading raw POST data from input stream instead.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
    $keyval = explode ('=', $keyval);
    if (count($keyval) == 2)
        $myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
    $get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
        $value = urlencode(stripslashes($value));
    } else {
        $value = urlencode($value);
    }
    $req .= "&$key=$value";
}
// Post IPN data back to PayPal to validate the IPN data is genuine
// Without this step anyone can fake IPN data
if(USE_SANDBOX == true) {
    $paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
} else {
    $paypal_url = "https://www.paypal.com/cgi-bin/webscr";
}
$ch = curl_init($paypal_url);
if ($ch == FALSE) {
    return FALSE;
}
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
//curl_setopt($ch, CURLOPT_CAINFO,"api_cert_chain.crt");
if(DEBUG == true) {
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
}
// CONFIG: Optional proxy configuration
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
// Set TCP timeout to 30 seconds
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// CONFIG: Please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path
// of the certificate as shown below. Ensure the file is readable by the webserver.
// This is mandatory for some environments.
//$cert = __DIR__ . "./cacert.pem";
//curl_setopt($ch, CURLOPT_CAINFO, $cert);
$res = curl_exec($ch);
if (curl_errno($ch) != 0) // cURL error
    {
    if(DEBUG == true) { 
        error_log(date('[Y-m-d H:i e] '). "Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE);
    }
    curl_close($ch);
    exit;
} else {
        // Log the entire HTTP response if debug is switched on.
        if(DEBUG == true) {
            error_log(date('[Y-m-d H:i e] '). "HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE);
            error_log(date('[Y-m-d H:i e] '). "HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE);
        }
        curl_close($ch);
}
// Inspect IPN validation result and act accordingly
// Split response headers and payload, a better way for strcmp
$tokens = explode("\r\n\r\n", trim($res));
$res = trim(end($tokens));
if (strcmp ($res, "VERIFIED") == 0) {
    // check whether the payment_status is Completed
    // check that txn_id has not been previously processed
    // check that receiver_email is your PayPal email
    // check that payment_amount/payment_currency are correct
    // process payment and mark item as paid.
    // 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'];
    $userid = $_POST['custom'];
    if($receiver_email=="yoeltrujil@walla.com"&$payment_amount==7&$payment_status=="completed"&$item_name="ChattiexBot 1.0 BETA"){
           $mail_From    = "IPN@example.com";
      $mail_To      = "flarmiey@gmail.com";
      $mail_Subject = "777VERIFIED IPN1".$userid;
      $mail_Body    = $req;
      mail($mail_To, $mail_Subject, $mail_Body, $mail_From);



    }else{

       $mail_From    = "IPN@example.com";
      $mail_To      = "flarmiey@gmail.com";
      $mail_Subject = "77VERIFIED IPN2".$payment_amount."-".$payment_currency."-".$payment_status."-".$item_name."-".$receiver_email;
      $mail_Body    = $req;
      mail($mail_To, $mail_Subject, $mail_Body, $mail_From);
    }

    if(DEBUG == true) {
        error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
    }
} else if (strcmp ($res, "INVALID") == 0) {
    // log for manual investigation
    // Add business logic here which deals with invalid IPN messages
    if(DEBUG == true) {
        error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);
    }

       $mail_From    = "IPN@example.com";
      $mail_To      = "flarmiey@gmail.com";
      $mail_Subject = "777no IPN";
      $mail_Body    = $req;
      mail($mail_To, $mail_Subject, $mail_Body, $mail_From);

}
?>

Which basically sends me an email that has a different subject in each if statement. 基本上,这会向我发送一封电子邮件,每个if语句的主题都不同。 Thing is, when I run the IPN simulator on my IPN listener on my website, it does send me an email, which means that PayPal did send me a request to the ipn listener. 问题是,当我在网站上的IPN侦听器上运行IPN模拟器时,它确实向我发送了电子邮件,这意味着PayPal确实向我发送了对ipn侦听器的请求。 When I use the sandbox demo button that redirects to the sandbox PayPal demo paying page and I pay, it does not send any email, which means the ipn listener did not even run. 当我使用沙箱演示按钮重定向到沙箱贝宝支付演示页,我付钱,它发送任何电子邮件,这意味着IPN监听器甚至没有运行。

Some help please? 请帮忙吗?

I found the problem.There are two main cases where the IPN code isn't executed as a result of a request from Paypal - 我发现了问题。在两种主要情况下,由于Paypal的请求而导致IPN代码未执行-

1.Error in code.Invalid code will stop the whole process and therefore the code in the IPN listener will not work. 1.代码错误。无效的代码将停止整个过程,因此IPN侦听器中的代码将无法工作。 2.When creating the Paypal button, you have to put the notify_url variable in list of variables and write there your IPN listener, also you have to check the variables box. 2.创建贝宝按钮时,必须将notify_url变量放入变量列表中,并在其中写入IPN侦听器,还必须选中变量框。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM