I have been working with David Pollak on example code which exercises the Lift paypal library. This exercise is a prelude to using the paypal library within buyafeature.com to allow customers to pay for playing private “Buy A Feature” games.
The code for this example can be downloaded from http://tunaforcats.com/paypal-example.tar. The main touchpoints in the paypal library are the PayPalPDT and PayPalIPN objects. The PayPalPDT object supports the “Payment Data Transfer” transaction processing. This process is illustrated by the diagram available at https://www.paypal.com/en_US/i/IntegrationCenter/scr/scr_ppPDTDiagram_513x282.gif and further described at https://www.paypal.com/IntegrationCenter/ic_pdt.html (you will need to sign up for a developer account to see this and other paypal URLs – go to developer.paypal.com to get a developer account - it's free). Step 4 in the diagram triggers a call to pdtResponse function. This is where you can receive all of the details about the transaction your user completed using PayPal. The PayPalIPN object supports “Instant Payment Notification” processing. This process is illustrated by the diagram at https://www.paypal.com/en_US/i/IntegrationCenter/scr/scr_ppIPNDiagram_555x310.gif and further described at https://www.paypal.com/IntegrationCenter/ic_ipn.html. This allows for asynchronous notification of the payment separate from the PDT flow above. Step 4 in the diagram triggers a call to the PayPalIPN actions function. Going to the paypal example code, in Boot.scala you will see objects created for both PDT and IPN processing. BAFOPayPalPDT utilizes the PayPalPDT trait to redirect the user to a particular page in the sample application. BAFOPayIPN utilizes the PayPalIPN trait to capture the paypal transaction information and persist it in the database. The classes I am using to persist to the paypal transaction to the database are borrowed from Fowler’s Account pattern. Basically there is an AccountTransaction which represents the paypal transaction. The Account class in this example is being used to represent an inventory of ‘game credits’ which are available to the user in advance of playing a game. The credit (or debit) from an account is represented by the AccountEntry class. All of these classes are housed within model directory within the paypal example. The paypal example is driven by logging into the application and going to the ‘Account Admin’ page. This page allows you to manage a set of accounts (create, view, edit, delete). Once you create an account, you ‘buy’ credits by selecting the ‘view’ link associated with an existing account. This will bring you a page which shows a familiar looking ‘Buy Now’ button. This is the button which triggers the paypal flow described above. It will debit from the paypal buyer account you specify and credit to the merchant account you have previously setup. Also, for this to work, you will need to be logged into your developer paypal account (details below). After going thru the paypal process, you should end up at the account admin page where you can look to see if the account was credited. You can also go to developer.paypal.com to see if your buyer account was debited and your merchant account was credited. Running the Example In order to bring up your lift app, do the following: 0) Extract file files from the paypal-example tarball to a location to your liking. The top-level directory should be called paypal-example. 1) Create developer paypal account – Go to developer.paypal.com and hit the “Sign Up Now” button 2) Create merchant and buyer accounts - Go to “Test Accounts” and create the merchant/buyer accounts using the “Preconfigured” link. 3) Stay logged into your developer account – this is required for the paypal integration to work with your lift app. 4) Setup your properties file – in the src/main/resources directory there is a file called default.props. Copy this file to <username>.props where <username> is the OS user you are logged in as when you run the lift app. You will need to follow the instructions in the top comment section, fill in the paypal.authToken and specify the paypal.ipnHost property with your host and path (i.e. http://<hostname>.com:<port>). 5) Build and run – go to the paypal-example directory and run “mvn jetty:run” Thanks to David for helping me to get this to work. Please let us know if you have questions or suggestions. There is probably a lot more that could be done with the example to improve it or make it easier to understand. Dan --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~----------~----~----~----~------~----~------~--~---
