私はPayPalのIPNメッセージのJavaレシーバを持っており、Sandboxでは完全に機能していました。しかし、実際のPaypal環境に設定した後、ほとんどのメッセージに対して「INVALID」という回答が得られることに気付きました(一部の支払いではVERIFIED応答が得られます)。Paypalの一部のIPNメッセージのINVALID応答
私はをエンコードするのが問題かもしれないと考えていました。私は、エンコーディングが適切なメッセージに入っていることを読んでいます(その情報で "charset"と呼ばれるパラメータを持っていることがわかりました)。そしてどこか他の場所では、エンコーディングを "windows-1252"に設定する必要があります。だから、私は適切なメッセージから文字セットを読み込み、その文字セットでパラメータをエンコーディングしています。すべてのメッセージで受信したエンコーディングは "windows-1252"ですが、ごく一部のメッセージだけが "VERIFIED"(残りは無効)です。アカウントのIPN履歴から「INVALID」メッセージを再送すると、INVALIDと再度言います。
Doeの誰もが何が起こっているかも知りませんか?
ありがとうございました。
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"