PAYATHON 2026

Intershop 7.10:获取 payment configuration

支付小周

结论

无需通过 PaymentConfigurationPOFactory 或 NamingMgr 读取 PaymentConfigurationPO。在 Intershop 7.10 中,支付方式的有效配置参数应优先通过 PaymentServiceBO 的参数接口获取:

Object value = paymentServiceBO.getParameter("YourParameterName");

如果要读取的是创建订单支付对象时保存的参数,而非支付服务的当前配置,则应从 PaymentBO 获取。这两类参数含义不同,不能混用。

推荐实现

先获取订单关联的 PaymentBO,再取得对应的 PaymentServiceBO 并读取服务参数:

final OrderBOPaymentExtension paymentExtension =
        getExtendedObject().getExtension(
                OrderBOPaymentExtension.EXTENSION_ID);

if (paymentExtension == null)
{
    return;
}

final PaymentBO paymentBO = paymentExtension.getPaymentBOs()
        .stream()
        .findFirst()
        .orElse(null);

if (paymentBO == null)
{
    return;
}

final PaymentServiceBO paymentServiceBO =
        paymentBO.getPaymentServiceBO();

if (paymentServiceBO == null)
{
    return;
}

final Object parameterValue =
        paymentServiceBO.getParameter("YourParameterName");

取得参数后,应按照它在 payment service configuration 中声明的类型进行转换:

final Object rawValue =
        paymentServiceBO.getParameter("YourParameterName");

final String value =
        rawValue == null ? null : rawValue.toString();

不要假定所有参数都是 String。对于布尔值、数字或其他类型,应先确认实际返回类型:

final Object rawValue =
        paymentServiceBO.getParameter("Enabled");

final boolean enabled =
        rawValue instanceof Boolean && (Boolean)rawValue;

具体返回类型由对应支付服务对参数的定义决定。

PaymentServiceBO 参数与 PaymentBO 参数的区别

PaymentServiceBO 中保存的是支付服务配置,例如商户账号、功能开关和支付渠道设置:

Object configurationValue =
        paymentServiceBO.getParameter("YourParameterName");

PaymentBO 中保存的是某一笔订单支付的数据,通常在支付对象创建或处理过程中写入,例如支付引用号、用户选择或支付流程产生的附加信息。如果目标参数保存在 PaymentBO 上,应使用当前版本实际提供的 payment parameter API,例如:

Object orderPaymentValue =
        paymentBO.getParameter("YourParameterName");

判断方式很直接:

  • 在后台 payment service configuration 中配置的值,从 PaymentServiceBO 读取。
  • 随订单支付保存的值,从 PaymentBO 读取。

为什么不建议访问 PaymentConfigurationPO

以下写法会直接进入持久化对象层:

PaymentConfigurationPOFactory factory =
        (PaymentConfigurationPOFactory)NamingMgr.getInstance()
                .lookupFactory(PaymentConfigurationPO.class);

这种方式有几个问题:

  • 依赖已废弃的 NamingMgr/PO Factory 访问方式。
  • 绕过 BO 层的上下文、扩展和参数解析逻辑。
  • 调用方需要自行确定 configuration ID 和 domain。
  • 代码会与 Intershop 的内部持久化模型耦合。
  • 升级或更换支付实现后,相关代码更容易失效。

PaymentServiceBO 已经代表当前支付服务及其有效配置,业务代码通常无需再次查询底层的 PaymentConfigurationPO。

注意事项

一个订单可能包含多个 PaymentBO。只有在业务明确保证使用单一支付方式时,findFirst() 才是安全的。如果系统支持组合支付、礼品卡或拆分支付,应遍历全部支付对象:

for (PaymentBO paymentBO : paymentExtension.getPaymentBOs())
{
    PaymentServiceBO serviceBO = paymentBO.getPaymentServiceBO();

    if (serviceBO == null)
    {
        continue;
    }

    Object value = serviceBO.getParameter("YourParameterName");
    // 按对应支付服务处理
}

PaymentServiceBO 通常反映当前能够解析到的支付服务配置。如果某个参数必须保留下单时的值,就不能只依赖之后可能被管理员修改的服务配置。应在创建或处理 PaymentBO 时将该值保存为订单支付参数,避免读取历史订单时得到修改后的配置值。

不同的 Intershop 7.10 patch level 或支付 cartridge 可能会扩展参数类型、可见性和具体方法签名。如果当前依赖中的 PaymentServiceBO 没有公开 getParameter(String),应检查该版本的 PaymentServiceBO 接口以及支付 cartridge 提供的 BO extension,而不是退回到 deprecated 的 PO Factory。

备注:内容仅供参考。