Как использовать HTTP POST на странице JSP, чтобы отправить ФОРМУ в Paypal и прочитать ответ? - PullRequest
0 голосов
/ 16 июня 2011

Я использую sandbox PayPal, чтобы протестировать функцию Payment Data Transfer (PDT) от PayPal.Обратите внимание: У Paypal нет примера кода в JSP для PDT. Я в шоке, поскольку у них, похоже, есть примеры для всего остального.

Согласно Paypal, яМожно указать URL, который я хочу использовать для обработки информации PDT.Я сделал это в своем профиле песочницы.

Теперь я застрял в нескольких моментах с кодом JSP.Мне удалось получить пример кода, но он может быть неполным, и, честно говоря, я не совсем знаком с некоторым кодом в нем.

Код JSP приведен ниже.Если вы посмотрите на страницу PayPal «Передача платежных данных» , она объясняет без примеров кода процесс PDT.

В нем говорится, что идентификатор транзакции будет добавлен кURL указанный в вашем профиле.Хорошо, я могу получить этот идентификатор через request.getParameter("tx").Это простая часть.

1) - Но как мне отправить форму (как показано ниже) обратно в Paypal?Эту часть я не понимаю.Как мне это кодировать?

2) - Затем на странице указывается "В ответе PayPal на ваше сообщение первой строкой будет УСПЕХ или НЕУДАЧА. Пример успешного ответавыглядит так (заголовок HTTP был опущен):УСПЕХfirst_name = Jane Doe +last_name = Smithpayment_status = Завершенныйpayer_email = janedoesmith% 40hotmail.compayment_gross = 3,99mc_currency = USDзаказ = Для + плюсовой покупки + в + с + редкую + книга + зеленый + яйца +% 26 + Ham

Как эта информация извлекается из моей страницы JSP?

HTML-форма для отправки в Paypal

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

1 Ответ

1 голос
/ 16 июня 2011

Чтобы немного расширить комментарий @ BalusC ... Я согласен с ним - вы можете рассмотреть возможность использования API PayPal. Существует две версии: версия NVP (пара имен-значений) и версия SOAP.

По сути, все сводится к одному и тому же: вы берете идентификатор транзакции, переданный вам по URL-адресу возврата, и используете его для того, чтобы сделать запрос на стороне сервера к PayPal для получения подробной информации о транзакции.

Тем не менее:

  1. Как только вы освоите API NVP, вы обнаружите, что он предоставляет гораздо более богатые данные, чем этот простой PDT POST.
  2. API NVP будет интуитивно понятнее для вас. Вы также найдете примеры кода и SDK на всех языках.
  3. Если вы много работаете с PayPal, вы все равно столкнетесь с API NVP. Возможно, просто сделай это сейчас.
...