Paypal沙盒IPN返回无效

Paypal沙盒IPN返回无效,paypal,sandbox,paypal-sandbox,Paypal,Sandbox,Paypal Sandbox,我正在尝试IPN回调,使用servlet。我使用的代码是由paypal提供的,用于验证ipn数据。但是每次我得到一个无效的回复 代码如下: Enumeration en = req.getParameterNames(); String str = "cmd=_notify-validate"; while (en.hasMoreElements()) { String paramName = (String) en.nextElement();

我正在尝试IPN回调,使用servlet。我使用的代码是由paypal提供的,用于验证ipn数据。但是每次我得到一个无效的回复

代码如下:

Enumeration en = req.getParameterNames();
String str = "cmd=_notify-validate";

    while (en.hasMoreElements()) {        
        String paramName = (String) en.nextElement();
        String paramValue = req.getParameter(paramName);

//str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue,"UTF-8"); // for UTF-8 i set the encode format in my account as UTF-8
//str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue,"ISO-8859-1");// for ISO-8859-1 i set the encode format in my account as ISO-8859-1
str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue); //default as provided by paypal

    }
    URL u = new URL("http://www.sandbox.paypal.com/cgi-bin/webscr");
    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();

    if (res.equals("VERIFIED") || !res.equals("VERIFIED")) {
        //Update database...
    } else if (res.equals("INVALID")) {      
       //INVALID   
    }
我已经检查了paypal提供的所有三种可能性,以防paypal返回无效,如下所示:

1) 缺少参数-由于我正在发送所有参数,因此没有缺少参数的问题

2) 无效的URL。-我使用的是沙盒,所以URL为:

3) 字符编码尝试使用与paypal帐户设置参数编码相同的字符编码

我使用以下参数发送回paypal的请求:

cmd=\u notify-validate&last\u name=User&test\u ipn=1&address\u name=test+User&txn\u type=web\u accept&receiver\u email=sell1\u 1252495907\u biz%40gmail.com&residence\u country=US&address\u city=San+Jose&payment\u gross=&payment\u date=01%3A55%3A04+Sep+26%2C+2009+PDT&address\u-zip=95131&payment\u status=Completed\r\r\r\n\r\r\n\r\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\252495751每%40gmail.com和保护资格=合格和付款人id=BXBKS22JQCUWL和验证签名=AOMkeg7ofCL7FJfioyWA19uCxD4XAgZirsjiGh8cUy1fd2YAqBwOkkst和支付类型=即时和商业=销售1252495907商业%40gmail.com和地址国家代码=美国和mc费用=0.64和地址状态=确认和交易主题=真实+数量=1和通知版本=2.8欧元&custom=&address\u state=CA&payment\u fee=&handling\u amount=0.00&payer\u status=verified&shipping=0.00&item\u name=True+Up&tax=0.00&username=hannonj&charset=windows-1252&item\u number=567&mc\u gross=10.00&txn\u id=7F456350BS7942738&receiver\u id=MASSU6BSR9SC2&address\u country=美国+美国


请问,有人能告诉我正确的方向吗?我没有得到什么是错误的代码或网址或其他任何东西。我尝试了所有的可能性。请帮帮我。

记住贝宝的沙箱有完全不同的凭证。您必须拥有开发帐户并登录到开发面板才能使用sandbox。

我很确定要发送到的URL只是“www.sandbox.paypal.com”,请参阅《sandbox用户指南》第4章,这是我为自己的代码所写的内容(顺便说一句,对于live,对于他们来说,它也只是“www.paypal.com”)谢谢你们的回复。 哦,我终于解决了


实际上,在NotifyURL中,我还添加了一个用户名参数。Paypal希望IPN的参数值与返回到servlet的参数值相同。(您可以通过req.getParameterNames()获得它)。因为我有用户名参数额外,这是不知道贝宝。Paypal返回无效。

如果您正在通过SSL测试Paypal IPN,则必须使用ssl://www.sandbox.paypal.com在端口443

上出现的“无效”消息是由于以下原因造成的:

  • 检查您的是否将响应发布到正确的URL,这取决于您是在沙箱中测试还是在现场测试
  • 验证您对测试IPN消息的响应是否包含与测试消息完全相同的变量和值,以及它们的顺序是否与测试消息中的顺序相同。最后,验证原始变量前面是否有cmd=\u notify-validate变量
  • 确保您正在对响应字符串进行编码,并且使用与测试IPN消息相同的字符编码。(例如,我可以看到他正在使用带有umlaut的字母和其他符号,如“/”等)。 关于最后一点,商户可以尝试按照以下步骤更改其PayPal帐户中使用的编码语言:

  • 登录你的贝宝帐户
  • 点击配置文件
  • 单击“我的销售偏好”选项卡
  • 点击“PayPal按钮语言编码”(在页面末尾)
  • 点击“其他选项”
  • 从下拉菜单中选择:UTF-8
  • 为第二个选项(与IPN相关)选择相同的字符集
  • 单击“保存”
如果问题仍然存在,我们建议查看正在使用的脚本,PayPal在以下位置提供了一些IPN代码示例:


关于其他信息,我添加了以下链接:

对于paypal.com,我无效;对于sandbox.paypal.com,我甚至没有得到回复。哈利路亚!非常感谢@PayPal\u Federica将编码更改为utf8修复了我的问题,,,谢谢这真的很有用,我使用示例文件解决了相同的问题。。。谢谢