簡體   English   中英

貝寶中某些IPN消息的響應無效

[英]INVALID response for for some IPN messages in Paypal

我有一個用於Paypal的IPN消息的Java接收器,它在沙盒中運行良好。 但是在將其設置為真實的Paypal環境后,我注意到它對大多數消息都獲得了響應“ INVALID”(盡管有些付款得到了VERIFIED響應)。

認為這可能是編碼問題 我讀到編碼是在正確的消息中出現的(我已經看到它包含一個帶有該信息的參數“ charset”),而在其他地方,編碼應設置為“ windows-1252”。 因此,我正在從正確的消息中讀取字符集,並使用該字符集對參數進行編碼。 在所有消息中,接收到的編碼為“ windows-1252”,但是只有少數消息的響應為“ VERIFIED”(其余為INVALID)。 如果我從該帳戶的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"

貝寶(PayPal)還要求將參數以與到達您時相同的順序發送回去。 當我實現其中之一時,我最終從請求讀取器將參數讀取到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);
    }
}

然后像完成操作一樣從地圖中讀取參數。 另一個要注意的是,盡管我似乎肯定應該這么做,但在發回郵件時我並未重新編碼參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM