我正在尝试使用 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-validate&last_name=用户&test_ipn=1&address_name=测试+用户&txn_type=web_accept&receiver_email=sellr1_1252495907_biz%40gmail.com&residence_country=US&address_city=San+Jose& payment_gross=& payment_date=01%3A55%3A04+Sep+26%2 C+2009+PDT&address_zip=95131& payment_status=已完成&address_street= 1+Main+St&first_name=测试&payer_email=buyer1_1252495751_per%40gmail.com&protection_eligibility=合格&payer_id=BXBKS22JQCUWL&verify_sign=AOMkeg7ofCL7FJfioyWA19uCxD4XAgZirsjiGh8cUy1fd2YAqBwOkkst & payment_type=instant&business=sellr1_1252495907_biz%40gmail.com&address_country_code=US&mc_fee=0.64&address_status=confirmed&transaction_subject=True+Up&quantity=1&notify_version=2.8&mc_currency=EUR&custom=&address_state=CA& payment_fee= &handling_amount=0.00&payer_status=verified&shipping=0.00&item_name=True+Up&tax=0.00&用户名=hannonj&charset=windows-1252&item_number=567&mc_gross=10.00&txn_id=7F456350BS7942738&receiver_id=MASSU6BSR 9SC2&address_country=美国+州

请问,有人可以指导我正确的方向吗?我不明白代码、URL 或其他任何内容有什么问题。我尝试了所有的可能性。请帮我。

有帮助吗?

解决方案 3

感谢你们的回复。 哦~~我解决了它在最后。

实际上,在通知URL我还添加了用户名参数。贝宝想要IPN的参数值相同,因为它返回给servlet。(你可以把它作为req.getParameterNames())。正如我的用户名额外的参数,这是不知道贝宝。贝宝返航INVALID。

其他提示

一个"无效"消息是由于以下原因:

  • 检查你们 张贴你应该正确的URL, ,这是 https://www.sandbox.paypal.com/cgi-bin/webscrhttps://www.paypal.com/cgi-bin/webscr, ,这取决于你是否正在测试的沙盒或者你的生活,分别。
  • 验证你的答复来试验互穿网络的消息 包含了完全相同的变量和价值 作为测试的消息 和他们是在相同的顺序,因为在测试的消息.最后,验证原始变量是之前有一个cmd=_notify验证可变的。
  • 确保你们 编码 你的反应串和使用相同的字符编码使用的测试互穿网络的消息。(例如,我可以看到,他是用信用变音符和其它的符号,如"/"等)。关于最后一点,商家可以尝试改变编码使用的语言在他贝宝账户,以下步骤:

    1. 登上你的贝宝账号
    2. 点击档
    3. 点击"我卖的偏好"标签
    4. 点击"贝宝按钮语言编码"(在结束页)
    5. 点击"其他选项"
    6. 选择在下拉式菜单:UTF-8
    7. 选择同样的charset也用于第二种选择,这是有关互穿网络
    8. 点击"保存"

如果问题仍然存在,我们建议审查的脚本中使用的PayPal有一些互穿网络的代码样本可在: https://github.com/paypal/ipn-code-samples

额外的信息,包括我的链接: https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNTesting/#id091GFE00WY4

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

如果您通过SSL测试贝宝IPN,你将不得不使用 SSL://www.sandbox.paypal.com 端口上的 443

记住PayPal的沙箱具有完全不同的凭证。你必须有发展账户和登录到开发板使用沙箱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top