나는 Paypal의 IPN 메시지 용 Java 수신기를 가지고 있으며 Sandbox에서 완벽하게 작동했습니다. 하지만 실제 Paypal 환경으로 설정 한 후에는 대부분의 메시지에 대해 "INVALID"라는 응답을 얻습니다 (일부 지불은 검증 된 응답을 얻음).Paypal의 일부 IPN 메시지에 대한 INVALID 응답
이 (가) 인코딩 문제 일 수 있다고 생각됩니다. 나는 인코딩이 적절한 메시지 (그 정보를 가지고 "charset"라고 불리는 param을 가졌다)와 그 인코딩이 "windows-1252"로 설정되어야한다는 것을 알았다. 그래서 적절한 메시지에서 charset을 읽고 해당 charset으로 params를 인코딩합니다. 모든 메시지에서 수신 된 인코딩은 "windows-1252"이지만 일부만 응답 "확인 됨"(나머지는 유효하지 않음)이 있습니다. 계정의 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"