Почему Java servlet не может каждый раз получать IPN-сообщения Paypal?

StackOverflow https://stackoverflow.com/questions/2554503

Вопрос

У меня есть Java-сервлет, запущенный на моем ноутбуке с Windows Vista, я настроил статический IP, сделал переадресацию портов и зарегистрировался в бесплатной службе DDNS, теперь мой сервлет запущен, я дал URL Paypal для отправки мне сообщений IPN, я перешел на его сайт sandbox, попал на страницу test tools, попытался отправить тестовые сообщения, нажав кнопку "Отправить IPN", большую часть времени это не удавалось, ошибка в том, что :"Не удалось выполнить доставку IPN.Не удается подключиться к указанному URL-адресу.Пожалуйста, проверьте URL-адрес и повторите попытку ".

Но, возможно, 1 раз из 10 это может быть успешным, и мой сервлет получит сообщение, и я просмотрел полученные сообщения, они в правильном формате.Итак, я позвонил в Paypal и спросил, почему, он сказал, что я не должен запускать сервлет на своем ноутбуке, вместо этого я должен запустить его на веб-сервере, но я сказал ему, что мой провайдер не поддерживает Java на своем сервере, и поскольку я выполнил все вышеуказанные шаги, не должно ли быть то же самое с запуском сервлета на моем ноутбуке?Он сказал, что его тест показал, что он не может добраться до моего сервлета, но я спросил, почему, возможно, в 1 из 10 раз это удается сделать?Если что-то не так с запуском его на моем ноутбуке, то в 100% случаев он должен завершиться неудачей, я прав в этом вопросе?Но в любом случае он сказал, что это все, что он может сделать, и я должен устранить это сам.Сервлет выглядит следующим образом :

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class PayPal_Servlet extends HttpServlet
{
  static boolean Debug=true;
  static String PayPal_Url="https://www.paypal.com/cgi-bin/webscr",Sandbox_Url="https://www.sandbox.paypal.com/cgi-bin/webscr",
                Dir_License_Messages="C:/Dir_License_Messages/";
  static TransparencyExample Transparency_Example;
  static PayPal_Message_To_License_File_Worker PayPal_message_to_license_file_worker;
  // Initializes the servlet.
  public void init(ServletConfig config) throws ServletException
  {
    super.init(config);
    if (!new File(Dir_License_Messages).exists()) new File(Dir_License_Messages).mkdirs();
    System.gc();
  }

  /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
   * @param request servlet request
   * @param response servlet response
   */
  protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
  {
    // 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(Debug?Sandbox_Url:PayPal_Url);
    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");

    if (res.equals("VERIFIED"))        // Check notification validation
    {
      // 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                               // Log for error
    {

    }
// ===========================================================================
    if (txnId!=null)
    {
      Write_File_Safe_Fast(Dir_License_Messages+txnId+".txt",new StringBuffer(str.replace("&","\n")),false);
    }

// ===========================================================================
    String Message_File_List[]=Tool_Lib.Get_File_List_From_Dir(Dir_License_Messages);
    response.setContentType("text/html");
    PrintWriter out=response.getWriter();
    String title="Reading All Request Parameters",Name="",Value;
    out.println("<Html><Head><Title>"+title+"</Title></Head>\n<Body Bgcolor=\"#FDF5E6\">\n<H1 Align=Center>"+title+"</H1>\n"+
                "<Table Border=1 Align=Center>\n"+"<Tr Bgcolor=\"#FFAD00\"><Th>Parameter Name</Th><Th>Parameter Value(s)   Messages = "+Message_File_List.length+"</Th></Tr>");
    Enumeration paramNames=request.getParameterNames();
    while(paramNames.hasMoreElements())
    {
      String paramName=(String)paramNames.nextElement();
      out.print("<Tr><Td>"+paramName+"</Td><Td>");
      String[] paramValues=request.getParameterValues(paramName);
      if (paramValues.length == 1)
      {
        String paramValue=paramValues[0];
        if (paramValue.length() == 0) out.print("<I>No Value</I>");
        else
        {
          out.println(paramValue+"</Td></Tr>");
//          Out("paramName = "+paramName+"  paramValue = "+paramValue);
//          if (paramName.startsWith("Name")) Name=paramValue;
//          else if (paramName.startsWith("Value")) Write_File_Safe_Fast("C:/Dir_Data/"+Name,new StringBuffer(paramValue),false);
        }
      }
      else
      {
        out.println("<Ul>");
        for (int i=0;i<paramValues.length;i++) out.println("<Li>"+paramValues[i]);
        out.println("</Ul></Td</Tr>");
      }
    }
    out.println("</Table>\n</Body></Html>");
  }

  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { processRequest(request,response); }

  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { processRequest(request,response); }

  // Returns a short description of the servlet.
  public String getServletInfo() { return "Short description"; }

  // Destroys the servlet.
  public void destroy() { System.gc(); }

  public static void Write_File_Safe_Fast(String File_Path,StringBuffer Str_Buf,boolean Append)
  {
    FileOutputStream fos=null;
    BufferedOutputStream bos=null;

    try
    {
      fos=new FileOutputStream(File_Path,Append);
      bos=new BufferedOutputStream(fos);
      for (int j=0;j<Str_Buf.length();j++) bos.write(Str_Buf.charAt(j));
    }
    catch (Exception e) { e.printStackTrace(); }
    finally
    {
      try 
      {
        if (bos!=null)
        {
          bos.close();
          bos=null;
        }
        if (fos!=null)
        {
          fos.close();
          fos=null;
        }
      }
      catch (Exception ex) { ex.printStackTrace(); }
    }
    System.gc();
  }
}

Я использую Netbean6.7 для разработки сервлета, и код был взят из примера JSP-кода Paypal, что я могу сделать для отладки проблемы?

Это было полезно?

Решение

ПРИВЕТ, попробуй воспользоваться моей библиотекой:http://paypal-nvp.sourceforge.net/index.htm Я надеюсь, что это поможет вам.Если у вас есть какие-либо вопросы, улучшения, вы можете связаться со мной.Вы найдете мой адрес электронной почты в комментариях к источнику.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top