You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:20:39