Difference between revisions of "PayPal"

From Organic Design wiki
(Good IPN tech info)
(Using paypal sandbox to test purchases)
Line 21: Line 21:
 
*[https://www.paypal.com/helpcenter/main.jsp;jsessionid=HJYGzrhnBSnHTFvBB1JLFSrVq5FGw7LT49RVPCr34y3J3LPDlphh!-1839041657?t=solutionTab&ft=homeTab&ps=&target=_parent&solutionId=10768&locale=en_US&_dyncharset=UTF-8&countrycode=US&cmd=_help&serverInstance=9003 What's the difference between IPN and PDT?]
 
*[https://www.paypal.com/helpcenter/main.jsp;jsessionid=HJYGzrhnBSnHTFvBB1JLFSrVq5FGw7LT49RVPCr34y3J3LPDlphh!-1839041657?t=solutionTab&ft=homeTab&ps=&target=_parent&solutionId=10768&locale=en_US&_dyncharset=UTF-8&countrycode=US&cmd=_help&serverInstance=9003 What's the difference between IPN and PDT?]
  
=== IPN code sample ===
+
== PayPal Sandbox ==
{{code|<php>
+
The paypal sandbox allows all operations done within the paypal site to be performed within a test environment. To test paypal code working in other sites and applications, you must set up two test accounts under different email addresses, one for the buyer and one for the seller. The buyer must add a credit card from which the payments can come from when testing a purchase operation. To do this, login to the buyers account (at www.sandbox.paypal.com) and then go to '''profile/financial information/credit cards''' and make a note of the credit card number it shows and then proceed to "add credit card" and use the number to fill in the form.
<?php
 
 
 
// 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 ('www.paypal.com', 80, $errno, $errstr, 30);
 
 
 
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
 
 
 
// echo the response
 
echo "The response from IPN was: <b>" .$res ."</b><br><br>";
 
 
 
//loop through the $_POST array and print all vars to the screen.
 
 
 
foreach($_POST as $key => $value) echo $key." = ". $value."<br>";
 
 
 
}
 
else if (strcmp ($res, "INVALID") == 0) {
 
// log for manual investigation
 
 
 
// echo the response
 
echo "The response from IPN was: <b>" .$res ."</b>";
 
}
 
}
 
fclose ($fp);
 
}
 
?>
 
</php>}}
 
 
 
== PDT code sample ==
 
{{code|<php>
 
<?php
 
// read the post from PayPal system and add 'cmd'
 
$req = 'cmd=_notify-synch';
 
 
 
$tx_token = $_GET['tx'];
 
$auth_token = "GX_sTf5bW3wxRfFEbgofs88nQxvMQ7nsI8m21rzNESnl_79ccFTWj2aPgQ0";
 
$req .= "&tx=$tx_token&at=$auth_token";
 
 
 
// 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 ('www.paypal.com', 80, $errno, $errstr, 30);
 
// If possible, securely post back to paypal using HTTPS
 
// Your PHP server will need to be SSL enabled
 
// $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
 
 
 
if (!$fp) {
 
// HTTP ERROR
 
} else {
 
fputs ($fp, $header . $req);
 
// read the body data
 
$res = '';
 
$headerdone = false;
 
while (!feof($fp)) {
 
$line = fgets ($fp, 1024);
 
if (strcmp($line, "\r\n") == 0) {
 
// read the header
 
$headerdone = true;
 
}
 
else if ($headerdone)
 
{
 
// header has been read. now read the contents
 
$res .= $line;
 
}
 
}
 
 
 
// parse the data
 
$lines = explode("\n", $res);
 
$keyarray = array();
 
if (strcmp ($lines[0], "SUCCESS") == 0) {
 
for ($i=1; $i<count($lines);$i++){
 
list($key,$val) = explode("=", $lines[$i]);
 
$keyarray[urldecode($key)] = urldecode($val);
 
}
 
// 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
 
$firstname = $keyarray['first_name'];
 
$lastname = $keyarray['last_name'];
 
$itemname = $keyarray['item_name'];
 
$amount = $keyarray['payment_gross'];
 
 
 
echo ("<p><h3>Thank you for your purchase!</h3></p>");
 
 
 
echo ("<b>Payment Details</b><br>\n");
 
echo ("<li>Name: $firstname $lastname</li>\n");
 
echo ("<li>Item: $itemname</li>\n");
 
echo ("<li>Amount: $amount</li>\n");
 
echo ("");
 
}
 
else if (strcmp ($lines[0], "FAIL") == 0) {
 
// log for manual investigation
 
}
 
 
 
}
 
 
 
fclose ($fp);
 
 
 
?>
 
</php>}}
 

Revision as of 06:21, 7 December 2007

MediaWiki Extension

MW:Extension:PayPal is an extension for creating PayPal donation forms using a <paypal> tag. PokerCoder requested adding IPN support to the extension through this RentACoder job and has accepted User:Nad's bid to complete the work.

IPN

Instant Payment Notification, included with Website Payment products, Express Checkout, and Standard Checkout, is available to PayPal Premier and Business members. Instant Payment Notification allows you to integrate your PayPal payments with your website's back-end operations, so that you get immediate notification and authentication of any PayPal payments and disputes you may receive.

When a customer makes a payment to you, PayPal will post a notification to your server at a URL you specify. Included in this notification will be all of your customer's payment information (e.g. customer name, amount) as well as a piece of encrypted code. When your server receives a notification, it will then post the information, including the encrypted code, back to a secure PayPal URL. PayPal will authenticate the transaction by checking the encrypted string. This post-back of the IPN data to PayPal prevents "spoofing," so you can be sure that the IPN came from PayPal. Upon verification, PayPal will send confirmation of its validity back to your server.

PDT

PayPal Sandbox

The paypal sandbox allows all operations done within the paypal site to be performed within a test environment. To test paypal code working in other sites and applications, you must set up two test accounts under different email addresses, one for the buyer and one for the seller. The buyer must add a credit card from which the payments can come from when testing a purchase operation. To do this, login to the buyers account (at www.sandbox.paypal.com) and then go to profile/financial information/credit cards and make a note of the credit card number it shows and then proceed to "add credit card" and use the number to fill in the form.