我正在尝试使用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或其他任何错误。我尝试了所有的可能性。请帮帮我。
答案 0 :(得分:16)
“ INVALID ”消息的原因如下:
确保您编码您的响应字符串,并使用与测试IPN消息使用的相同字符编码。 (例如,我可以看到他正在使用带有变音符号的字母和其他符号,如“/”等)。 关于最后一点,商家可以尝试更改其PayPal帐户中使用的编码语言,请按照以下步骤操作:
如果问题仍然存在,我们建议您查看正在使用的脚本,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的沙盒具有完全不同的凭据。您必须拥有开发帐户并登录到开发面板才能使用沙箱。