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