代码之家  ›  专栏  ›  技术社区  ›  Frank

为什么Java servlet每次都不能收到PayPal互穿网络信息?

  •  1
  • Frank  · 技术社区  · 14 年前

    我有一个Java servlet在我的笔记本上运行,带有Windows Vista,我设置了一个静态IP,做了端口转发,注册了一个免费的DNS服务,现在我的servlet正在运行,我给了Paypal的URL给我发送IPN消息,我去了它的沙盒站点,拿到了测试工具页面,试着发送TEST消息通过点击“发送IPN”按钮,大多数时候都会失败,错误是:“IPN传递失败。无法连接到指定的URL。请验证URL,然后重试。“

    但可能是10次中的1次,它可能会成功,我的servlet会得到消息,我查看了我得到的消息,它们的格式是正确的。所以我打电话给贝宝问为什么,他说我不应该在我的笔记本上运行servlet,而我应该在Web服务器上运行它,但是我告诉他我的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();
      }
    }
    

    我使用NETBEAN67开发Servlet,代码来自PayPal的JSP示例代码,我能做什么调试问题?

    1 回复  |  直到 14 年前
        1
  •  0
  •   pete    14 年前

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