如何初始化 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。
备注:内容仅供参考。
