Paypal沙盒IPN返回INVALID

jax*_*axb 6 paypal sandbox paypal-sandbox

我正在尝试使用servlet进行IPN回调.我正在使用的代码由paypal提供,用于验证ipn数据.但每次我收到INVALID回复.

这是代码:

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   
    }
Run Code Online (Sandbox Code Playgroud)

我检查了paypal提供的所有三种可能性,如果paypal返回INVALID如下:

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

2)无效的网址.- 我正在使用沙箱,所以URL是: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¬ify_version = 2.8&mc_currency =欧元和定制= ADDRESS_STATE = CA&payment_fee = &handling_amount = 0.00&payer_status =验证及运送= 0.00&ITEM_NAME =真+向上&税= 0.00和用户名= hannonj&字符集=窗口1252&ITEM_NUMBER = 567&mc_gross = 10.00 txn_id = 7F456350BS7942738&receiver_id = MASSU6BSR9SC2&ADDRESS_COUNTRY =美+美国

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

小智 18

" INVALID "消息是由于以下原因:

  • 检查您是否将回复发布到正确的URL,即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. 点击"保存"

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

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

  • @PayPal_Federica将编码更改为utf8解决了我的问题,谢谢 (2认同)

Ext*_*kun 9

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


jax*_*axb 3

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

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