如何在JSP页面中使用HTTPPOST向Paypal发送FORM并读取响应



我正在使用贝宝的sandbox来测试贝宝的Payment Data Transfer (PDT)功能。请注意,Paypal在JSP中没有PDT的代码示例我很震惊,因为他们似乎对其他一切都有榜样。

根据Paypal,我可以指定我想用于处理PDT信息的URL。我在我的沙箱档案中就是这么做的。

现在,我在JSP代码中遇到了一些问题。我设法得到了一些示例代码,但它可能不完整,说实话,我对其中的一些代码并不完全熟悉

JSP代码如下。如果你看看贝宝的支付数据传输页面,它在没有任何代码示例的情况下解释了PDT过程。

它表示事务id将附加到您的配置文件中指定的URL。好的,这样我就可以通过request.getParameter("tx")获取该id。这是容易的部分。

1)--但是我如何将表单(如下所示)张贴回Paypal?那部分我不明白。我该如何编码

2)-然后页面显示"在PayPal对您的帖子的回复中,第一行将是SUCCESS或FAIL。成功回复的示例如下(省略了HTTP标头):
成功
first_name=Jane+Doe
last_name=Smith
payment_status=已完成
payer_email=janedoesmith%40hotmail.com
payment_gross=3.99
mc_currency=美元
custom=For+the+purchase+of+the+rare+book+Green+Eggs+%26+Ham

如何从我的JSP页面中检索这些信息


要发布到Paypal的Html表单

<form method=post action="https://www.paypal.com/cgi-bin/webscr"> 
<input type="hidden" name="cmd" value="_notify-synch"> 
<input type="hidden" name="tx" value="TransactionID"> 
<input type="hidden" name="at" value="YourIdentityToken"> 
<input type="submit" value="PDT"> 
</form>

JSP代码

// Java JSP
<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<%
// 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);
}
String transId = request.getParameter("tx");
// 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.
java.net.URL u = new java.net.URL("https://www.sandbox.paypal.com/cgi-bin/webscr");
java.netHttpURLConnection uc = (java.net.HttpURLConnection)u.openConnection();
uc.setRequestMethod("POST");
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");
            DataSource ds = null;
            Connection conn = null;
            Statement stmt = null;
            try {
            final Context ctx = new InitialContext();
            ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mydb");
            conn = ds.getConnection();
            stmt = conn.createStatement();
            //test_paypal
            int success = stmt.executeUpdate("insert into test_paypal values("paymentStatus="+request.getParameter("payment_status")+"paymentAmount="+request.getParameter("mc_gross")+
                                             "txnId"+request.getParameter("txn_id")+")");
             }//try
             catch(Exception e) {}
             finally {
                       stmt.close();
                       conn.close();
                     }

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
}
%>

要稍微扩展一下@BalusC的评论。。。我同意他的观点——你可能想考虑使用贝宝API。有两个版本,NVP(名称-值对)版本和SOAP版本。

从本质上讲,它确实可以归结为同一件事——你获取在返回URL上传递给你的transactionId,然后用它向PayPal发出服务器端请求,以检索有关交易的详细信息。

但是:

  1. 一旦你了解了NVP API,你会发现它提供了比这个简单的PDT POST更丰富的数据
  2. NVP API将直观地让您更有意义。您还可以找到所有语言的代码示例和SDK
  3. 如果你在PayPal上做了很多工作,你会发现自己无论如何都在处理NVP API。不如现在就做吧

最新更新