你好,我已经开发了一个插件,我试图获得订单的状态时,客户进行在线支付.

我目前正在try 下面的方法

use Shopware\Core\Checkout\Order\Event\OrderStateMachineStateChangeEvent;

 public static function getSubscribedEvents(): array
{


       return [
CheckoutOrderPlacedEvent::class => 'OnOrderReceived',
            OrderEvents::ORDER_TRANSACTION_STATE_WRITTEN_EVENT => 'onMent',
        ];
}

我try 将数据记录在$EVENT中

public function onMent(EntityWrittenEvent $event): void
    {
         highlight_string("<?php\n\$data =\n" . var_export($event, true) . ";\n?>");
    }

但什么都没有发生.

我如何在付款后检测订单的状态?

推荐答案

你可以add a subscriber岁,听state_machine.order_transaction.state_changed岁.

<service id="SwagBasicExample\Listener\OrderStateChangeEventListener">
    <argument type="service" id="order_transaction.repository"/>
    <tag name="kernel.event_subscriber"/>
</service>
use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\InvoicePayment;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions;
use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class OrderStateChangeEventListener implements EventSubscriberInterface
{
    public function __construct(
        private readonly EntityRepository $transactionRepository
    ) {
    }

    public static function getSubscribedEvents(): array
    {
        return [
            'state_machine.order_transaction.state_changed' => 'onOrderTransactionStateChange',
        ];
    }

    public function onOrderTransactionStateChange(StateMachineStateChangeEvent $event): void
    {
        if ($event->getNextState()->getTechnicalName() !== StateMachineTransitionActions::ACTION_PAID) {
            return;
        }

        $orderTransactionId = $event->getTransition()->getEntityId();

        $criteria = new Criteria([$orderTransactionId]);
        $criteria->addAssociation('paymentMethod');

        /** @var OrderTransactionEntity $orderTransaction */
        $orderTransaction = $this->transactionRepository
            ->search($criteria, $event->getContext())
            ->first();

        if ($orderTransaction?->getPaymentMethod()?->getHandlerIdentifier() !== InvoicePayment::class) {
            return;
        }

        // do something if transaction state entered is `paid` and payment method is invoice
    }
}

Php相关问答推荐

基于产品变化自定义字段自定义WooCommerce低库存邮箱内容

通过激活模板在数据库中创建表

以编程方式更新现有Yith WooCommerce Booking的状态

MariaDB 11.3.2+PHP:服务器向客户端发送未知的字符集(0).请向开发人员报告

在PHP 8.2 Gloogle云引擎上加载大型php文件速度缓慢

如何在PHP中组合日期范围

在WooCommerce上克隆订单时使用`add_product()`添加产品元数据

上传WordPress模板中的翻译文件(.mo和.po)

在WooCommerce购物车页面应用优惠券不会';t刷新总计

Regex|PHP捕获json字符串中的每个非法双引号

在 PHP 中将字符串分解为数组(字符串类似于 WP 短代码)

Woocommerce 临时购物车税未根据第一个请求正确计算

WooCommerce:如果购物车中已存在产品,则增加购物车商品数量

计算添加到购物车的点击次数并将其显示在 WooCommerce 管理产品列表中

Golang - Html 模板:如何创建导航项 - 子菜单?我找不到怎么做

使用 phpseclib 验证 RSA-PSS

获取 Shopware 6 集合元素的值,PHP

使用 Laravel 和 Vue 进行图像表单验证

Eloquent 的模型更新了它应该 laravel php 的更多行

如何获取最后一条消息属于 Laravel 中特定用户的对话列表