Magento 2.4.5升级后观察者类无法获取Stripe支付信息
Magento 2.4.5升级后Stripe支付信息获取失效的解决方案
问题核心
升级Magento至2.4.5后,原自定义观察者中通过StripeIntegration\Payments\Block\Adminhtml\Payment\Info的getCard()方法获取支付信息返回null,依赖current_order注册表的逻辑失效。
可行解决方案
1. 直接从支付对象的附加数据中提取信息
后台显示的支付信息通常存储在订单支付对象的additional_data字段中,无需依赖Adminhtml Block:
switch ($_payment_info->getMethod()) { case "stripe_payments": $payment = $order->getPayment(); $additionalData = $payment->getAdditionalData(); // 解析JSON格式的附加数据 if (is_string($additionalData)) { $additionalData = json_decode($additionalData, true); } // 根据Stripe模块实际存储的键名提取卡片信息 if (!empty($additionalData['card'])) { $this->get_credit_card_payment_info($order_info, $additionalData['card']); } $order_info["cc_name"] = $order->getBillingAddress()->getName(); $order_info["cc_veri"] = $payment->getTransactionId(); break; }
注:不同版本Stripe模块的存储键名可能不同,可通过数据库查看sales_order_payment表的additional_data字段确认具体结构。
2. 修复Adminhtml Block的初始化逻辑
若必须使用原Block方式,需手动为Block设置支付对象,而非仅依赖current_order注册表:
switch ($_payment_info->getMethod()) { case "stripe_payments": $payment = $order->getPayment(); $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $stripePayment = $objectManager->get('StripeIntegration\Payments\Block\Adminhtml\Payment\Info'); $stripePayment->setPayment($payment); // 手动绑定支付对象 $card = $stripePayment->getCard(); if ($card) { $this->get_credit_card_payment_info($order_info, $card); } $order_info["cc_name"] = $order->getBillingAddress()->getName(); $order_info["cc_veri"] = $payment->getTransactionId(); break; }
建议尽量通过依赖注入方式注入Block,避免直接使用ObjectManager,提升代码可维护性。
3. 更换触发事件
原事件sales_order_place_after可能在支付数据未完全写入时触发,改用sales_order_payment_save_after事件,确保支付数据已持久化:
- 在模块的
events.xml中修改事件监听:
<event name="sales_order_payment_save_after"> <observer name="your_observer_name" instance="Your\Module\Observer\YourObserver" /> </event>
- 观察者中通过
$observer->getPayment()获取支付对象,再关联到订单:
public function execute(\Magento\Framework\Event\Observer $observer) { $payment = $observer->getPayment(); $order = $payment->getOrder(); // 后续支付信息处理逻辑 }
4. 升级Stripe模块至适配2.4.5的版本
旧版Stripe模块可能与Magento 2.4.5存在兼容性问题,检查并升级Stripe官方模块到最新兼容版本,确保内部数据获取逻辑同步更新。
内容的提问来源于stack exchange,提问作者Pramod Gangadar
相关产品推荐
相关产品推荐

