8

我正在尝试使用 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   
    }

我已经检查了贝宝提供的所有三种可能性,以防贝宝返回无效,如下所示:

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

2) 无效的网址。- 我正在使用沙盒,所以 URL 是: http: //www.sandbox.paypal.com/cgi-bin/webscr

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

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

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 =欧元和定制= ADDRESS_STATE = CA&payment_fee = &processing_amount=0.00&payer_status=verified&shipping=0.00&item_name=True+Up&tax=0.00&username=hannonj&charset=windows-1252&item_number=567&mc_gross=10.00&txn_id=7F456350BS7942738&receiver_id=MASSU6BSR9SC2&address_country

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

4

5 回答 5

21

“<strong>INVALID”消息的原因如下:

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

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

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

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

于 2014-05-29T07:47:51.727 回答
9

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

于 2009-09-28T08:38:34.970 回答
3

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

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

于 2009-09-28T12:37:23.297 回答
2

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

于 2009-09-28T07:48:23.497 回答
2

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

于 2012-05-22T09:40:15.007 回答