Paypal 沙箱 IPN 返回 INVALID
-
18-09-2019 - |
题
我正在尝试使用 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¬ify_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/webscr 或 https://www.paypal.com/cgi-bin/webscr, ,这取决于你是否正在测试的沙盒或者你的生活,分别。
- 验证你的答复来试验互穿网络的消息 包含了完全相同的变量和价值 作为测试的消息 和他们是在相同的顺序,因为在测试的消息.最后,验证原始变量是之前有一个cmd=_notify验证可变的。
确保你们 编码 你的反应串和使用相同的字符编码使用的测试互穿网络的消息。(例如,我可以看到,他是用信用变音符和其它的符号,如"/"等)。关于最后一点,商家可以尝试改变编码使用的语言在他贝宝账户,以下步骤:
- 登上你的贝宝账号
- 点击档
- 点击"我卖的偏好"标签
- 点击"贝宝按钮语言编码"(在结束页)
- 点击"其他选项"
- 选择在下拉式菜单:UTF-8
- 选择同样的charset也用于第二种选择,这是有关互穿网络
- 点击"保存"
如果问题仍然存在,我们建议审查的脚本中使用的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的沙箱具有完全不同的凭证。你必须有发展账户和登录到开发板使用沙箱。