Paypal 沙盒 IPN 返回无效
Posted
技术标签:
【中文标题】Paypal 沙盒 IPN 返回无效【英文标题】:Paypal sandbox IPN return INVALID 【发布时间】:2010-12-01 22:22:31 【问题描述】:我正在使用 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
我已经检查了贝宝提供的所有三种可能性,以防贝宝返回无效,如下所示:
1) 缺少参数 - 因为我发送所有参数,所以没有缺少参数的问题
2) 网址无效。 - 我正在使用沙盒,所以 URL 是:http://www.sandbox.paypal.com/cgi-bin/webscr
3) 字符编码。 - 尝试使用与 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 =欧元和定制= ADDRESS_STATE =CA&payment_fee=&handling_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 =
拜托,任何人都可以指导我正确的方向吗?我没有得到代码或 URL 或其他任何内容的错误。我尝试了所有的可能性。请帮帮我。
【问题讨论】:
【参考方案1】:“INVALID”消息的原因如下:
检查您是否将您的回复发布到正确的网址,即https://www.sandbox.paypal.com/cgi-bin/webscr 或https://www.paypal.com/cgi-bin/webscr,具体取决于您是在沙盒中进行测试还是在现场进行测试。 验证您对测试 IPN 消息的响应包含与测试消息完全相同的变量和值并且它们与测试消息中的顺序相同 .最后,验证原始变量前面是否有 cmd=_notify-validate 变量。确保您对响应字符串进行编码,并使用与测试 IPN 消息相同的字符编码。 (例如,我可以看到他正在使用带有变音符号的字母和“/”等其他符号)。 关于最后一点,商家可以尝试更改其PayPal账户中使用的编码语言,步骤如下:
-
登录您的 PayPal 帐户
点击个人资料
点击“我的销售偏好”标签
点击“PayPal Button Language Encoding”(页面末尾)
点击“其他选项”
从下拉菜单中选择:UTF-8
为第二个选项选择相同的字符集,与 IPN 相关
点击“保存”
如果问题仍然存在,我们建议检查正在使用的脚本,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 解决我的问题,,,谢谢 这真的很有用,我使用github.com/paypal/ipn-code-samples 示例文件解决了同样的问题...谢谢..!!【参考方案2】:我很确定要发送到的 URL 只是“www.sandbox.paypal.com”,请参阅 Sandbox 用户指南的第 4 章,这就是我为自己的代码输入的内容(顺便说一下,用于实时,也只是“www.paypal.com”,为他们的sample code)
【讨论】:
【参考方案3】:谢谢大家的回复。 哦,我终于解决了。
实际上在通知 URL 中我还添加了一个用户名参数。 Paypal 希望 IPN 的参数值与返回到 servlet 的参数值相同。(您可以通过 req.getParameterNames() 获取它)。因为我有额外的用户名参数,这是贝宝不知道的。 Paypal 返回 INVALID。
【讨论】:
【参考方案4】:如果您在 SSL 上测试 Paypal IPN,则必须在端口 443
上使用 ssl://www.sandbox.paypal.com >【讨论】:
使用 paypal.com 我无效,使用 sandbox.paypal.com 我什至没有得到回应。 哈利路亚!非常感谢!【参考方案5】:请记住,paypal 的沙盒具有完全不同的凭据。您必须拥有开发帐户并登录开发面板才能使用沙盒。
【讨论】:
以上是关于Paypal 沙盒 IPN 返回无效的主要内容,如果未能解决你的问题,请参考以下文章
Paypal IPN 在沙盒 ipn sinulator 中有效,但在交易中无效
Paypal IPN 获得空白确认(应为“已验证”或“无效”)
Paypal IPN 沙盒 - IPN 侦听器 - 未验证或无效