PayPal Payment Gateway example with PHP

How to process PayPal payment gateway using php.This post will describes how to doing a payment using PayPal gateway,payment errors and its solutions.

First of all you must turn “ON” Auto Return for Website Payments,Payment Data Transfer in the Website Payment Preferences of paypal bussiness account.
Understand the payment process by following diagram.
payment-gateway-process
Payment form like this.(form.php)

After you clicked on the “Buy Now” button,form will submitted to the paypal web site.
paypal payment with php
After user pay,then form will redirect to the paymentSuccess.php page of the site.
Then paypal is send the response to the ipnlistener.php page by post method.That page structure like this.

	// 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";
	// If testing on Sandbox use:
	 $header .= "Host: www.sandbox.paypal.com:443\r\n";
	//$header .= "Host: ipnpb.paypal.com:443\r\n";
	$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
	$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
if (strpos('ssl://www.sandbox.paypal.com', 'sandbox') !== FALSE && function_exists('openssl_open')) {
    $fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
  }
  else {
    // The old "normal" way of validating an IPN.
    $fp = fsockopen('ssl://www.sandbox.paypal.com', 80, $errno, $errstr, 30);
}
	// If testing on Sandbox use:
	//$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
	//$fp = fsockopen ('ssl://ipnpb.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
				$mail_From = "From: [email protected]";
				$mail_To = "[email protected]";
				$mail_Subject = "VERIFIED IPN";
				$mail_Body = $req;
				foreach ($_POST as $key => $value){
					$emailtext .= $key . " = " .$value ."\n\n";
				}
				mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From);
			}
			else if (strcmp ($res, "INVALID") == 0) {
				// log for manual investigation
				$mail_From = "From: [email protected]";
				$mail_To = "[email protected]";
				$mail_Subject = "INVALID IPN";
				$mail_Body = $req;
				foreach ($_POST as $key => $value){
					$emailtext .= $key . " = " .$value ."\n\n";
				}
				mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From);
			}
		}   // while end
	 fclose ($fp);
	}

Above page will send email after received response from PayPal IPN.
You can view transaction details after login into the business account > History > IPN History.Click in the transaction ID.
The response like this.

cmd=_notify-validate&mc_gross=1.00&protection_eligibility=Ineligible&payer_id=L5HQP4FAYR7EN&tax=0.00&payment_date=21%3A39%3A30+Aug+06%2C+2012+PDT&payment_status=Pending&charset=windows-1252&first_name=name_here&mc_fee=0.33¬ify_version=3.5&custom=&payer_status=unverified&business=sumith_1343149939_biz%40gmail.com&quantity=1&verify_sign=A6WLMhbAE75bcBbASQxwpOV8sr0CAf5k54DASPgJ5xWzxkXCNDd.5FCU&txn_id=5LU520659T3646613&payment_type=instant&last_name=lastName_here&receiver_email=sumith_1343149939_biz%40gmail.com&payment_fee=0.33&receiver_id=SSTK3RH6SPWYW&pending_reason=paymentreview&txn_type=web_accept&item_name=&mc_currency=USD&item_number=&residence_country=US&test_ipn=1&receipt_id=5288-5190-6471-1212&handling_amount=0.00&transaction_subject=&payment_gross=1.00&shipping=0.00&ipn_track_id=12c4490e98af5

You can get more information from PayPal API.

Remember:

  • Always send the amount by rounding at least 2 decimal places.
  • 3, 3.45,…is correct. But 3.45674 is wrong. It will display an error in the PayPal page.

  • Check the php_curl extension is enabled in the server.

PayPal Payment Gateway example with PHP(3.45 KB)
Note:
If you have a problem about this payment please leave a comment here.I can help you.