2012-02-10 2 views
2

나는 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" 

답변

0

PayPal에서도 매개 변수를받은 순서대로 되돌려 보내야합니다. 나는이 중 하나를 구현할 때, 나는

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); 
    } 
} 

람 요청 리더에서의 LinkedHashMap에 매개 변수를 읽고 다음과 유사 당신이 한 일을 다시지도 밖으로 매개 변수를 읽는 끝났다. 한 가지 다른 참고 사항은 필자가 꼭해야 할 것처럼 보였지만 내가 뒤를 보냈을 때 매개 변수를 다시 인코딩하지 않았다는 것입니다.