我在沙箱中工作,并使用贝宝REST .NET SDK方法Payment.Create用信用卡式对象。 当所有参数有效并且使用来自所述测试CC数https://developer.paypal.com/webapps/developer/docs/integration/direct/accept-credit-cards/ ,支付对象从该方法返回,所有是好。
然而,当参数是无效的,如过去的到期日期或不是由沙箱识别的CC数,则不返回支付对象。 代替该方法抛出异常:“异常中的HttpConnection执行:无效HTTP响应远程服务器返回一个错误:(400)错误的请求”,但没有进一步的解释。
当我执行的卷曲相同的请求,除了“400错误的请求”,我得到一个JSON响应。 这包括更有益的信息,如“VALIDATION_ERROR”和“无效到期(不能是过去)”。
我的问题:是否有一种方式来获得这些消息从SDK回来?
我已经试过:
- 贝宝文档: https://developer.paypal.com/webapps/developer/docs/api/#errors该文件提到,在错误的情况下,他们在响应的正文返回的细节。 不幸的是,它并没有给出关于这些是否是由SDK访问的线索。
- 各种谷歌和SO搜索。
- 随SDK提供的PizzaApp示例代码无关,在异常处理或进一步了解的方式进入这一问题。
- 我看到,在SDK中PayPalException对象,但没有发现任何表明它应该如何使用,或者如果它甚至对这个问题相关。
所有的帮助是非常赞赏。
Answer 1:
我才开始今天的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"}
Answer 2:
因为似乎没有人知道这个问题的答案,我挖成贝宝对REST API .NET SDK的源代码。 从这次审查中,似乎为当前版本,对于当任何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);
}
}
当然,这需要改变调用函数正确地解释错误响应。 由于我只使用支付创建API,我花了一些快捷方式,不会用于一般用途的工作。 然而,基本的想法是,我创建PaymentError和详细的类,然后改变了Payment.Create和PayPalResource.ConfigureAndExecute方法来填充,并传回一个PaymentError对象。
三年后,并没有在PayPal的API错误响应处理一些改进。 由于一些其他的问题,我不得不重新工作,我的应用程序,并撕裂了在前代码。 我发现,你现在可以捕获一个PayPal.Exception.PaymentsException,然后反序列化JSON响应字符串转换成PayPal.Exception.PaymentsError对象。
Catch ex As PayPal.Exception.PaymentsException
Dim tmpPmtErr As PayPal.Exception.PaymentsError = _
JsonConvert.DeserializeObject(Of PayPal.Exception.PaymentsError)(ex.Response)
多亏了对方的回答@lance的抬头更仔细地检查的异常。 我试图使用的解决方案,但不能使它工作。
Answer 3:
@Jonathan,其余的API已经log4net的整合,并输出完整的错误回应,如果你设置它的日志文件。 您必须将此配置节添加到您的web.config:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
并且还设置选项:
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="rest-api.log"/>
<appendToFile value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="FileAppender"/>
</root>
打开你的global.asax,并加入到这个的Application_Start:
log4net.Config.XmlConfigurator.Configure();
现在,只要有你的日志文件夹设置写入权限,然后PayPal的REST SDK会吐出错误信息到日志文件。
Answer 4:
这似乎已经改变,而许多这些答案的指向正确的方向,他们没有工作完全适合我。 这是我的等值目前最upvoted答案:
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"}
Answer 5:
我的问题是,我total
, detail.subtotal
和items.price
进行传递,比如$ 1,000.00值,它需要小数所以使用这样的:
total = Regex.Replace(model.OrderTotal, "[^0-9.]", "")
Answer 6:
这里完善的解决方案是...只要(进口贝宝)
Try
Catch ex As PaymentsException
For Each i In ex.Details.details
Response.Write(i.field) 'Name of Field
Response.Write(i.code) 'Code If Any
Response.Write(i.issue) 'Validation Issue
Next
End Try
Answer 7:
所有不要的上述解决方案的真正抓住问题..
我跑了一个类似的问题而回..我调试的代码后,我发现,我是做交易是逻辑错误..小计被断为$ 0.25,贝宝服务器看到它,并拒绝对其进行处理,并给我400错误的请求
Answer 8:
如果您使用的是美国以外的全球化,你需要你的小数转换为InvariantCulture的:
order.GetTotal().ToString("N2", CultureInfo.InvariantCulture)
文章来源: PayPal REST API .net SDK - 400 Bad Requests