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