扩展 PayPal .NET API 以检测错误





5.00/5 (3投票s)
这个简短的技巧将向您展示如何通过向 PayPal 的 .NET API 的对象和页面级函数添加新成员来扩展它,这将有助于提供流畅的错误处理体验。
引言
在这里,我将向您展示如何准确检测和显示 PayPal .NET API 生成的任何错误。正如任何经验丰富的开发人员所知,您需要尽一切可能确保您了解代码中发生的事情,尤其是在处理用户的信用卡时。这些示例使用 Visual Studio 2015、ASP.NET 4.6 和 C# 6。
此技巧假设您已从 https://github.com/paypal/PayPal-NET-SDK 下载了 API,并且您有一个准备好使用 API 的 Web 应用程序,并且您已将相关文件复制到 Web 应用程序的目录中。 本技巧不会向您展示如何创建网站,然后将 API 集成到该站点中。 相关文件(至少在我看来)将包括 Common.cs、Configuration.cs、PayFlow.cs、RequestFLow.cs 和 RequestFlowItem.cs。
PayFlow 错误架构
在图中,您将在底部看到 PayPal 的消息向下三层,它们有三种类型:通用、成功和错误。
添加属性
打开 RequestFlowItem.cs 文件,添加一个新的只读 public
属性,它将告诉您是否有任何错误,我使用“HasFlowItemErrors
”作为名称。添加一个 getter 访问器,它将检查 Messages
集合(一个 RequestFlowItemMessage
对象的 List
),并使用“Any
”linq 扩展提供一个 lambda 表达式,该表达式查询每个项目的 Type
属性,并查找等于 RequestFlowItemMessageType.Error
的类型。
public bool HasFlowItemErrors
{
get
{
return Messages.Any(x => x.Type == RequestFlowItemMessageType.Error);
}
}
在 PayFLow.cs 文件中,添加一个新的只读 public
属性,它将告诉您是否有任何错误,我使用“HasErrors
”作为名称。 添加一个 getter 访问器,它将检查 Items
属性(一个 RequestFlowItem
对象的 List
),并使用 Any linq 扩展提供一个 lambda 表达式,该表达式查询每个项目的 HasFlowItemErrors
属性。
public bool HasErrors
{
get
{
return flow.Items.Any(x => x.HasFlowItemErrors);
}
}
正如您所看到的,此属性只有 getter,不需要 setter,因为我们正在寻找的信息已经包含在框架中。
实现新属性
在您的网页的代码隐藏中,为提交付款的按钮添加一个单击事件处理程序(如果您还没有的话)。 在您的付款处理完毕后,添加一个条件语句,该语句检查 PayFlow
对象的新 HasErrors
属性。如果 HasErrors
返回 true
,那么您需要遍历 Items
集合并检查每个 Messages
属性,并检查这些属性的错误。
为了实现此检查,我创建了一个页面级函数,该函数使用 ForEach
LINQ 扩展执行第一个检查
private void displayErrors(List<RequestFlowItem> items)
{
items.ForEach(x => getError(x));
}
正如您所看到的,lambda 表达式包含对名为 getError
的方法的调用,该方法负责遍历每个 RequestFlowItem
的 Messages
属性
private void getError(RequestFlowItem item)
{
item.Messages.ForEach(y => getErrorMarkup(y));
}
第三个名为 getErrorMarkup
的函数接受传入的 RequestFlowItemMessage
对象,并检查其 Type
属性是否等于 RequestFlowItemMessageType.Error
private void getErrorMarkup(RequestFlowItemMessage message)
{
if (message.Type == RequestFlowItemMessageType.Error)
{
ErrorMessages.Text = String.Format("<div>{0}</div>", message.Message);
}
}
如果消息是 Error
,则它将消息包装在 div
中,并将其添加到我放在页面上的 Literal 控件的 Text
属性中。为了简化代码的可读性,我继续在 RequestFlowItemMessage
类中添加了一个新的布尔属性:IsError
。有了这个新属性,我可以用一个简单的属性值检查替换值相等性检查,这使得我的代码更简洁,更易于阅读
///the property definition in RequestFlowItemMessage.cs:
public bool IsError
{
get
{
return (Type == RequestFlowItemMessageType.Error);
}
}
///implementation in web form:
private void getErrorMarkup(RequestFlowItemMessage message)
{
if (message.IsError)
{
ErrorMessages.Text = String.Format("<div>{0}</div>", message.Message);
}
}
最后,我用 CSharp 6 的新 string
插入功能替换了我的 String.Format
(https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6)。所以现在我有
ErrorMessages.Text = $"<div>{message.Message}</div>";
因此,最后,您应该在网页的代码隐藏页面上得到类似这样的结果
protected void SubmitPayemnt_Click(object sender, EventArgs e) { payFlow.MakePayment(); if (payFlow.HasErrors) { displayErrors(payFlow.flow.Items); return; } else { Messages.Text = "Payment posted successfuly!"; } } private void displayErrors(List<RequestFlowItem> items) { items.ForEach(x => getError(x)); } private void getError(RequestFlowItem item) { item.Messages.ForEach(y => getErrorMarkup(y)); } private void getErrorMarkup(RequestFlowItemMessage message) { if (message.IsError) { ErrorMessages.Text = $"<div>{message.Message}</div>"; } }
我希望这个技巧能帮助任何正在与 PayPal 的 .NET API 苦苦挣扎的人,因为我自己也在使用该框架,我将尝试提供更多技巧/窍门或文章来帮助其他开发人员。