Я использую 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);
}
Но просматривая код для league / 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. Это позволяет мне установить их на шлюзе. Как я могу это сделать? Это делается автоматически, когда я создаю экземпляр шлюза?
Я был прав, вопрос был тупым.
Прочитав код и попробовав его, я обнаружил, что AbstractGateway
использует класс запросов Symfony для автоматического выбора переменных POST, среди которых в этом случае ‘MD’ и ‘PaRes’.
На самом деле, так сказано в классе CompletePurchase:
$md = $this->httpRequest->request->get('MD');
$paRes = $this->httpRequest->request->get('PaRes');
httpRequest
настроен в AbstractGateway
,
В принципе, это просто работает.
Других решений пока нет …