PAYATHON 2026

如何在 IS7.9 Java 代码中获取 Payment service 配置

支付老李

结论

在 IS7.9 中,不要再通过已废弃的 PaymentInstrumentInfo#getPaymentService() 获取服务对象。正确的做法是先从 NamingMgr 获取 PaymentServiceProvider,再根据 PaymentInstrumentInfo 解析出对应的 PaymentService,然后读取服务配置。

PaymentServiceProvider paymentServiceProvider =
        NamingMgr.getManager(PaymentServiceProvider.class);

PaymentService paymentService =
        paymentServiceProvider.getPaymentService(paymentInstrumentInfo);

推荐实现

以下示例会遍历订单中的支付信息,读取 CreditCardPayment 配置项和支付服务 ID:

import java.util.Iterator;

import com.intershop.beehive.core.capi.naming.NamingMgr;
import com.intershop.component.payment.capi.PaymentInstrumentInfo;
import com.intershop.component.payment.capi.PaymentService;
import com.intershop.component.payment.capi.PaymentServiceProvider;

// ...

PaymentServiceProvider paymentServiceProvider =
        NamingMgr.getManager(PaymentServiceProvider.class);

Iterator<PaymentInstrumentInfo> paymentInfos =
        order.createPaymentInstrumentInfoIterator();

while (paymentInfos.hasNext())
{
    PaymentInstrumentInfo paymentInstrumentInfo = paymentInfos.next();

    PaymentService paymentService =
            paymentServiceProvider.getPaymentService(paymentInstrumentInfo);

    if (paymentService == null)
    {
        // 支付服务可能已被删除、未安装,或当前上下文无法解析该服务。
        continue;
    }

    String creditCardPayment =
            paymentService.getConfiguration().getString("CreditCardPayment");

    String paymentServiceID = paymentService.getID();

    // 使用 creditCardPayment 和 paymentServiceID
}

如果能够确认订单只有一个 PaymentInstrumentInfo,可以只处理第一项,但要先检查迭代器中是否有元素:

Iterator<PaymentInstrumentInfo> paymentInfos =
        order.createPaymentInstrumentInfoIterator();

if (paymentInfos.hasNext())
{
    PaymentInstrumentInfo paymentInstrumentInfo = paymentInfos.next();

    PaymentServiceProvider provider =
            NamingMgr.getManager(PaymentServiceProvider.class);

    PaymentService paymentService =
            provider.getPaymentService(paymentInstrumentInfo);

    if (paymentService != null)
    {
        String isCreditCard =
                paymentService.getConfiguration()
                              .getString("CreditCardPayment");

        String paymentMethodName = paymentService.getID();
    }
}

为什么要通过 PaymentServiceProvider

PaymentInstrumentInfo 保存订单使用过的支付工具信息,PaymentService 则是运行时服务。如果由持久化的支付信息对象直接暴露运行时服务,两者会产生不必要的耦合。为此,IS7.9 将 getPaymentService() 标记为废弃,并把解析服务的职责交给 PaymentServiceProvider。

通过 provider 解析服务,也便于统一处理服务注册、当前应用或站点上下文,以及支付服务是否仍然可用等情况。

注意事项

  • 不要直接调用 paymentInstrumentInfo.getPaymentService(),即使该方法在 IS7.9 中仍可通过编译。
  • createPaymentInstrumentInfoIterator() 可能返回多个支付工具信息,例如组合支付场景,因此不能默认第一项就是目标支付方式。
  • PaymentServiceProvider#getPaymentService(...) 可能返回 null。历史订单引用的支付服务可能已经被卸载、删除,或者无法在当前上下文中解析。
  • 配置项不存在时,getConfiguration().getString("CreditCardPayment") 的具体行为取决于所使用的配置实现。业务代码需要区分”未配置”和显式配置为 "false"。
  • 支付服务配置通常取决于运行时 domain、application 或 site 上下文。读取配置时,要确保代码运行在正确的 Intershop 请求或 domain 上下文中。
  • 不同 IS7.9 补丁版本的包名或 PaymentServiceProvider 重载签名可能不同。如果当前 Javadoc 中没有 getPaymentService(PaymentInstrumentInfo),请使用该版本提供的按支付服务 ID 查询的重载。核心原则不变:通过 PaymentServiceProvider 解析服务,不要调用已废弃的 getter。

备注:内容仅供参考。