首页 > 解决方案 > 选择线下支付后如何将订单状态更改为已支付?

问题描述

使用 stable Sylius 1.2.0,如何在选择离线支付方式后将订单标记为已付款?

尝试使用sylius_order_payment状态机的后回调,但它似乎不会在任何转换时触发:

winzou_state_machine:
    sylius_order_payment:
        callbacks:
            after:
                set_order_paid:
                    on: ['complete']
                    do: ['@AppBundle\Payment\StateMachine\Callback\CallbackClass', 'updateOrder']
                    args: ['object']

状态机是否完全被使用?也许我用错了。欢迎任何建议。感谢您的耐心等待。

更新 1

明天我将尝试使用文档中的状态机转换章节完成付款。我正在考虑将此代码放在一个事件侦听器中,侦听Order created resource event,尽管状态机回调听起来是一个更好的解决方案。

标签: symfonysymfony4sylius

解决方案


终于让它工作了:

state_machine.yml

winzou_state_machine:
    sylius_order_checkout:
        callbacks:
            after:
                app_order_complete_set_paid:
                    on: ['complete']
                    do: ['@AppBundle\Order\StateMachine\Callback\OrderCompleteSetPaidCallback', 'setPaid']
                    args: ['object']

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: true

    AppBundle\Order\StateMachine\Callback\OrderCompleteSetPaidCallback: ~

OrderCompleteSetPaidCallback.php

<?php

namespace AppBundle\Order\StateMachine\Callback;

use SM\Factory\FactoryInterface;
use AppBundle\Infrastructure\CommandBus\CommandBus;
use AppBundle\Order\SetPaid\SetPaidCommand;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Payment\PaymentTransitions;

final class OrderCompleteSetPaidCallback
{
    private $stateMachineFactory;

    public function __construct(FactoryInterface $stateMachineFactory)
    {
        $this->stateMachineFactory = $stateMachineFactory;
    }

    public function setPaid(OrderInterface $order): void
    {
        if (!($lastPayment = $order->getLastPayment())) {
            return;
        }

        if ('cash_on_delivery' === $lastPayment->getMethod()->getCode()) {
            $this->transition($order);
        }
    }

    private function transition(OrderInterface $order): void
    {
        $stateMachine = $this->stateMachineFactory->get($order, OrderPaymentTransitions::GRAPH);
        $stateMachine->apply(OrderPaymentTransitions::TRANSITION_PAY);

        $payment = $order->getLastPayment();

        $stateMachine = $this->stateMachineFactory->get($payment, PaymentTransitions::GRAPH);
        $stateMachine->apply(PaymentTransitions::TRANSITION_COMPLETE);
    }
}

推荐阅读