Paypal 中某些 IPN 消息的无效响应

Posted

技术标签:

【中文标题】Paypal 中某些 IPN 消息的无效响应【英文标题】:INVALID response for for some IPN messages in Paypal 【发布时间】:2012-03-03 08:21:43 【问题描述】:

我有一个用于 Paypal 的 IPN 消息的 Java 接收器,它在沙盒中运行良好。但是在将其设置为真实的 Paypal 环境后,我注意到它对于大多数消息都会收到“无效”响应(尽管有些付款会收到 VERIFIED 响应)。

认为可能是编码问题。我读到编码来自正确的消息(我已经看到它有一个名为“charset”的参数包含该信息)以及其他地方的编码应该设置为“windows-1252”。因此,我正在从正确的消息中读取字符集并使用该字符集对参数进行编码。在所有收到的消息中,收到的编码都是“windows-1252”,但只有少数有响应“VERIFIED”(其余的都是无效的)。如果我从帐户中的 IPN 历史记录中重新发送“无效”消息,它们会再次被称为无效。

有人知道可能发生的事情吗?

谢谢。

String paypalURL = "https://www.paypal.com/cgi-bin/webscr";

// read post from PayPal system and add 'cmd'
Enumeration en = request.getParameterNames();
String str = "cmd=_notify-validate";
String charset = request.getParameter("charset"); //this gets windows-1252

while(en.hasMoreElements())
    String paramName = (String)en.nextElement();
    String paramValue = request.getParameter(paramName);
    str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue, charset); 

// post back to PayPal system to validate
// NOTE: change http: to https: in the following URL to verify using SSL (for increased security).
// using HTTPS requires either Java 1.4 or greater, or Java Secure Socket Extension (JSSE)
// and configured for older versions.
URL u;
u = new URL(paypalURL);
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(); //It's always INVALID - It should be "VERIFIED"
in.close();

// assign posted variables to local variables
//String itemName = request.getParameter("item_name");
//String itemNumber = request.getParameter("item_number");
//String quantity = request.getParameter("quantity");
String paymentStatus = request.getParameter("payment_status");
String paymentAmount = request.getParameter("mc_gross");
String paymentCurrency = request.getParameter("mc_currency");
String txnId = request.getParameter("txn_id");
String receiverEmail = request.getParameter("receiver_email");
//String payerEmail = request.getParameter("payer_email");
String username = request.getParameter("custom");
//check notification validation

if(res.equals("VERIFIED"))   //It's always INVALID - It should be "VERIFIED"

【问题讨论】:

【参考方案1】:

PayPal 还要求将参数按照发送给您的顺序发送回去。当我实现其中一个时,我最终从请求阅读器 ala 将参数读入 LinkedHashMap

String line = null;
BuferedReader incomingParams = request.getReader();
StringBuilder params = new StringBuilder();
while ((line = incomingParams.readLine()) != null) 
    params = params.append(line);


String[] nvPairs = params.toString().split("&");
String[] nvPair = null;
String value = null;
for (int i = 0; i < nvPairs.length; ++i) 
    nvPair = nvPairs[i].split("=");
    if (nvPair != null && nvPair.length >= 1) 
        if (nvPair.length >= 2)  
            value = nvPair[1];
        
        else 
            value = "";
        
        paramMap.put(nvPair[0], value);
    

然后像您所做的那样从地图中读取参数。另一个注意事项是,我在发送回邮件时没有重新编码参数,尽管您确实应该这样做。

【讨论】:

以上是关于Paypal 中某些 IPN 消息的无效响应的主要内容,如果未能解决你的问题,请参考以下文章

PayPal IPN 消息问题

贝宝“无效响应”

IPN PAYPAL - 无效测试

PayPal 标准 IPN 退款结算消息缺少必填的“业务”字段

PayPal沙箱IPN处理器拒绝所有消息?

从 PayPal 的沙盒 IPN 获得无效响应