1

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

但也许 10 次中有 1 次,它可能会成功,我的 servlet 会收到消息,我查看了收到的消息,它们的格式正确。所以我打电话给Paypal问为什么,他说我不应该在我的笔记本上运行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();
  }
}

我使用Netbean6.7 开发servlet,代码来自Paypal 的JSP 示例代码,如何调试问题?

4

1 回答 1

0

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

于 2010-05-24T22:29:51.937 回答