Link to home
Start Free TrialLog in
Avatar of kbit
kbit

asked on

PayPal IPN

Hi, I stole the code below and modified it to suit. On PayPal, I added this filename (listener.php) as the IPN listener.

However my database is not being updated, can someone please tell me if I'm missing something?
Many thanks
<?php
session_start();
// 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";
$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'];
 
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
 
$PostedUserID=$_SESSION['PostedUserID'];
$Amount=$payment_amount;
$Purpose=$_SESSION['Purpose'];
 
// connect to database
$username="xxxxxxxx";
$password="xxxxxxxxxx";
$database="xxxxxxxx";
$server="xxxxxxxxx";
 
$dbLinkID = mysql_connect($server,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
 
 
//insert into billing table
$query = "INSERT INTO billing VALUES (NULL,'$PostedUserID',Now(),'$Purpose','$Amount')";
mysql_query($query);
 
//add 1 year to current date for expiry
$newDate = date("Y-m-d",strtotime("+1 year", time()));
 
//change user status to active and update expiry date
$query = "UPDATE users SET ExpiryDate='$newDate',Status='Active' WHERE UserID='$PostedUserID'";
mysql_query($query);
 
$_SESSION['PostedStatus'] = 'Active';		//Store users new status
 
 
}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}
?>

Open in new window

Avatar of Ray Paseur
Ray Paseur
Flag of United States of America image

For one thing, session_start() is not useful here - it is an asynchronous script!

I'll take a look at the rest in a moment.  Best regards, ~Ray
ASKER CERTIFIED SOLUTION
Avatar of Ray Paseur
Ray Paseur
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of kbit
kbit

ASKER

That worked beautifully Ray, thanks ever so much for putting me in the right direction regarding the session variables...I would've been a long time figuring that out!
Glad to help - this is a really good question.  Thanks for the points!  Best, ~Ray