65.9K
CodeProject 正在变化。 阅读更多。
Home

扩展 PayPal .NET API 以检测错误

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2015 年 10 月 12 日

CPOL

3分钟阅读

viewsIcon

12255

这个简短的技巧将向您展示如何通过向 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.csConfiguration.csPayFlow.csRequestFLow.csRequestFlowItem.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 的方法的调用,该方法负责遍历每个 RequestFlowItemMessages 属性

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 苦苦挣扎的人,因为我自己也在使用该框架,我将尝试提供更多技巧/窍门或文章来帮助其他开发人员。

© . All rights reserved.