代码之家  ›  专栏  ›  技术社区  ›  jaxb

Paypal沙箱IPN返回无效

  •  5
  • jaxb  · 技术社区  · 15 年前

    我正在使用servlet尝试IPN回调。我使用的代码由Paypal提供,用于验证IPN数据。但每次我得到 无效 回答。

    代码如下:

    Enumeration en = req.getParameterNames();
    String str = "cmd=_notify-validate";
    
        while (en.hasMoreElements()) {        
            String paramName = (String) en.nextElement();
            String paramValue = req.getParameter(paramName);
    
    //str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue,"UTF-8"); // for UTF-8 i set the encode format in my account as UTF-8
    //str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue,"ISO-8859-1");// for ISO-8859-1 i set the encode format in my account as ISO-8859-1
    str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue); //default as provided by paypal
    
        }
        URL u = new URL("http://www.sandbox.paypal.com/cgi-bin/webscr");
        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();
        in.close();
    
        if (res.equals("VERIFIED") || !res.equals("VERIFIED")) {
            //Update database...
        } else if (res.equals("INVALID")) {      
           //INVALID   
        }
    

    我已经检查了贝宝提供的所有三种可能的情况下,贝宝返回无效如下:

    1)缺少参数-因为我发送了所有参数,所以没有缺少参数的问题。

    2)无效的URL。-我正在使用沙盒,因此URL是: http://www.sandbox.paypal.com/cgi-bin/webscr

    3)字符编码。-尝试与PayPal帐户设置参数编码相同的字符编码。

    我用以下参数发送回贝宝的请求:

    Cmd=_notify-valid&last_name=user&test_ipn=1&address_name=test+user&txn_type=web_accept&receiver_email=sell1 12524495907_biz%40gmail.com&居住_count国=美国&地址_city=圣何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何何地址\街道=1+main+st&first_name=test&payer_email=buyer1_12524495751 per%40gmail.com&protectiou qualif资格=合格&payer_id=bxbks22jqcuwl&verify sign=aomkeg7ofcl7ffffiioywa9ucxd4xagzirsjigh8buy1f2qbwokkst&pa付款_type=即时&business=sell1__biz%40gmail.com&com&地址_count国别_code=US&mc=US&mc&mc;mcc;country&mc=U id=US&_费用=0.64&地址\状态确认和交易-交易-主题=真+up&数量=1&通知-版本=2.8&mc_货币=欧元&自定义=地址-状态=CA&付款-费用=处理-金额=0.00&付款人-付款方状态=验证和装运=0.00&发货=0.00&项目-名称=真+up&税=0.00&税=0.00&用户名=汉农J&字符集=Windows-1252&项目-项目-编号=567&mc_毛=10.00&毛=10.00&mc&mc_毛=10.00&mc;项目-金额=567&项目-编号=56热膨胀系数d=7f456350bs7942738&receiver_id=massu6bsr9sc2&address_country=United+美国

    请问,有人能告诉我正确的方向吗?我没有得到错误的代码、URL或其他任何信息。我尝试了所有的可能性。请帮帮我。

    5 回复  |  直到 8 年前
        1
  •  16
  •   PayPal_Federica    10 年前

    一个 无效 _157;消息的原因如下:

    • 检查您的 将您的响应发布到正确的URL ,这就是 https://www.sandbox.paypal.com/cgi-bin/webscr https://www.paypal.com/cgi-bin/webscr ,具体取决于您是在沙盒中测试,还是在现场测试。
    • 验证您对测试IPN消息的响应 包含完全相同的变量和值 作为测试消息 它们的顺序与测试消息中的顺序相同 . 最后,验证原始变量前面是否有一个cmd=_notify-validate变量。
    • 确保你是 编码 您的响应字符串和使用的字符编码与测试IPN消息使用的字符编码相同。(例如,我可以看到他使用的是带有元音字母和其他符号,如_/__等)。 关于最后一点,商家可以尝试改变他的Paypal帐户中使用的编码语言,按照以下步骤:

      1. 登录您的PayPal帐户
      2. 单击配置文件
      3. 单击__我的销售偏好__选项卡
      4. 点击AytYPayPaypal按钮语言编码AY~(在页面末尾)
      5. 点击“其他选项”
      6. 从下拉菜单中选择:utf-8
      7. 为与IPN相关的第二个选项选择相同的字符集
      8. 单击__保存__

    如果问题仍然存在,我们建议在使用中查看脚本,PayPal有一些IPN代码示例可用: https://github.com/paypal/ipn-code-samples

    有关更多信息,我包括以下链接: https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNTesting/#id091GFE00WY4

        2
  •  9
  •   Extrakun    15 年前

    我很确定发送到的URL仅仅是“www. sbox .paypal .com”,见沙箱用户指南的第4章,这是我为自己的代码所设置的(顺便说一下,对于Live,它也只是“www. PayPal.com”)。 sample code )

        3
  •  3
  •   jaxb    15 年前

    谢谢你们的回复。 哦,我终于解决了。

    实际上,在通知URL中,我还添加了一个用户名参数。PayPal希望IPN的参数值与返回servlet相同。(您可以将其作为Req.GETAsPurrimeNAMS())。因为我有用户名参数额外,这是不知道的贝宝。贝宝返回无效。

        4
  •  2
  •   Nicolas BADIA    12 年前

    如果在SSL上测试PayPal IPN,则必须使用 网址:ssl://www.sandbox.paypal.com 在港口上 443个

        5
  •  1
  •   Kane    15 年前

    记住Paypal的沙盒有完全不同的凭据。您必须拥有开发帐户并登录到开发面板才能使用沙盒。