Paypal-IPN模拟器在成功完成功能后以HTTP 404错误结束



我花了很多时间尝试用Paypal Simulator, Sandbox来解决这个问题,但结果是一样的。我的处理程序函数(handleIpn)被调用和处理,状态为"已验证"完成",但IPN历史记录以及模拟器以HTTP 404错误结束。在IPN模拟器页面上的错误是-"我们很抱歉,但是有一个HTTP错误。请再试一次。"我的设置是Java-Spring MVC。

@RequestMapping(value = "/ipnHandler.html")
public void handleIpn (HttpServletRequest request) throws IpnException {
    logger.info("inside ipn");
    IpnInfo ipnInfo = new IpnInfo();
    Enumeration reqParamNames = request.getParameterNames();
    StringBuilder cmd1 = new StringBuilder();
    String pName;
    String pValue;
    cmd1.append("cmd=_notify-validate");
    while (reqParamNames.hasMoreElements()) {
          pName = (String) reqParamNames.nextElement();
          pValue = request.getParameter(pName);
          try{  
              cmd1.append("&").append(pName).append("=").append(pValue);
          }
          catch(Exception e){
              e.printStackTrace();
          }
    }

    try
    {
        URL u = new URL("https://www.sandbox.paypal.com/cgi-bin/webscr");
        HttpsURLConnection con = (HttpsURLConnection) u.openConnection();


        con.setRequestMethod("POST");
        con.setRequestProperty("Host", "www.sandbox.paypal.com/cgi-bin/webscr");
        con.setRequestProperty("Content-length", String.valueOf(cmd1.length())); 
        con.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
        con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)"); 
        con.setDoOutput(true); 
        con.setDoInput(true); 
        DataOutputStream output = new DataOutputStream(con.getOutputStream());  

        output.writeBytes(cmd1.toString());
        output.flush();
        output.close();
        //4. Read response from Paypal
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String res = in.readLine();
        in.close();
        //5. Capture Paypal IPN information
        ipnInfo.setLogTime(System.currentTimeMillis());
        ipnInfo.setItemName(request.getParameter("item_name"));
        ipnInfo.setItemNumber(request.getParameter("item_number"));
        ipnInfo.setPaymentStatus(request.getParameter("payment_status"));
        ipnInfo.setPaymentAmount(request.getParameter("mc_gross"));
        ipnInfo.setPaymentCurrency(request.getParameter("mc_currency"));
        ipnInfo.setTxnId(request.getParameter("txn_id"));
        ipnInfo.setReceiverEmail(request.getParameter("receiver_email"));
        ipnInfo.setPayerEmail(request.getParameter("payer_email"));
        ipnInfo.setResponse(res);
       // ipnInfo.setRequestParams(reqParamNames);
        //6. Validate captured Paypal IPN Information
        if (res.equals("VERIFIED")) {
            //6.1. Check that paymentStatus=Completed
            if(ipnInfo.getPaymentStatus() == null || !ipnInfo.getPaymentStatus().equalsIgnoreCase("COMPLETED"))
                ipnInfo.setError("payment_status IS NOT COMPLETED {" + ipnInfo.getPaymentStatus() + "}");
            //6.2. Check that txnId has not been previously processed
            IpnInfo oldIpnInfo = this.getIpnInfoService().getIpnInfo(ipnInfo.getTxnId());
            if(oldIpnInfo != null)
                ipnInfo.setError("txn_id is already processed {old ipn_info " + oldIpnInfo);
            //6.3. Check that receiverEmail matches with configured {@link IpnConfig#receiverEmail}
            if(!ipnInfo.getReceiverEmail().equalsIgnoreCase(this.getIpnConfig().getReceiverEmail()))
                ipnInfo.setError("receiver_email " + ipnInfo.getReceiverEmail()
                        + " does not match with configured ipn email " + this.getIpnConfig().getReceiverEmail());
            //6.4. Check that paymentAmount matches with configured {@link IpnConfig#paymentAmount}
            if(Double.parseDouble(ipnInfo.getPaymentAmount()) != Double.parseDouble(this.getIpnConfig().getPaymentAmount()))
                ipnInfo.setError("payment amount mc_gross " + ipnInfo.getPaymentAmount()
                        + " does not match with configured ipn amount " + this.getIpnConfig().getPaymentAmount());
            //6.5. Check that paymentCurrency matches with configured {@link IpnConfig#paymentCurrency}
            if(!ipnInfo.getPaymentCurrency().equalsIgnoreCase(this.getIpnConfig().getPaymentCurrency()))
                ipnInfo.setError("payment currency mc_currency " + ipnInfo.getPaymentCurrency()
                        + " does not match with configured ipn currency " + this.getIpnConfig().getPaymentCurrency());
        }
        else
            ipnInfo.setError("Inavlid response {" + res + "} expecting {VERIFIED}");
        logger.info("ipnInfo = " + ipnInfo);
        this.getIpnInfoService().log(ipnInfo);
        //7. In case of any failed validation checks, throw {@link IpnException}
        if(ipnInfo.getError() != null)
            throw new IpnException(ipnInfo.getError());
    }
    catch(Exception e)
    {
        if(e instanceof IpnException)
            throw (IpnException) e;
        logger.log(Level.FATAL, e.toString(), e);
        throw new IpnException(e.toString());
    }
    //8. If all is well, return {@link IpnInfo} to the caller for further business logic execution
    paymentController.processSuccessfulPayment(ipnInfo);

}

任何帮助/指点将不胜感激。

谢谢。

终于成功了!没有意识到我在Spring MVC中的重定向问题可能会影响Paypal - IPN状态。可能是我对HTTP重定向缺乏很好的理解!在上面的方法中,我现在返回一个jsp页面,而不是void返回,所以"void"被改为"String"并返回jsp文件名。

希望它能帮助到别人!

最新更新