Integreer PayPal met PHP

Paypal is een online bank die zich richt op services rondom het online kunnen betalen van producten en diensten. Zowel particulieren als ook bedrijven kunnen met Paypal online geld ontvangen en versturen op basis van een e-mail adres. Paypal werd met name erg bekend vanwege het gebruikt op Ebay waarbij Paypal een stukje veiligheid bood aan zowel de verkoper als ook de koper.

Misschien heb je nu een online shop of een website waarop diensten of producten worden verkocht!? Nu wil je op een correcte en nette manier de Paypal betaalwijze aanbieden. Hoe integreer je PayPal met de scripting taal php? Hieronder een toelichting van een programmeur waarbij hij laat zien hoe hij dit heeft gedaan.

STAP 1

Aanmaken Sandbox Account

Je maakt eerst een account aan op developer.paypal.com. Dit is een zogenaamde sandbox (speel gebied) van Paypal waar je alle mogelijkheden van paypal kunt testen voordat je de applicatie / website echt online / live gaat zetten.
paypal-developer-tutorial


Maak bij developer.paypal.com zowel een bussiness account aan als ook een gewone user account. Dit is namelijk handig bij het testen. Log in op het bussines account om vervolgens een button te kunnen maken.
paypal-maak-button

Klik bijvoorbeeld eens op de “Buy Now Button”. Je ziet vervolgens een scherm met diverse opties die je kunt invullen waaronder de hoogte van het bedrag, eigen knoppen, etc.
paypal-button-maken-1
Zodra je de button naar wens hebt ingesteld dan kun je de HTML overnemen en in jouw eigen site / pagina gebruiken. Hieronder een voorbeeld van html code:
<form action=”https://www.sandbox.paypal.com/cgi-bin/webscr” method=”post”>
<input type=”hidden” name=”custom” value=”<?php echo $session->user_id_session; ?>”>
<input type=”hidden” name=”cmd” value=”_s-xclick”>
<input type=”hidden” name=”hosted_button_id” value=”343SNKK8822″>
<input type=”image” src=”https://www.sandbox.paypal.com/en_US/i/btn/btn_subscribeCC_LG.gif” border=”0″ name=”submit” alt=”PayPal – The safer, easier way to pay online!”>
<img alt=”” border=”0″ src=”https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif” width=”1″ height=”1″>
</form>

Let op: in de bovenstaande html moet eigenlijk nog een extra hidden input worden toegevoegd, de id code van de bezoeker voor eigen gebruik. Mogelijk wil je in een eigen database ook bijhouden welke bezoekers uiteindelijk betaald hebben met Paypal.

Stap 2

Je moet in jouw eigen script / site doorgeven aan Paypal waar deze dienst naartoe moet verwijzen nadat een bezoeker heeft betaald. Je kunt het zien als een soort bedankt.html / .php pagina. In de code hieronder is het thanks.php genoemd. Ook deze bedankt pagina kun je met behulp van de standaard scripts van paypal maken. Zie https://www.paypaltech.com/SG2/

Je ziet vervolgens een scherm met diverse programmeer-/scripting talen. Hier kiezen we, voor dit voorbeeld, voor PHP. Maar je kunt ook kiezen voor PERL, ASP/VBScript, ASP.NET/C#, ASP.NET/VB, Cold Fusion of Java/JSP. Vervolgens kun je een script type kiezen zoals PHP opslaan in MYsql of PHP met send email of PHP met write to HTML. We kiezen nu voor het opslaan in een database, dus IPN PHP Write to DB (mysql). Nu moet je hier de MySQL details invullen zoals de username, database naam, server naam, etc. Vervolgens krijg je een PHP script te zien. Neem deze code over en sla het op als thanks.php.

Zie hieronder de voorbeeld-code, echter ik raad je aan gewoon de online versie te gebruiken zodat je altijd de laatste PHP code versie van Paypal krijgt. Onderstaande code kan verouderd zijn:
<?php

/////////////////////////////////////////////////
/////////////Begin Script below./////////////////
/////////////////////////////////////////////////

// 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”;

// If testing on Sandbox use:
//$fp = fsockopen (‘ssl://www.sandbox.paypal.com’, 443, $errno, $errstr, 30);

$fp = fsockopen (‘ssl://www.paypal.com’, 443, $errno, $errstr, 30);

// assign posted variables to local variables
$item_name = $_POST[‘item_name’];
$business = $_POST[‘business’];
$item_number = $_POST[‘item_number’];
$payment_status = $_POST[‘payment_status’];
$mc_gross = $_POST[‘mc_gross’];
$payment_currency = $_POST[‘mc_currency’];
$txn_id = $_POST[’txn_id’];
$receiver_email = $_POST[‘receiver_email’];
$receiver_id = $_POST[‘receiver_id’];
$quantity = $_POST[‘quantity’];
$num_cart_items = $_POST[‘num_cart_items’];
$payment_date = $_POST[‘payment_date’];
$first_name = $_POST[‘first_name’];
$last_name = $_POST[‘last_name’];
$payment_type = $_POST[‘payment_type’];
$payment_status = $_POST[‘payment_status’];
$payment_gross = $_POST[‘payment_gross’];
$payment_fee = $_POST[‘payment_fee’];
$settle_amount = $_POST[‘settle_amount’];
$memo = $_POST[‘memo’];
$payer_email = $_POST[‘payer_email’];
$txn_type = $_POST[’txn_type’];
$payer_status = $_POST[‘payer_status’];
$address_street = $_POST[‘address_street’];
$address_city = $_POST[‘address_city’];
$address_state = $_POST[‘address_state’];
$address_zip = $_POST[‘address_zip’];
$address_country = $_POST[‘address_country’];
$address_status = $_POST[‘address_status’];
$item_number = $_POST[‘item_number’];
$tax = $_POST[’tax’];
$option_name1 = $_POST[‘option_name1’];
$option_selection1 = $_POST[‘option_selection1’];
$option_name2 = $_POST[‘option_name2’];
$option_selection2 = $_POST[‘option_selection2’];
$for_auction = $_POST[‘for_auction’];
$invoice = $_POST[‘invoice’];
$custom = $_POST[‘custom’];
$notify_version = $_POST[‘notify_version’];
$verify_sign = $_POST[‘verify_sign’];
$payer_business_name = $_POST[‘payer_business_name’];
$payer_id =$_POST[‘payer_id’];
$mc_currency = $_POST[‘mc_currency’];
$mc_fee = $_POST[‘mc_fee’];
$exchange_rate = $_POST[‘exchange_rate’];
$settle_currency  = $_POST[‘settle_currency’];
$parent_txn_id  = $_POST[‘parent_txn_id’];
$pending_reason = $_POST[‘pending_reason’];
$reason_code = $_POST[‘reason_code’];

// subscription specific vars

$subscr_id = $_POST[‘subscr_id’];
$subscr_date = $_POST[‘subscr_date’];
$subscr_effective  = $_POST[‘subscr_effective’];
$period1 = $_POST[‘period1’];
$period2 = $_POST[‘period2’];
$period3 = $_POST[‘period3’];
$amount1 = $_POST[‘amount1’];
$amount2 = $_POST[‘amount2’];
$amount3 = $_POST[‘amount3’];
$mc_amount1 = $_POST[‘mc_amount1’];
$mc_amount2 = $_POST[‘mc_amount2’];
$mc_amount3 = $_POST[‘mcamount3’];
$recurring = $_POST[‘recurring’];
$reattempt = $_POST[‘reattempt’];
$retry_at = $_POST[‘retry_at’];
$recur_times = $_POST[‘recur_times’];
$username = $_POST[‘username’];
$password = $_POST[‘password’];

//auction specific vars

$for_auction = $_POST[‘for_auction’];
$auction_closing_date  = $_POST[‘auction_closing_date’];
$auction_multi_item  = $_POST[‘auction_multi_item’];
$auction_buyer_id  = $_POST[‘auction_buyer_id’];

//DB connect creds and email
$notify_email =  “sdsd@sdksdkn.nl”;         //email address to which debug emails are sent to
$DB_Server = “asdfasd”; //your MySQL Server
$DB_Username = “dfdfdfdf”; //your MySQL User Name
$DB_Password = “34sdsdsd”; //your MySQL Password
$DB_DBName = “ssswwwe”; //your MySQL Database Name

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, “VERIFIED”) == 0) {

//create MySQL connection
$Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password)
or die(“Couldn’t connect to MySQL:<br>” . mysql_error() . “<br>” . mysql_errno());

//select database
$Db = @mysql_select_db($DB_DBName, $Connect)
or die(“Couldn’t select database:<br>” . mysql_error(). “<br>” . mysql_errno());

$fecha = date(“m”).”/”.date(“d”).”/”.date(“Y”);
$fecha = date(“Y”).date(“m”).date(“d”);

//check if transaction ID has been processed before
$checkquery = “select txnid from paypal_payment_info where txnid='”.$txn_id.”‘”;
$sihay = mysql_query($checkquery) or die(“Duplicate txn id check query failed:<br>” . mysql_error() . “<br>” . mysql_errno());
$nm = mysql_num_rows($sihay);
if ($nm == 0){

//execute query

if ($txn_type == “cart”){
$strQuery = “insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values (‘”.$payment_status.”‘,'”.$payer_email.”‘,'”.$first_name.”‘,'”.$last_name.”‘,'”.$address_street.”‘,'”.$address_city.”‘,'”.$address_state.”‘,'”.$address_zip.”‘,'”.$address_country.”‘,'”.$mc_gross.”‘,'”.$mc_fee.”‘,'”.$memo.”‘,'”.$payment_type.”‘,'”.$payment_date.”‘,'”.$txn_id.”‘,'”.$pending_reason.”‘,'”.$reason_code.”‘,'”.$tax.”‘,'”.$fecha.”‘)”;

$result = mysql_query($strQuery) or die(“Cart – paypal_payment_info, Query failed:<br>” . mysql_error() . “<br>” . mysql_errno());
for ($i = 1; $i <= $num_cart_items; $i++) {
$itemname = “item_name”.$i;
$itemnumber = “item_number”.$i;
$on0 = “option_name1_”.$i;
$os0 = “option_selection1_”.$i;
$on1 = “option_name2_”.$i;
$os1 = “option_selection2_”.$i;
$quantity = “quantity”.$i;

$struery = “insert into paypal_cart_info(txnid,itemnumber,itemname,os0,on0,os1,on1,quantity,invoice,custom) values (‘”.$txn_id.”‘,'”.$_POST[$itemnumber].”‘,'”.$_POST[$itemname].”‘,'”.$_POST[$on0].”‘,'”.$_POST[$os0].”‘,'”.$_POST[$on1].”‘,'”.$_POST[$os1].”‘,'”.$_POST[$quantity].”‘,'”.$invoice.”‘,'”.$custom.”‘)”;
$result = mysql_query($struery) or die(“Cart – paypal_cart_info, Query failed:<br>” . mysql_error() . “<br>” . mysql_errno());

}
}

else{
$strQuery = “insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,itemnumber,itemname,os0,on0,os1,on1,quantity,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values (‘”.$payment_status.”‘,'”.$payer_email.”‘,'”.$first_name.”‘,'”.$last_name.”‘,'”.$address_street.”‘,'”.$address_city.”‘,'”.$address_state.”‘,'”.$address_zip.”‘,'”.$address_country.”‘,'”.$mc_gross.”‘,'”.$mc_fee.”‘,'”.$item_number.”‘,'”.$item_name.”‘,'”.$option_name1.”‘,'”.$option_selection1.”‘,'”.$option_name2.”‘,'”.$option_selection2.”‘,'”.$quantity.”‘,'”.$memo.”‘,'”.$payment_type.”‘,'”.$payment_date.”‘,'”.$txn_id.”‘,'”.$pending_reason.”‘,'”.$reason_code.”‘,'”.$tax.”‘,'”.$fecha.”‘)”;
$result = mysql_query(“insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,itemnumber,itemname,os0,on0,os1,on1,quantity,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values (‘”.$payment_status.”‘,'”.$payer_email.”‘,'”.$first_name.”‘,'”.$last_name.”‘,'”.$address_street.”‘,'”.$address_city.”‘,'”.$address_state.”‘,'”.$address_zip.”‘,'”.$address_country.”‘,'”.$mc_gross.”‘,'”.$mc_fee.”‘,'”.$item_number.”‘,'”.$item_name.”‘,'”.$option_name1.”‘,'”.$option_selection1.”‘,'”.$option_name2.”‘,'”.$option_selection2.”‘,'”.$quantity.”‘,'”.$memo.”‘,'”.$payment_type.”‘,'”.$payment_date.”‘,'”.$txn_id.”‘,'”.$pending_reason.”‘,'”.$reason_code.”‘,'”.$tax.”‘,'”.$fecha.”‘)”) or die(“Default – paypal_payment_info, Query failed:<br>” . mysql_error() . “<br>” . mysql_errno());
}

// send an email in any case
echo “Verified”;
mail($notify_email, “VERIFIED IPN”, “$res\n $req\n $strQuery\n $struery\n  $strQuery2”);
}
else {
// send an email
mail($notify_email, “VERIFIED DUPLICATED TRANSACTION”, “$res\n $req \n $strQuery\n $struery\n  $strQuery2”);
}

//subscription handling branch
if ( $txn_type == “subscr_signup”  ||  $txn_type == “subscr_payment”  ) {

// insert subscriber payment info into paypal_payment_info table
$strQuery = “insert into paypal_payment_info(paymentstatus,buyer_email,firstname,lastname,street,city,state,zipcode,country,mc_gross,mc_fee,memo,paymenttype,paymentdate,txnid,pendingreason,reasoncode,tax,datecreation) values (‘”.$payment_status.”‘,'”.$payer_email.”‘,'”.$first_name.”‘,'”.$last_name.”‘,'”.$address_street.”‘,'”.$address_city.”‘,'”.$address_state.”‘,'”.$address_zip.”‘,'”.$address_country.”‘,'”.$mc_gross.”‘,'”.$mc_fee.”‘,'”.$memo.”‘,'”.$payment_type.”‘,'”.$payment_date.”‘,'”.$txn_id.”‘,'”.$pending_reason.”‘,'”.$reason_code.”‘,'”.$tax.”‘,'”.$fecha.”‘)”;
$result = mysql_query($strQuery) or die(“Subscription – paypal_payment_info, Query failed:<br>” . mysql_error() . “<br>” . mysql_errno());

// insert subscriber info into paypal_subscription_info table
$strQuery2 = “insert into paypal_subscription_info(subscr_id , sub_event, subscr_date ,subscr_effective,period1,period2, period3, amount1 ,amount2 ,amount3,  mc_amount1,  mc_amount2,  mc_amount3, recurring, reattempt,retry_at, recur_times, username ,password, payment_txn_id, subscriber_emailaddress, datecreation) values (‘”.$subscr_id.”‘, ‘”.$txn_type.”‘,'”.$subscr_date.”‘,'”.$subscr_effective.”‘,'”.$period1.”‘,'”.$period2.”‘,'”.$period3.”‘,'”.$amount1.”‘,'”.$amount2.”‘,'”.$amount3.”‘,'”.$mc_amount1.”‘,'”.$mc_amount2.”‘,'”.$mc_amount3.”‘,'”.$recurring.”‘,'”.$reattempt.”‘,'”.$retry_at.”‘,'”.$recur_times.”‘,'”.$username.”‘,'”.$password.”‘, ‘”.$txn_id.”‘,'”.$payer_email.”‘,'”.$fecha.”‘)”;
$result = mysql_query($strQuery2) or die(“Subscription – paypal_subscription_info, Query failed:<br>” . mysql_error() . “<br>” . mysql_errno());

mail($notify_email, “VERIFIED IPN”, “$res\n $req\n $strQuery\n $struery\n  $strQuery2”);

}
}

// if the IPN POST was ‘INVALID’…do this

else if (strcmp ($res, “INVALID”) == 0) {
// log for manual investigation

mail($notify_email, “INVALID IPN”, “$res\n $req”);
}
}
fclose ($fp);
}
?>

Stap 3

De laatste stap is toevoegen van de tabellen in jouw database. Ook dit wordt door Paypal aangeboden als MYSQL sql queries en kun je gewoon overnemen. Met behulp van PHP My Admin kun je deze SQL dan eenvoudig copy-pasten en laten uitvoeren. Hieronder voorbeeld code:
# Table structure for table `paypal_cart_info` #

CREATE TABLE `paypal_cart_info` ( `txnid` varchar(30) NOT NULL default ”, `itemname` varchar(255) NOT NULL default ”, `itemnumber` varchar(50) default NULL, `os0` varchar(20) default NULL, `on0` varchar(50) default NULL, `os1` varchar(20) default NULL, `on1` varchar(50) default NULL, `quantity` char(3) NOT NULL default ”, `invoice` varchar(255) NOT NULL default ”, `custom` varchar(255) NOT NULL default ” ) TYPE=MyISAM;

# Table structure for table `paypal_subscription_info`#

CREATE TABLE `paypal_subscription_info` ( `subscr_id` varchar(255) NOT NULL default ”, `sub_event` varchar(50) NOT NULL default ”, `subscr_date` varchar(255) NOT NULL default ”, `subscr_effective` varchar(255) NOT NULL default ”, `period1` varchar(255) NOT NULL default ”, `period2` varchar(255) NOT NULL default ”, `period3` varchar(255) NOT NULL default ”, `amount1` varchar(255) NOT NULL default ”, `amount2` varchar(255) NOT NULL default ”, `amount3` varchar(255) NOT NULL default ”, `mc_amount1` varchar(255) NOT NULL default ”, `mc_amount2` varchar(255) NOT NULL default ”, `mc_amount3` varchar(255) NOT NULL default ”, `recurring` varchar(255) NOT NULL default ”, `reattempt` varchar(255) NOT NULL default ”, `retry_at` varchar(255) NOT NULL default ”, `recur_times` varchar(255) NOT NULL default ”, `username` varchar(255) NOT NULL default ”, `password` varchar(255) default NULL, `payment_txn_id` varchar(50) NOT NULL default ”, `subscriber_emailaddress` varchar(255) NOT NULL default ”, `datecreation` date NOT NULL default ‘0000-00-00’ ) TYPE=MyISAM;

# Table structure for table `paypal_payment_info` #

CREATE TABLE `paypal_payment_info` ( `firstname` varchar(100) NOT NULL default ”, `lastname` varchar(100) NOT NULL default ”, `buyer_email` varchar(100) NOT NULL default ”, `street` varchar(100) NOT NULL default ”, `city` varchar(50) NOT NULL default ”, `state` char(3) NOT NULL default ”, `zipcode` varchar(11) NOT NULL default ”, `memo` varchar(255) default NULL, `itemname` varchar(255) default NULL, `itemnumber` varchar(50) default NULL, `os0` varchar(20) default NULL, `on0` varchar(50) default NULL, `os1` varchar(20) default NULL, `on1` varchar(50) default NULL, `quantity` char(3) default NULL, `paymentdate` varchar(50) NOT NULL default ”, `paymenttype` varchar(10) NOT NULL default ”, `txnid` varchar(30) NOT NULL default ”, `mc_gross` varchar(6) NOT NULL default ”, `mc_fee` varchar(5) NOT NULL default ”, `paymentstatus` varchar(15) NOT NULL default ”, `pendingreason` varchar(10) default NULL, `txntype` varchar(10) NOT NULL default ”, `tax` varchar(10) default NULL, `mc_currency` varchar(5) NOT NULL default ”, `reasoncode` varchar(20) NOT NULL default ”, `custom` varchar(255) NOT NULL default ”, `country` varchar(20) NOT NULL default ”, `datecreation` date NOT NULL default ‘0000-00-00’ ) TYPE=MyISAM;

Je kunt nu het script gaan testen.

Het is niet ‘soundbox’ maar ‘sandbox’. 🙂 Verder moet ik een en ander nog uitpluizen. De link naar paypaltech.com is sowieso erg nuttig.

Bedankt! Dit staat al een tijdje fout op de website. Dom ook, want op de afbeelding is ook duidelijk te zien dat het gaat om Sandbox.

2 reacties

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

zoeken naar grote afbeeldingen website
Webdesign
Zoek en fix de zwaargewichten: grote afbeeldingen op jouw website lokaliseren

Ten behoeve van SEO en om te voorkomen dat gebruikers gefrustreerd raken, is het verstandig om te zorgen dat je een snel ladende website hebt. Eén van de belangrijkste oorzaken van trages websites en lange laadtijden zijn (te) grote afbeeldingen. Dus de bestanden van de afbeeldingen zijn groot (veel kilobytes) …

super goedkoop een website maken
Webdesign
Super goedkope website met domeinnaam

Je hebt een klein bedrijf, je bent pas net begonnen of je hebt gewoonweg weinig budget. Hoe en waar moet je dan zijn om een super goedkope website te maken met jouw eigen domeinnaam? Op deze website zijn meerdere artikelen te vinden over de verschillende prijzen van hostingproviders, over het …

voordelen nadelen Wordpress
Webdesign
De voordelen en nadelen van WordPress

Misschien overweeg je een website te bouwen of te laten bouwen met behulp van WordPress. Of er is een andere reden dat je onderzoek doet naar WordPress. Hoe dan ook, je vraagt je af: Wat zijn de voordelen van WordPress? En wat zijn de nadelen? Dus je zoekt een duidelijk …

Shares