Paypal沙盒IPN返回INVALID

时间:2009-09-28 07:27:04

标签: paypal sandbox paypal-sandbox

我正在尝试使用servlet进行IPN回调。我正在使用的代码由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返回INVALID如下:

1)缺少参数 - 因为我发送所有参数没有缺少参数的问题

2)无效的网址。 - 我正在使用沙箱,因此网址为:http://www.sandbox.paypal.com/cgi-bin/webscr

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

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

  

CMD = _notify-验证&安培;姓氏=用户和安培;的test_ipn = 1&安培; ADDRESS_NAME =测试+使用者&安培; txn_type = web_accept&安培; RECEIVER_EMAIL = sellr1_1252495907_biz%40gmail.com&安培; residence_country = US&安培; ADDRESS_CITY =圣+圣何塞&安培; payment_gross =安培; PAYMENT_DATE = 01%3A55%3A04 +月+ 26%2C + 2009 + PDT&安培; address_zip = 95131&安培; PAYMENT_STATUS =完成&安培; address_street = 1 +主+ ST&安培;如first_name =测试&安培; PAYER_EMAIL = buyer1_1252495751_per%40gmail.com&安培; protection_eligibility =合格&安培; payer_id = BXBKS22JQCUWL和放大器; verify_sign = AOMkeg7ofCL7FJfioyWA19uCxD4XAgZirsjiGh8cUy1fd2YAqBwOkkst和放大器; payment_type =即时和放大器;商业= sellr1_1252495907_biz%40gmail.com和放大器; address_country_code = US&放大器; mc_fee = 0.64安培; address_status =确认和放大器; transaction_subject =真+向上和数量= 1&安培; notify_version = 2.8安培; mc_currency = EUR&放;自定义=安培; ADDRESS_STATE = CA&放大器; payment_fee =安培; handling_amount = 0.00和放大器; payer_status =验证和放大器;运费= 0.00和放大器; ITEM_NAME = TRUE +向上和税额= 0.00和放大器;用户名= hannonj和放大器;字符集=窗口-125 2及= ITEM_NUMBER 567&安培; mc_gross = 10.00&安培; txn_id = 7F456350BS7942738&安培; receiver_id = MASSU6BSR9SC2&安培; = ADDRESS_COUNTRY美国+美国

请,任何人都可以指导我正确指导吗?我没有得到代码或URL或其他任何错误。我尝试了所有的可能性。请帮帮我。

5 个答案:

答案 0 :(得分:16)

INVALID ”消息的原因如下:

  • 检查您发布对正确网址的回复https://www.sandbox.paypal.com/cgi-bin/webscrhttps://www.paypal.com/cgi-bin/webscr,具体取决于您是在Sandbox中进行测试还是现场直播,分别。
  • 确认您对测试IPN消息的响应包含与测试消息完全相同的变量和值,并且它们与测试消息中的顺序相同 。最后,验证原始变量前面是cmd = _notify-validate变量。
  • 确保您编码您的响应字符串,并使用与测试IPN消息使用的相同字符编码。 (例如,我可以看到他正在使用带有变音符号的字母和其他符号,如“/”等)。 关于最后一点,商家可以尝试更改其PayPal帐户中使用的编码语言,请按照以下步骤操作:

    1. 登录您的PayPal帐户
    2. 点击个人资料
    3. 点击“我的销售偏好设置”标签
    4. 点击“PayPal按钮语言编码”(在页面末尾)
    5. 点击"其他选项"
    6. 从下拉菜单中选择:UTF-8
    7. 也为第二个选项选择相同的字符集,该选项与IPN
    8. 相关
    9. 点击“保存”

如果问题仍然存在,我们建议您查看正在使用的脚本,PayPal上提供了一些IPN代码示例:https://github.com/paypal/ipn-code-samples

有关其他信息,请添加以下链接:https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNTesting/#id091GFE00WY4

答案 1 :(得分:9)

我很确定发送到的URL只是“www.sandbox.paypal.com”,请参阅Sandbox用户指南的第4章,好吧,这就是我为自己的代码添加的内容(顺便提一下,对于直播) ,对于他们的sample code

,它也只是“www.paypal.com”

答案 2 :(得分:3)

谢谢你们的回复。 哦,我终于解决了。

实际上在通知URL中我还添加了一个用户名参数。 Paypal希望IPN的参数值与返回servlet的参数值相同。(您可以将其作为req.getParameterNames()获取)。因为我有额外的用户名参数,这是paypal不知道的。 Paypal正在返回INVALID。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

请记住,paypal的沙盒具有完全不同的凭据。您必须拥有开发帐户并登录到开发面板才能使用沙箱。