【发布时间】: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