你可以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
}
}