I implemented the exact same integration a few weeks ago, also using T5.
My approach was to use the Dispatcher concept.
All you have to do is implement a class that implements the Dispatcher
interface. That dispatcher will get executed in the Tapestry request
handling lifecycle.
My implementation is something like this:
public class PayPalOrderNotificationDispatcher implements Dispatcher {
public static final String PATH_PREFIX = "/notifyorder";
public PayPalOrderNotificationDispatcher(/* you can inject any
Tapestry IOC service here that implements the validation logic */) {
}
public boolean dispatch(Request request, Response response) throws
IOException {
String path = request.getPath();
if (!path.startsWith(PATH_PREFIX))
return false;
// validate order
// send confirmation back to paypal
return true;
}
So now you have a Dispatcher that gets executed when someone access the
url http://myserver/mycontext/notifyorder. So just give that URL to
paypal and your set.
Baofeng Yu wrote:
> Hi,
>
> I would like to integrate Paypal with a T5 application. Previously
> with JSP, I had a paypal IPN handler jsp page. After user makes a
> payment, Paypal posts the payment data to my jsp page and my script
> checks the data and process it. The jsp script runs in the background
> and is separate from the web flow. Now in T5, what's the best way to
> implement this? Should this be done by adding an empty page with an
> onActive event and put the code there?
>
> The following is the sample code for the ipn handler:
>
> |<%@ page import="java.util.*" %>
> <%@ page import="java.net.*" %>
> <%@ page import="java.io.*" %>
>
> <%
> // read post from PayPal system and add 'cmd'
> Enumeration en = request.getParameterNames();
> String str = "cmd=_notify-validate";
> while(en.hasMoreElements()){
> String paramName = (String)en.nextElement();
> String paramValue = request.getParameter(paramName);
> str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue);
> }
>
> // post back to PayPal system to validate
> // NOTE: change http: to https: in the following URL to verify using
> SSL (for increased security).
> // using HTTPS requires either Java 1.4 or greater, or Java Secure
> Socket Extension (JSSE)
> // and configured for older versions.
> URL u = new URL("http://www.paypal.com/cgi-bin/webscr");
> URLConnection uc = u.openConnection();
> uc.setDoOutput(true);
> uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
>
> PrintWriter pw = new PrintWriter(uc.getOutputStream());
> pw.println(str);
> pw.close();
>
> BufferedReader in = new BufferedReader(
> new InputStreamReader(uc.getInputStream()));
> String res = in.readLine();
> in.close();
>
> // assign posted variables to local variables
> String itemName = request.getParameter("item_name");
> String itemNumber = request.getParameter("item_number");
> String paymentStatus = request.getParameter("payment_status");
> String paymentAmount = request.getParameter("mc_gross");
> String paymentCurrency = request.getParameter("mc_currency");
> String txnId = request.getParameter("txn_id");
> String receiverEmail = request.getParameter("receiver_email");
> String payerEmail = request.getParameter("payer_email");
>
> check notification validation
> if(res.equals("VERIFIED")) {
> // check that paymentStatus=Completed
> // check that txnId has not been previously processed
> // check that receiverEmail is your Primary PayPal email
> // check that paymentAmount/paymentCurrency are correct
> // process payment
> }
> else if(res.equals("INVALID")) {
> // log for investigation
> }
> else {
> // error
> }
> %>|
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]