0
votes

I use adaptive payments on paypal.

I have added the field ipnNotificationUrl on my JSON data but this url is never called. However, my payment is execute and I am redirected to the success page.

In my IPN History, all my payments is marked by "Nouvel essai en cours"("New ongoing trial").

"actionType"    => "PAY",
"currencyCode"  => "EUR",
"receiverList"  => array(
    "receiver"  => array(
        array(
            "amount"    => "5.00",
            "email"     => "[email protected]"
        ),
        array(
            "amount"    => "2.00",
            "email"     => "[email protected]"
        )
    )
),
"returnUrl" => "http://myUrl.com/return.php",
"cancelUrl" => "http://myUrl.com/cancel.php",
"ipnNotificationUrl" => "http://myUrl.com/ipn.php",
"requestEnvelope"   => array(
    "errorLanguage" =>  "en_US",
    "detailLevel"   => "ReturnAll"
)

In my ion.php script I write a file to see if it's called. But this file is never written.

file_put_contents("called", "file is called");

define("DEBUG", 1);
define("USE_SANDBOX", 1);
define("LOG_FILE", "./ipn.log");

$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);
if(DEBUG == true) {
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
}
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

$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);
}
$tokens = explode("\r\n\r\n", trim($res));
$res = trim(end($tokens));
if (strcmp ($res, "VERIFIED") == 0) {
    error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
} else if (strcmp ($res, "INVALID") == 0) {
    error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);

}

Thanks for your help.

2

2 Answers

1
votes

First, You need to check your IPN script in ipn simulator. - Login to the https://developer.paypal.com/ - Go to https://developer.paypal.com/developer/ipnSimulator/ - Check your IPN script.

for e.g. : IPN handler URL : http://www.domainname.com/ipn.php Transaction type : select your transaction type

This url will be used to check your ipn script, is properly running or not.

Second,

You need to set your IPN script in your paypal account. Let me give your steps.

  • Login to your paypal account
  • Click on Profile Link
  • Click on 'My Selling Tools' Link
  • Click on 'Update' link of 'Instant payment notifications'.
  • Click on 'Choose IPN Settings' button
  • Enter your IPN script path. for e.g. http://www.domainname.com/ipn.php
  • Select 'Receive IPN messages (Enabled)'
  • Click on Save button.

Now, this way your ipn script will be saved in Paypal. Also, add 'notifyurl' in your paypal code.

Try these steps. you can solve your issue.

0
votes

I solved my problem. The ipn links should not be an IP address (http://x.x.x.x/).