当前位置: 首页 > 知识库问答 >
问题:

贝宝RESTAPI。net SDK-400个错误请求

萧麒
2023-03-14

我在沙箱中工作,使用PayPal REST。net SDK方法支付。创建一个信用卡对象。当所有参数有效且使用来自的测试CC编号时https://developer.paypal.com/webapps/developer/docs/integration/direct/accept-credit-cards/,付款对象从该方法返回,一切正常。

但是,当参数无效时,例如过去的过期日期或沙箱无法识别的CC号,则不会返回支付对象。相反,该方法引发异常:“HttpConnection执行中的异常:无效HTTP响应远程服务器返回错误:(400)错误请求”,但没有进一步解释。

当我在cURL中执行相同的请求时,除了“400不良请求”之外,我还会得到一个JSON响应。这包括更有帮助的消息,如“VALIDATION_ERROR”和“无效过期(不能在过去)”。

我的问题:有没有办法从SDK中获取这些消息?

我所尝试的:

  • PayPal文档:https://developer.paypal.com/webapps/developer/docs/api/#errors本文档提到,在出现错误的情况下,它们将在响应正文中返回详细信息。不幸的是,它没有给出关于SDK是否可以访问这些内容的线索

所有的帮助都非常感谢。

共有3个答案

姜弘新
2023-03-14

这似乎已经改变了,虽然这些答案中的许多都指向了正确的方向,但没有一个对我完全有效。这相当于我目前最受欢迎的答案:

catch (PayPal.PaymentsException ex)
{
    context.Response.Write(ex.Response);
}

答复如下:

{"name":"VALIDATION_ERROR","details":[{"field":"start_date","issue":"Agreement start date is required, should be valid and greater than the current date. Should be consistent with ISO 8601 Format"}],"message":"Invalid request. See details.","information_link":"https://developer.paypal.com/docs/api/payments.billing-agreements#errors","debug_id":"8c56c13fccd49"}
戴霖
2023-03-14

因为似乎没有人知道这个问题的答案,所以我深入研究了贝宝的源代码。NET SDK for REST API.从这篇综述中可以看出,在当前版本中,当服务器返回任何4xx或5xx HTTP状态代码时,没有返回错误消息的规定。我引用了这个问题的答案,并修改了SDK,以便在适用的情况下返回错误响应。这是HttpConnection.cs.的相关部分

catch (WebException ex)
{
    if (ex.Response is HttpWebResponse)
    {
        HttpStatusCode statusCode = ((HttpWebResponse)ex.Response).StatusCode;
        logger.Info("Got " + statusCode.ToString() + " response from server");
        using (WebResponse wResponse = (HttpWebResponse)ex.Response)
        {
            using (Stream data = wResponse.GetResponseStream ())
            {
                string text = new StreamReader (data).ReadToEnd ();
                return text;
            }
        }                           
    }
    if (!RequiresRetry(ex))
    {
        // Server responses in the range of 4xx and 5xx throw a WebException
        throw new ConnectionException("Invalid HTTP response " + ex.Message);
    }                       
}

当然,这需要更改调用函数以正确解释错误响应。因为我只使用Payment Create API,所以我采用了一些不适合一般使用的快捷方式。然而,基本的想法是我创建了PaymentError和Detail类,然后修改了Payment。创建和更新资源。配置和执行方法以填充和传回PaymentError对象。

三年后,PayPal的API错误响应处理有所改进。由于其他一些问题,我不得不重新编写我的应用程序,并删除先前的代码。我发现你现在可以为贝宝设陷阱了。例外PaymentsException,然后将JSON响应字符串反序列化为PayPal。例外付款错误对象。

Catch ex As PayPal.Exception.PaymentsException
    Dim tmpPmtErr As PayPal.Exception.PaymentsError = _
        JsonConvert.DeserializeObject(Of PayPal.Exception.PaymentsError)(ex.Response)

感谢@lance在另一个答案中提醒我们更仔细地检查异常。我试图使用该解决方案,但无法使其工作。

陈斌
2023-03-14

我今天才开始处理SDK和API,然后就遇到了这个问题。我的意思是,如果我要创建自己的表单来处理支付,如果有任何问题,我想给我的用户反馈。

无论如何,我确实在内部异常中找到了一些隐藏的信息。也许这会有帮助。

catch (PayPal.Exception.PayPalException ex)
{
    if (ex.InnerException is PayPal.Exception.ConnectionException)
    {
        context.Response.Write(((PayPal.Exception.ConnectionException)ex.InnerException).Response);
    }
    else
    {
        context.Response.Write(ex.Message);
    }
}

由此产生的答复:

{"name":"VALIDATION_ERROR","details":[{"field":"payer.funding_instruments[0].credit_card.number","issue":"Must be numeric"}],"message":"Invalid request - see details","information_link":"https://developer.paypal.com/webapps/developer/docs/api/#VALIDATION_ERROR","debug_id":"0548e52ef9d95"} 
 类似资料:
  • 我创建贝宝Restapi以下步骤1.创建登录ID由developer.paypal.com2.点击我的应用程序3.点击按钮"创建应用程序"创建测试应用程序4.通过单击testapp,我得到了两个api凭据(i)测试凭据(ii)实时凭据(通过单击显示) 我的代码中存在上述api(客户端ID和密码)的问题,代码给出的错误号为401或某个时间为400 我已检查“帐户资格” PayPal付款和登录与Pay

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示:

  • 我已经把swagger融入了我的春装项目中。所有swaggerendpoint都工作正常,但< code >/product/swagger-ui . html 给出400错误。 在我的application.properties文件中,我使用了< code > server . context path =/product 。 在我的控制器中,我有以下映射,我认为这些映射导致了错误。 产品控制者

  • 我使用贝宝rest api支付资源来更新付款金额和项目信息;我只是想改变项目的价格和税收;和运费金额;但返回MALFORMED_REQUEST;让我喝醉... request_data是: 并返回:{"name":"MALFORMED_REQUEST","消息":"MALFORMED_REQUEST","information_link":"https://developer.paypal.com

  • 目标是通过ajax将对象发送到另一台服务器,这是我为CORS设置的,下面是代码。ajax代码片段: 正确发布数据,但使用