Перенаправление Omnipay 3Dsecure

Я использую Omnipay, чтобы позволить пользователям платить с помощью Cardsave.

У меня есть следующее:

    \Omnipay::setTestMode(true);

    $transactionId = date('YmdHis').$booking->space->id.$booking->user->id;


    $response = $gateway->purchase([
        'amount' => $booking->price,
        'currency' => 'GBP',
        'card' => $card,
        'transactionId' => $transactionId,
        'cancelUrl' => \base_url('cardsave/cancel/'.$booking->id),
        'returnUrl' => \base_url('cardsave/confirm/'.$booking->id)
    ])->send();

    if ($response->isSuccessful()) {
        $transactionReference = $response->getTransactionReference();

        //save the transaction reference in case of refund

        return ['status' => 'success', 'message' => 'Reservation process complete'];
    } elseif ($response->isRedirect()) {
        \Log::info('3DSecure redirect');

        $booking->addAdditional(['3dsecure_transaction_id' => $transactionId]);

        return [
            'status' => 'redirect',
            'form_html' => $response->getRedirectResponse()->getContent()
        ];
    }
    throw new PaymentException ($response->getMessage());

и мой URL-адрес подтверждения переходит к следующему методу:

    $transactionId = $booking->getAdditional('3dsecure_transaction_id');

    $response = $gateway->completePurchase([
        'amount' => $amount,
        'transactionId' => $transactionId,
        'currency' => 'GBP',
    ])->send();

    if ($response->isSuccessful()) {
        $transactionReference = $response->getTransactionReference();

        return $this->finalise($booking, $transactionReference);
    } else {
        $this->cancel($booking);
    }

Но просматривая код для лиги/omnipay-cardsave, я вижу следующее:

    $md = $this->httpRequest->request->get('MD');
    $paRes = $this->httpRequest->request->get('PaRes');
    if (empty($md) || empty($paRes)) {
        throw new InvalidResponseException;
    }

Итак, мой вопрос (и я понимаю, что это, вероятно, глупо, но по какой-то причине я не могу понять это), откуда исходит этот запрос, если я только что создал экземпляр шлюза?

Я думаю, что я делаю это неправильно.

РЕДАКТИРОВАТЬ:

Я обнаружил, что обратный вызов от 3DSecure поставляется со значениями MD и PaRes в качестве параметров POST. Это позволяет мне установить их на шлюзе. Как я могу это сделать? Это делается автоматически, когда я создаю шлюз?


person Tom Macdonald    schedule 22.09.2014    source источник


Ответы (1)


Я был прав, вопрос был глупым.

Прочитав код и попробовав его, я обнаружил, что AbstractGateway использует класс запроса Symfony для автоматического получения переменных POST, среди которых в данном случае «MD» и «PaRes».

На самом деле так и написано в классе CompletePurchase:

$md = $this->httpRequest->request->get('MD');
$paRes = $this->httpRequest->request->get('PaRes');

httpRequest настроен в AbstractGateway.

В принципе, это просто работает.

person Tom Macdonald    schedule 22.09.2014