PAYATHON 2026

如何初始化 PaymentClient 并显示 Payment Properties

支付阿杰

结论

不要在 Order.cshtml 中通过 new PaymentClient(...) 手动配置服务地址和身份验证信息。请使用 VirtoCommerce Storefront 已初始化的 ClientContext 创建客户端:

var paymentClient = ClientContext.Clients.CreatePaymentClient();

创建客户端后,调用 GetPaymentMethod(...) 获取支付方式及其属性。建议在 Controller 或业务服务中完成查询,并通过 ViewModel 将结果传给视图,避免在视图中直接访问后台 API。

在视图中直接调用

如果当前项目版本支持 CreatePaymentClient(),可以在 Order.cshtml 中这样调用:

@using VirtoCommerce.Client

@{
    var paymentClient = ClientContext.Clients.CreatePaymentClient();

    // 参数应按当前项目中 GetPaymentMethod 的实际签名传入。
    var paymentMethod = paymentClient.GetPaymentMethod(/* payment method identifier */);
}

@if (paymentMethod != null && paymentMethod.Properties != null)
{
    foreach (var property in paymentMethod.Properties)
    {
        <div class="payment-property">
            <span>@property.Name</span>
            <span>@property.Value</span>
        </div>
    }
}

ClientContext 会复用 Storefront 中已有的服务地址、认证信息和客户端配置,通常无须自行构造 PaymentClient。

推荐实现:通过 ViewModel 传递数据

在视图中直接调用远程服务,会把展示逻辑和数据访问逻辑混在一起,也会增加错误处理和测试的难度。可以在 Controller 中完成查询:

public ActionResult Order(string paymentMethodId)
{
    var paymentClient = ClientContext.Clients.CreatePaymentClient();

    var paymentMethod = paymentClient.GetPaymentMethod(paymentMethodId);

    var model = new OrderViewModel
    {
        PaymentMethod = paymentMethod
    };

    return View(model);
}

Order.cshtml 只负责显示数据:

@model OrderViewModel

@if (Model.PaymentMethod?.Properties != null)
{
    foreach (var property in Model.PaymentMethod.Properties)
    {
        <div class="payment-property">
            <span>@property.Name</span>
            <span>@property.Value</span>
        </div>
    }
}

如果页面只显示少数几个属性,可以先在 Controller 中筛选数据,并将其转换为 ViewModel 的专用字段,以免视图直接依赖 VirtoCommerce 的 API 数据模型。

注意事项

  • CreatePaymentClient() 和 GetPaymentMethod(...) 的具体名称、参数和返回类型可能随 VirtoCommerce 版本或 Storefront 分支而变化,请以项目实际引用的 VirtoCommerce.Client 程序集为准。
  • 某些版本提供异步方法,例如 GetPaymentMethodAsync(...)。这时应在 Controller 中使用 await,不要在 Razor 视图中调用 .Result 或 .Wait()。
  • 查询通常需要支付方式的标识,而非显示名称。请使用订单中保存的 payment method ID 或 code,并与实际方法签名核对。
  • Manager 中保存的属性能否出现在 Properties 集合中,取决于支付方式的序列化模型和 API 返回内容。客户端正确初始化后,后台字段也不一定会全部返回。
  • 输出属性值时,应保留 Razor 的默认 HTML 编码,不要随意使用 Html.Raw。

备注:内容仅供参考。