Today I am going to step by step integrate paypal payment gateway with core PHP with Mysql Database. Payment gateway are third party options that handle all the payment transaction between customer(Payer) and merchants .They have many more available parameter like as customer name, Payer email Address ,material name, material model no, material total cost, Payer country code ore more learn to step by step paypal payment gateway integration in php source code download.
I will integrate in our previous tutorial of core PHP shopping cart project .So if you have not setup it ,do visit this tutorial and follow all steps or if you have your own project ,itβs paypal payment gateway integration in php source code download.
Step 1 : Create a e-commerce project Shop Product Page
I have our main landing page in e-commerce php project like as a
<form action="paypal.php?sandbox=1" method="post"> <input type="hidden" name="action" value="process" /> <input type="hidden" name="cmd" value="_cart" /> <input type="hidden" name="currency_code" value="INR" /> <input type="hidden" name="invoice" value="<?php echo date("His").rand(1234, 9632); ?>" /> <input type="hidden" name="material_id" value="<?php echo $model; ?>" /> <input type="hidden" name="material_name" value="<?php echo $material_name; ?>" /> <input type="hidden" name="material_quantity" value="1" /> <input type="hidden" name="material_amount" value="<?php echo $total; ?>" /> <input type="hidden" name="donor_fname" value="<?php echo $cartcheckres['name']; ?>" /> <input type="hidden" name="donor_email" value="<?php echo $cartcheckres['email']; ?>" /> <input type="hidden" name="donor_address" value="<?php echo $cartcheckres['address']; ?>" /> <input type="submit" name="submit" value="Pay now using Paypal" /> </form>
Also Read: PayPal Payment Gateway with PHP MySQL Database
Check below how our complete thank_you_page.php page looks like
<?php include "includes/header.php"; ?> <?php include "includes/left.php"; ?> <div class="center_content"> <div class="center_title_bar">My Account</div> <?php $cartcheckres=$_SESSION['checkout']; $mid=$_SESSION['mid']; ?> <table width="63%" height="141" border="0"> <tr> <td width="22%">Name</td> <td width="78%"> <?php echo $cartcheckres['name']; ?> </td> </tr> <tr> <td>Email</td> <td> <?php echo $cartcheckres['email']; ?> </td> </tr> <tr> <td>Contact</td> <td> <?php echo $cartcheckres['contact']; ?> </td> </tr> <tr> <td>Address</td> <td> <?php echo $cartcheckres['address']; ?> </td> </tr> </table> <br /> <br /> <table width="100%" border="0"> <tr> <td>Image</td> <td>Title</td> <td>Qty</td> <td>Sub Total</td> </tr> <?php $r=$mysqli->query("SELECT * FROM materials p INNER JOIN cart c ON c.pid=p.pid WHERE c.mid='$mid' "); $n=1; $total=0; $model=''; $material_name=''; while($row=$r->fetch_assoc()){ $model.=" ".$row['model']; $material_name.=" ".$row['title']; ?> <tr> <td><img width="40" src="uploads/<?php echo $row['image']; ?>" /></td> <td><?php echo $row['title']; ?></td> <td> <?php echo $row['qty']; ?></td> <td><?php echo $row['qty']*$row['cost']; $total=$total+$row['qty']*$row['cost']; ?></td> </tr> <?php $n++; } ?> <tr> <td> </td> <td> </td> <td> </td> <td>Net Total :<?php echo $total; ?></td> </tr> </table> <form action="paypal.php?sandbox=1" method="post"> <input type="hidden" name="action" value="process" /> <input type="hidden" name="cmd" value="_cart" /> <input type="hidden" name="currency_code" value="INR" /> <input type="hidden" name="invoice" value="<?php echo date("His").rand(1234, 9632); ?>" /> <input type="hidden" name="material_id" value="<?php echo $model; ?>" /> <input type="hidden" name="material_name" value="<?php echo $material_name; ?>" /> <input type="hidden" name="material_quantity" value="1" /> <input type="hidden" name="material_amount" value="<?php echo $total; ?>" /> <input type="hidden" name="donor_fname" value="<?php echo $cartcheckres['name']; ?>" /> <input type="hidden" name="donor_email" value="<?php echo $cartcheckres['email']; ?>" /> <input type="hidden" name="donor_address" value="<?php echo $cartcheckres['address']; ?>" /> <input type="submit" name="submit" value="Pay now using Paypal" /> </form> </div> <?php include "includes/right.php"; ?> </div> <?php include "includes/footer.php"; ?>
Also Read: How to Integration PayPal Payment Gateway in PHP?
Step 2 : Added switch Case
in above full paypal payment gateway integration in php source code download i have a form action like as a main file name paypal.php. Find following this php file
<?php require_once("includes/config.php"); require_once("PaypalController.php"); define('EMAIL_ADD', '[email protected]'); define('PAYPAL_EMAIL_ADD', '[email protected]'); $p = new PaypalController(); $p->admin_mail = EMAIL_ADD; $action = $_REQUEST["action"]; switch($action){ case "process": $mysqli->query("INSERT INTO gandhi_shops (invoice, material_id, material_name, material_quantity, material_amount, donor_fname, donor_address,donor_email, payment_status, posted_date) VALUES ('".$_POST["invoice"]."', '".$_POST["material_id"]."', '".$_POST["material_name"]."', '".$_POST["material_quantity"]."', '".$_POST["material_amount"]."', '".$_POST["donor_fname"]."','".$_POST["donor_address"]."','".$_POST["donor_email"]."', 'pending', NOW())"); $this_script = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; $p->add_field('business', PAYPAL_EMAIL_ADD); $p->add_field('cmd', $_POST["cmd"]); $p->add_field('upload', '1'); $p->add_field('return', $this_script.'?action=success'); $p->add_field('cancel_return', $this_script.'?action=cancel'); $p->add_field('notify_url', $this_script.'?action=ipn'); $p->add_field('currency_code', $_POST["currency_code"]); $p->add_field('invoice', $_POST["invoice"]); $p->add_field('item_name_1', $_POST["material_name"]); $p->add_field('item_number_1', $_POST["material_id"]); $p->add_field('quantity_1', $_POST["material_quantity"]); $p->add_field('amount_1', $_POST["material_amount"]); $p->add_field('first_name', $_POST["donor_fname"]); $p->add_field('address1', $_POST["donor_address"]); $p->add_field('email', $_POST["donor_email"]); $p->submit_paypal_post(); //$p->dump_fields(); break; case "success": echo '<title>Payment Done Successfully</title>'; echo '<style>.as_wrapper{ font-family:Arial; color:#333; font-size:14px; padding:20px; border:2px dashed #17A3F7; width:600px; margin:0 auto; }</style> '; echo '<div class="as_wrapper">'; echo "<h1>Payment Transaction Done Successfully</h1>"; echo '<h4><a href="my-account.php">Click here </a>to go My Account page</h4>'; echo '</div>'; break; case "cancel": echo "<h1>Transaction Cancelled "; break; case "ipn": $trasaction_id = $_POST["txn_id"]; $payment_status = strtolower($_POST["payment_status"]); $invoice = $_POST["invoice"]; $log_array = print_r($_POST, TRUE); $log_query = "SELECT * FROM paypal_log WHERE txn_id = '$trasaction_id'"; $log_check = $mysqli->query($log_query); if( $log_check->num_rows <= 0){ $mysqli->query("INSERT INTO paypal_log (txn_id, log, posted_date) VALUES ('$trasaction_id', '$log_array', NOW())"); }else{ $mysqli->query("UPDATE paypal_log SET log = '$log_array' WHERE txn_id = '$trasaction_id'"); } // Save and update the logs array $paypal_log_fetch = mysql_fetch_array($mysqli->query($log_query)); $paypal_log_fetch = $mysqli->query($log_query)->fetch_assoc(); ; $paypal_log_id = $paypal_log_fetch["id"]; if ($p->validate_ipn()){ $mysqli->query("UPDATE gandhi_shops SET trasaction_id = '$trasaction_id ', log_id = '$paypal_log_id', payment_status = '$payment_status' WHERE invoice = '$invoice'"); $subject = 'Instant Payment Notification - Recieved Payment'; $p->send_report($subject); }else{ $subject = 'Instant Payment Notification - Payment Fail'; $p->send_report($subject); } break; } ?>
In above php file 1st line itβs calling database config file, then on main included two php lines we have declared paypal merchantβe email address and notification email address. The first of all email address should be registered or signup with paypal as a main merchant account to accept here payment from online website .
here, i am in testing mode ( like as a sandbox account) ,Therefor we can put anything here .
After it handle Paypal payment process page .While on this phase it insert or added the form all the data in database mysql table βgandhi_shopsβ and full process to the paypal live mode .
Also Read: PayPal Payment Gateway PHP Source Code
Step 3 : Crteate a Database Structure
in step number Three I am regarding a database Mysql table like name as a βgandhi_shopsβ .Therefor , letβs make it , execute following the source code to sql on your phpmyadmin for your mysql database .
CREATE TABLE `gandhi_shops` ( `id` int(10) NOT NULL auto_increment, `invoice` varchar(300) NOT NULL, `trasaction_id` varchar(600) NOT NULL, `log_id` int(10) NOT NULL, `material_id` varchar(300) NOT NULL, `material_name` varchar(300) NOT NULL, `material_quantity` varchar(300) NOT NULL, `material_amount` varchar(300) NOT NULL, `donor_fname` varchar(300) NOT NULL, `donor_lname` varchar(300) NOT NULL, `donor_address` varchar(300) NOT NULL, `donor_city` varchar(300) NOT NULL, `donor_state` varchar(300) NOT NULL, `donor_zip` varchar(300) NOT NULL, `donor_country` varchar(300) NOT NULL, `donor_email` text NOT NULL, `payment_status` varchar(300) NOT NULL, `posted_date` datetime NOT NULL, PRIMARY KEY (`id`) )
Also Read: laravel paypal integration Tutorial from Scratch for Beginners
Step 4: Set Paypal IPN
here step Number four to create a file name as a PaypalController.phpβ after that update below source code in it .Thisphp file provides clean as well as simple php method or way to validate the paid output with Paypal IPN
Also Read: paypal payment gateway integration in php
<?php define('LOG_FILE', '.ipn_results.log'); define('SSL_P_URL', 'https://www.paypal.com/cgi-bin/webscr'); define('SSL_SAND_URL','https://www.sandbox.paypal.com/cgi-bin/webscr'); class PaypalController { private $ipn_status; public $admin_mail; public $paypal_mail; public $txn_id; public $ipn_log; private $ipn_response; public $ipn_data = array(); private $fields = array(); private $ipn_debug; function __construct() { $this->ipn_status = ''; $this->admin_mail = null; $this->paypal_mail = null; $this->txn_id = null; $this->tax = null; $this->ipn_log = true; $this->ipn_response = ''; $this->ipn_debug = false; } public function add_field($field, $value) { $this->fields["$field"] = $value; } public function submit_paypal_post() { $paypal_url = ($_GET['sandbox'] == 1) ? SSL_SAND_URL : SSL_P_URL; echo "<html>\n"; echo "<head><title>Processing Payment...</title></head>\n"; echo "<body onLoad=\"document.forms['paypal_form'].submit();\">\n"; echo "<h2>Please wait, your order is being processed and you"; echo " will be redirected to the paypal website.</h2>\n"; echo "<form method=\"post\" name=\"paypal_form\" "; echo "action=\"".$paypal_url."\">\n"; if (isset($this->paypal_mail))echo "<input type=\"hidden\" name=\"business\" value=\"$this->paypal_mail\"/>\n"; foreach ($this->fields as $name => $value) { echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>\n"; } echo "<br/><br/>If you are not automatically redirected to "; echo "paypal within 5 seconds...<br/><br/>\n"; echo "<input type=\"submit\" value=\"Click Here\">\n"; echo "</form>\n"; echo "</body></html>\n"; } public function validate_ipn() { $hostname = gethostbyaddr ( $_SERVER ['REMOTE_ADDR'] ); if (! preg_match ( '/paypal\.com$/', $hostname )) { $this->ipn_status = 'Validation post isn\'t from PayPal'; $this->log_ipn_results ( false ); return false; } if (isset($this->paypal_mail) && strtolower ( $_POST['receiver_email'] ) != strtolower(trim( $this->paypal_mail ))) { $this->ipn_status = "Receiver Email Not Match"; $this->log_ipn_results ( false ); return false; } if (isset($this->txn_id)&& in_array($_POST['txn_id'],$this->txn_id)) { $this->ipn_status = "txn_id have a duplicate"; $this->log_ipn_results ( false ); return false; } $paypal_url = ($_POST['test_ipn'] == 1) ? SSL_SAND_URL : SSL_P_URL; $url_parsed = parse_url($paypal_url); $post_string = ''; foreach ($_POST as $field=>$value) { $this->ipn_data["$field"] = $value; $post_string .= $field.'='.urlencode(stripslashes($value)).'&'; } $post_string.="cmd=_notify-validate"; // append ipn command if (isset($_POST['test_ipn']) ) $fp = fsockopen ( 'ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60 ); else $fp = fsockopen ( 'ssl://www.paypal.com', "443", $err_num, $err_str, 60 ); if(!$fp) { $this->ipn_status = "fsockopen error no. $err_num: $err_str"; $this->log_ipn_results(false); return false; } else { // Post the data back to paypal fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n"); fputs($fp, "Host: $url_parsed[host]\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ".strlen($post_string)."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $post_string . "\r\n\r\n"); while(!feof($fp)) { $this->ipn_response .= fgets($fp, 1024); } fclose($fp); } if (! eregi("VERIFIED",$this->ipn_response)) { $this->ipn_status = 'IPN Validation Failed'; $this->log_ipn_results(false); return false; } else { $this->ipn_status = "IPN VERIFIED"; $this->log_ipn_results(true); return true; } } private function log_ipn_results($success) { $hostname = gethostbyaddr ( $_SERVER ['REMOTE_ADDR'] ); $text = '[' . date ( 'm/d/Y g:i A' ) . '] - '; if ($success) $this->ipn_status = $text . 'SUCCESS:' . $this->ipn_status . "!\n"; else $this->ipn_status = $text . 'FAIL: ' . $this->ipn_status . "!\n"; $this->ipn_status .= "[From:" . $hostname . "|" . $_SERVER ['REMOTE_ADDR'] . "]IPN POST Vars Received By Paypal_IPN Response API:\n"; foreach ( $this->ipn_data as $key => $value ) { $this->ipn_status .= "$key=$value \n"; } $this->ipn_status .= "IPN Response from Paypal Server:\n" . $this->ipn_response; $this->write_to_log (); } private function write_to_log() { if (! $this->ipn_log) return; $fp = fopen ( LOG_FILE , 'a' ); fwrite ( $fp, $this->ipn_status . "\n\n" ); fclose ( $fp ); // close file chmod ( LOG_FILE , 0600 ); } public function send_report($subject) { $body .= "from " . $this->ipn_data ['donor_email'] . " on " . date ( 'm/d/Y' ); $body .= " at " . date ( 'g:i A' ) . "\n\nDetails:\n" . $this->ipn_status; mail ( $this->admin_mail, $subject, $body ); } public function print_report(){ $find [] = "\n"; $replace [] = '<br/>'; $html_content = str_replace ( $find, $replace, $this->ipn_status ); echo $html_content; } public function dump_fields() { echo "<h3>PaypalController->dump_fields() Output:</h3>"; echo "<table width=\"95%\" border=\"1\" cellpadding=\"2\" cellspacing=\"0\"> <tr> <td bgcolor=\"black\"><b><font color=\"white\">Field Name</font></b></td> <td bgcolor=\"black\"><b><font color=\"white\">Value</font></b></td> </tr>"; ksort($this->fields); foreach ($this->fields as $key => $value) {echo "<tr><td>$key</td><td>".urldecode($value)." </td></tr>";} echo "</table><br>"; } private function debug($msg) { if (! $this->ipn_debug) return; $today = date ( "Y-m-d H:i:s " ); $myFile = ".ipn_debugs.log"; $fh = fopen ( $myFile, 'a' ) or die ( "Can't open mode of the debug file. Please manually make the 'debug.log' file and make it writable." ); $ua_simple = preg_replace ( "/(.*)\s\(.*/", "\\1", $_SERVER ['HTTP_USER_AGENT'] ); fwrite ( $fh, $today . " [from: " . $_SERVER ['REMOTE_ADDR'] . "|$ua_simple] - " . $msg . "\n" ); fclose ( $fh ); chmod ( $myFile, 0600 ); } }
and last step paypal payment gateway integration in php source code download to open thank_you_page.php on your any default browser Like as a Example URL: http://localhost/my_php/thank_you_page.php. and then imple Click button this text to βPay now using Paypalβ. after that It redirect to next page. and here Check or verify there if all form field required argyments data value are passing correctly. and then about 5 sec to it redirect to main offical website like as a paypal.com.you can also here Do check if all information like as a material name ,model as well as complete total cost are correct . well, best step by step learn to paypal sandbox ,means paypal provide for developer for test means sandbox integration on this mode.
Also Read: Laravel 5.4 Paypal integration β Paypal Payment Gateway
and you can successful integration, then Delete query string like as a β?sandbox=1β from HTML form action on thank_you_page.php file and update working merchant email address in main paypal.php file .
I am Jaydeep Gondaliya , a software engineer, the founder and the person running Pakainfo. I’m a full-stack developer, entrepreneur and owner of Pakainfo.com. I live in India and I love to write tutorials and tips that can help to other artisan, a Passionate Blogger, who love to share the informative content on PHP, JavaScript, jQuery, Laravel, CodeIgniter, VueJS, AngularJS and Bootstrap from the early stage.