servlets - 为什么 Java servlet 不能每次都获取 Paypal IPN 消息?

标签 servlets paypal message paypal-ipn

我有一个 Java servlet 在装有 Windows Vista 的笔记本电脑上运行,我设置了一个静态 IP,进行了端口转发并注册了免费的 DDNS 服务,现在我的 servlet 正在运行,我将 url 提供给 Paypal 以将 IPN 发送给我消息,我继续它的沙盒站点进入测试工具页面,尝试通过单击“发送 IPN”按钮发送测试消息,大多数时候它会失败,错误是:“IPN 传递失败。无法连接到指定的 URL。请验证 URL 并重试。”

但也许 10 次中有 1 次,它可能会成功并且我的 servlet 会收到消息,我查看了收到的消息,它们的格式正确。所以我调用 Paypal 问为什么,他说我不应该在我的笔记本上运行 servlet,相反我应该在网络服务器上运行它,但我告诉他我的 ISP 在他们的服务器上不支持 Java,因为我支持以上所有步骤,在我的笔记本上运行 servlet 不应该是一样的吗?他说他的测试表明他无法访问我的 servlet,但我问为什么它可能在 10 次中有 1 次可以通过?如果在我的笔记本上运行它有问题,那么它应该会失败 100%,我在这一点上是否正确?但无论如何他说他只能做这些,我应该自己解决问题。 servlet 看起来像这样:

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开发servlet,代码来自Paypal的JSP示例代码,请问如何调试?

最佳答案

嗨,尝试使用我的库: http://paypal-nvp.sourceforge.net/index.htm 我希望它能帮助你。如果您有任何问题,改进您可以联系我。您可以在来源的评论中找到我的电子邮件。

关于servlets - 为什么 Java servlet 不能每次都获取 Paypal IPN 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554503/

相关文章:

android - 不幸的是,应用程序停止了代码名称与 Paypal 集成

paypal - 自适应支付 : Unilateral receiver not allowed in chained payment is restricted

web-services - 响应消息 : Composite message or optional fields

java - Jersey 自定义异常未在 Servlet 类中捕获?

security - 如何使用 GWT 2.1 的 RequestFactory 处理安全约束?

java - 如何添加过滤功能?

ruby-on-rails - Apple 推送通知 Rails 应用程序消息传递

java - Threadlocal 用于初始化 java web 项目中的变量

java - 我应该在 grails 2.0 中使用哪个 paypal/payment 插件?

android - 如何在 Android 中捕获超过 80 字节的短信?