<?php
/** * @author Dick Munroe <munroe@csworks.com> * @copyright copyright @ 2006 by Dick Munroe, Cottage Software Works, Inc. * @license http://www.csworks.com/publications/ModifiedNetBSD.html * @version 1.0.0 * @package paypalPDT */
/** * If you notice, there is a great deal of similarity between the processing * of PDT data and IPN data. Internally the only differences are: * * 1. The source of the data. * IPN data is received at the IPN callback via a POST. * PDT data is received at the PDT return via a GET and an interaction with Paypal. * * 2. httpPost needs to be different. * It needs to interact with Paypal AND produce a source of data from which * the PDT data can be extracted and processed. * * 3. processNotification needs to be different. * Due to the change in interface for httpPost, the "front" end of processNotification * has to be slightly different. * * All of which means that as written these classes are principally useful for sites which * use either PDT or IPN, but not both. * * Since the actual processing of the PDT or IPN data is functionally identical (at least for * most of the cases) it would be ideal if you could transparently plug in either the PDT or * IPN base class and do the right thing with a minimum of code duplication. * * Unfortunately this sort of thing is best done with "mixins" or with delegated interfaces. * Since PHP doesn't support multiple inheritance and since I REALLY dislike delagated * interfaces the way to reduce to code duplication burden and, more or less transparently, * do the same thing with either IPN or PDT invocations is to create a duplicate of the * paypalPDTBase class that inherits from the application IPN class, eliminate all the * member functions which would normally be overridden by a super class, and things should * (more or less) work identically. * * I'm going to leave actually DOING this as an excersize to the reader, but rest assured that * I have to do this as well, so the architecture of these classes will be such that it * will be as easy as possible. */ include_once("SDD/class.SDD.php") ; include_once("class.paypalPDTBase.php") ;
class examplePaypalPDT extends paypalPDTBase { function examplePaypalPDT($theReceiverEmail, $thePDTIdentityToken, $thePaypalURL = NULL, $theSandboxURL = NULL) { $this->paypalPDTBase($theReceiverEmail, $thePDTIdentityToken, $thePaypalURL, $theSandboxURL) ; } function preprocess(&$theSource) { $theSource = array_merge(array('test_pdt' => '1'), $theSource) ; echo 'preprocess:theSource = ',SDD::dump($theSource),SDD::newline() ; return true ; } function preprocessPDT(&$thePDT) { echo 'preprocessPDT:thePDT = ',SDD::dump($thePDT),SDD::newline() ; } function checkTransactionId($theTransactionId) { echo 'checkTransactionId = ',SDD::dump($theTransactionId),SDD::newline(2) ; return TRUE ; }
function validateItem(&$thePDT) { echo 'validateItem:thePDT = ',SDD::dump($thePDT),SDD::newline(2) ; return TRUE ; }
function alternatePaymentStatus(&$thePDT) { echo 'alternatePaymentStatus:thePDT = ',SDD::dump($thePDT),SDD::newline(2) ; return TRUE ; }
function processPayment(&$thePDT) { echo 'processPayment:thePDT = ',SDD::dump($thePDT),SDD::newline(2) ; return TRUE ; }
function postprocess(&$thePDT, $theStatus) { echo 'postprocess:thePDT = ',SDD::dump($thePDT),SDD::newline(2) ; echo 'postprocess:theStatus = '.SDD::dump($theStatus),SDD::newline(2) ; } } ;
/** * The identity token gets handed to you when you enable PDT for your site. * See your profile under Selling Preferences->Website Payment Preferences * for how to enable PDT. The identity token is at the top of the page * displayed AFTER you save your Website Payment Preferences. Don't loose it. * * @var string The Paypal Payment Data Transfer Identity Token */ $thePDTIdentityToken = 'XV20ACunItkcAQACjJOhIsWYUCt1D1Ce7HnqthqzwlmsHdAEddnp4si08OW' ;
$theSandbox = "sandbox." ; $theReceiverEmail = "thewizard1@csworks.com" ;
if (count($_GET) > 0) { echo 'serialize($_GET) = ',SDD::dump(serialize($_GET)),SDD::newline(2) ; echo '$_GET = ',SDD::dump($_GET),SDD::newline(2) ;
/* * For reasons I don't understand, I can't communicate reliably with the https * versions of paypal but the http versions work just fine and for testing * it doesn't matter. */ $thePDT = new ExamplePaypalPDT($theReceiverEmail, $thePDTIdentityToken, 'http://www.paypal.com/cgi-bin/webscr', 'http://www.sandbox.paypal.com/cgi-bin/webscr') ; $thePDTData = array() ; $theReturnStatus = $thePDT->processNotification($_GET, $thePDTData) ; echo 'example.php:thePDT = ',SDD::dump($thePDT),SDD::newline(2) ; echo 'example.php:theReturnStatus = ',SDD::dump($theReturnStatus),SDD::newline(2) ; } else { ?> <form action="https://www.<? echo $theSandbox ; ?>paypal.com/cgi-bin/webscr" method="post"> <p> <input type="hidden" name="cmd" value="_xclick"> <input type="hidden" name="business" value="<? echo $theReceiverEmail ; ?>"> <input type="hidden" name="item_name" value="ESPlanner Individual (Download+CD)"> <input type="hidden" name="item_number" value="000002"> <input type="hidden" name="amount" value="164.00"> <input type="hidden" name="no_shipping" value="2"> <input type="hidden" name="no_note" value="1"> <input type="hidden" name="currency_code" value="USD"> <input type="hidden" name="bn" value="PP-BuyNowBF"> <input type="hidden" name="notify_url" value=""> <input type="hidden" name="return" value="<? echo $_SERVER['SCRIPT_URI'] ; ?>"> <input type="image" src="https://www.<? echo $theSandbox ; ?>paypal.com/en_US/i/btn/x-click-but23.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!"> (Download+CD)..............164.00 <img alt="" border="0" src="https://www.<? echo $theSandbox ; ?>paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"> </p> </form> <?php } ?>
|