Повторно инициировать шаги платежа в sylius после неудачной оплаты

Есть ли чистый способ дать пользователю возможность повторить попытку платежа, если попытка после размещения заказа не удалась в Sylius 0.13?

У меня есть интерфейсное администрирование для пользователей со списком их заказов, и я хотел бы добавить ссылку на каждый неудачно оплаченный заказ, который перенаправлял бы пользователя на /payment/capture/<hash> url, например, на размещение заказа.

Спасибо.


person Dukecz    schedule 28.01.2015    source источник
comment
Пользователю будет предложено повторить попытку способа оплаты. в случае неудачи. Есть ли еще один шаг в потоке состояний, который не был учтен?   -  person Adam Elsodaney    schedule 14.02.2015
comment
Да, например, когда пользователь не завершил платеж, но хочет завершить его позже. Я не нашел чистого способа сделать оплату возможной без шагов заказа раньше, поскольку заказ уже был размещен.   -  person Dukecz    schedule 14.02.2015
comment
А, я понимаю (я думаю;), так вы хотите, чтобы клиенты могли возобновить работу с того места, откуда они ушли?   -  person Adam Elsodaney    schedule 14.02.2015
comment
@AdamElsodaney Да, именно так. :)   -  person Dukecz    schedule 16.02.2015


Ответы (1)


Я решил проблему с помощью обычного контроллера, который производит оплату самостоятельно. У нас есть детали заказа на веб-интерфейсе, где видна форма оплаты (если не оплачена):

public function showAction($number)
{
    $order = $this->findOrderOr404($number);
    $form = $this->getPaymentFormIfOrderPayable($order);

    $view = $this
        ->view()
        ->setTemplate('SyliusWebBundle:Frontend/Account:Order/show.html.twig')
        ->setData(array(
                'order' => $order,
                'form' => $form,
            ))
    ;

    return $this->handleView($view);
}

Новый платеж всегда имеет последний метод в базе данных. После этого он генерирует аналогичную форму, как после оформления заказа.

/**
 * @param OrderInterface $order
 * @return bool|FormInterface form if payable otherwise false
 */
protected function getPaymentFormIfOrderPayable(OrderInterface $order) {
    if($order->getState() === OrderInterface::STATE_PENDING) {
        /** @var PaymentInterface $paymentMethod */
        $paymentMethod = $order->getPayments()->last()->getMethod()->getGateway();
        switch ($paymentMethod) {
            case 'gpe':
                $form = $this->createGPEPaymentRequest($order);
                break;

            default:
                $form = false;
        }
    } else {
        $form = false;
    }

    return $form;
}

После оплаты пользователь перенаправляется к другому действию, которое работает как CaptureAction и PaymentStatusAction в Payum:

/**
 * @param Request $request
 * @param string $number Order Id
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 * @throws NotFoundHttpException
 * @throws AccessDeniedException
 */
public function payAction(Request $request, $number) {
    $order = $this->findOrderOr404($number);

    /** @var PaymentInterface $paymentMethod */
    $paymentMethod = $order->getPayments()->last()->getMethod()->getGateway();
    switch ($paymentMethod) {
        case 'gpe':
            $this->resolveGPEPaymentRequest($request, $order);
            break;

    $this->get('sylius.cart_provider')->abandonCart();
    $this->get('event_dispatcher')->dispatch('sylius.checkout.purchase.complete', new PurchaseCompleteEvent($order->getPayments()->last()));

    return $this->redirect($this->generateUrl('sylius_account_order_show', array('number' => $order->getNumber())));
}
person Dukecz    schedule 01.07.2015