【问题标题】:How do I use HTTP POST in JSP page to send a FORM to Paypal and read response?如何在 JSP 页面中使用 HTTP POST 向 Paypal 发送 FORM 并读取响应?
【发布时间】:2011-09-15 20:32:17
【问题描述】:

我正在使用 paypal 的 sandbox 来测试 Paypal 的 Payment Data Transfer (PDT) 功能。请注意,Paypal 没有用于 PDT 的 JSP 代码示例。我很震惊,因为他们似乎有其他所有示例。

根据 Paypal,我可以指定要用于处理 PDT 信息的 URL。我在我的沙盒配置文件中就是这样做的。

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

JSP 代码如下。如果您查看Paypal's Payment Data Transfer 页面,它在没有任何代码示例的情况下解释了 PDT 过程。

它声明交易ID将附加到您的个人资料中指定的URL。好的,所以我可以通过request.getParameter("tx") 获取该 ID。这是最简单的部分。

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

2) --然后页面显示“在 PayPal 对您的帖子的回复中,第一行将是 SUCCESS 或 FAIL。成功响应示例如下所示(HTTP Header 已被省略):
成功
first_name=Jane+Doe
姓氏=史密斯
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
}
%>

【问题讨论】:

标签: http jsp paypal http-post http-get


【解决方案1】:

稍微扩展@BalusC 的评论...我同意他的观点——您可能需要考虑使用 PayPal API。有两个版本,NVP(名称值对)版本和 SOAP 版本。

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

但是:

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

【讨论】:

  • 昨天看了你的评论后,我进一步研究了NVP。幸运的是,我从我正在阅读的一本 Paypal 书中找到了一个 Java 示例。我在让它工作时遇到了一些问题——因为我从 Paypal 返回了一个“不成功”的值。在这里询问这个问题是否合适,还是我应该开始另一个问题?
  • 如果您开始一个新问题的标题最能反映您的新问题,那么您将获得更好的运气(产生更多的兴趣)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
相关资源
最近更新 更多