Entry tags:
Paypal IPN Listener class.
I've only used Paypal IPN a couple times. Both time were in systems where the IPN was already set up. It didn't take much work for me to actually do anything from there. I am working on a new WordPress module. Part of which includes functionality where I needed to do some paypal processing. While searching through the internet I found a lot of sample code, but nothing that was a simple object. After some headaches caused by a typo, I have a php5 class for Paypal IPN validation.
The code makes creating an IPN script simple for anyone.
Once you create the object there is nothing left for you to do for the validation process to begin. It has already begun, and ready for you to use. How do you use it? Like this.
To go into production mode either pass "false" as the second parameter or remove it entirely only passing the post data. Once you do that you are GOOD TO GO!
define('PAYPAL_IPN_LISTENER_VERIFIED_STATUS','VERIFIED');
define('PAYPAL_IPN_LISTENER_INVALID_STATUS','INVALID');
class PaypalIPNListener
{
protected $status = PAYPAL_IPN_LISTENER_INVALID_STATUS;
protected $payment_status = false;
private $sandboxUrl = "https://www.sandbox.paypal.com/cgi-bin/webscr";
private $productionUrl = "https://www.paypal.com/cgi-bin/webscr";
private $serviceUrl = null;
private $serviceData = "";
public function __construct($postData = array(), $sandbox=false)
{
// Set the initial serviceUrl
$serviceUrl = $productionUrl;
// If sandbox change the serviceUrl
if($sandbox == true) $serviceUrl = $sandboxUrl;
// Save the post data for later use.
$this->postData = $postData;
// If we are debugging switch the URL
$serviceUrl = ($sandbox) ? $sandboxUrl : $productionUrl;
// Add the validate notify command to the post data.
$postData['cmd'] = '_notify-validate';
// Create a querystring from the data.
foreach($postData as $key => $val)
{
if($serviceData != "") $responseData .="&";
$serviceData .= $key . "=" . urlencode($val);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->serviceUrl);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$output = curl_exec($ch);
// If the payment is verified then set the status as verified.
if($output == "VERIFIED")
{
$this->status = PAYPAL_IPN_LISTENER_VERIFIED_STATUS;
$this->payment_status = $postData['payment_status'];
}
}
public function getPaymentStatus()
{
return $this->payment_status;
}
public function __toString()
{
return $this->status;
}
}
The code makes creating an IPN script simple for anyone.
// Create the IPN Listener object. (passing true as the 2nd parameter
// sets you up with the sandbox for development.
$ipn = new PaypalIPNListener($_POST, true);
Once you create the object there is nothing left for you to do for the validation process to begin. It has already begun, and ready for you to use. How do you use it? Like this.
// IPN Listener Object
$ipn = new PaypalIPNListener($_POST, true);
if($ipn == PAYPAL_IPN_LISTENER_VERIFIED_STATUS)
{
// Payment is verified. We use the magic method __toString to return the validation status.
// Then it's as simple as checking the $_POST data for the ['payment_status'] to make sure they
// weren't denied or that something didn't go wrong on paypals side.
}
else
{
// something went wrong with the validation process. You should handle it here.
// at least log it so that you have a record of the failed validation.
}
To go into production mode either pass "false" as the second parameter or remove it entirely only passing the post data. Once you do that you are GOOD TO GO!