Magento 2后台支付方式限制:迁移代码后返回结果异常求助
Magento 2 支付方法激活观察者返回结果问题解决方案
看起来你在把Magento 1的支付逻辑迁到Magento 2时,卡在了后台支付环节的观察者返回数组结果这一步。我帮你把代码修正一下,顺便讲清楚这里的关键逻辑:
首先,你的MethodIsActive观察者存在几个小问题:比如事件参数获取不对、配置路径不完整,还有对Magento 2事件机制的返回逻辑理解偏差。下面是修正后的完整代码:
<?php namespace Getsquare\AdminPayments\Observer\Payment; class MethodIsActive implements \Magento\Framework\Event\ObserverInterface { /** * @var \Magento\Framework\App\Config\ScopeConfigInterface */ protected $scopeConfig; /** * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig */ public function __construct( \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig ) { $this->scopeConfig = $scopeConfig; } /** * Execute observer * * @param \Magento\Framework\Event\Observer $observer * @return $this */ public function execute(\Magento\Framework\Event\Observer $observer) { // 正确获取支付方法实例和事件结果对象 $paymentMethod = $observer->getEvent()->getMethodInstance(); $result = $observer->getEvent()->getResult(); // 替换成你实际的完整配置路径,这里以adminpayments的激活状态为例 $configValue = $this->scopeConfig->getValue( 'sales/payment_methods/adminpayments/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); // 只针对你的目标支付方法做逻辑处理 if ($paymentMethod->getCode() === 'adminpayments') { // 设置支付方法是否可用,这是支付激活逻辑的核心 $result->setData('is_available', (bool)$configValue); // 如果需要返回自定义数组结果,直接通过result对象传递即可 $customArray = [ 'status' => 'success', 'message' => 'Payment method configured correctly', 'config' => $configValue ]; $result->setData('custom_result_array', $customArray); } // Magento 2的观察者execute方法一般返回$this,通过对象传递修改结果 return $this; } }
关键逻辑说明:
- 事件参数获取:原代码里
$methodInstance = $observer->getEvent();是错的,要直接从事件里拿MethodInstance和Result对象——后者才是用来传递结果的关键载体。 - 配置路径规范:你原来的
'sale...'不完整,必须用Magento标准的配置路径格式,比如sales/payment_methods/[你的支付方法code]/[具体配置项],还要指定作用域(比如店铺级)。 - 返回数组的正确方式:Magento 2的事件机制不是让你直接返回数组,而是通过
$result->setData()把数组绑定到结果对象上,后续的业务逻辑可以通过事件获取这个数组。 - 观察者返回值:
execute方法通常返回$this就行,因为我们是通过修改传递过来的$result对象来改变结果的,不需要直接返回数据。
如果你的需求是从配置里读取一个数组(比如序列化的配置项),可以这么处理:
// 获取序列化的配置数组 $serializedConfig = $this->scopeConfig->getValue( 'sales/payment_methods/adminpayments/custom_serialized_array', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); // 反序列化成数组 $configArray = unserialize($serializedConfig); // 把数组传递到结果中 $result->setData('config_array', $configArray);
内容的提问来源于stack exchange,提问作者Prathap Gunasekaran
相关产品推荐
相关产品推荐

