Laravel Omnipay — обязательный параметр транзакцииReference

Я работаю с открытой системой тикетов под названием Attendize.

У них уже есть поставщик платежа нашивка интегрированный. Сейчас я пытаюсь сделать эту работу с поставщиком платежей Mollie.

Проблема в том, что я постоянно спотыкаюсь об этой ошибке:

введите описание изображения здесь

Мой код выглядит так:

$transaction_data += [
'transactionId' => $event_id . date('YmdHis'),
'returnUrl' => route('showEventCheckoutPaymentReturn', [
'event_id'              => $event_id,
'is_payment_successful' => 1
]),
];

$apiKey = "test_gSDS4xNA96AfNmmdwB3fAA47******";
$gateway->setApiKey($apiKey);$transaction = $gateway->purchase($transaction_data);

$response = $transaction->send();

if ($response->isSuccessful()) {

session()->push('ticket_order_' . $event_id . '.transaction_id',
$response->getTransactionReference());

return $this->completeOrder($event_id);

} elseif ($response->isRedirect()) {
/*
* As we're going off-site for payment we need to store some data in a session so it's available
* when we return
*/
session()->push('ticket_order_' . $event_id . '.transaction_data', $transaction_data);
Log::info("Redirect url: " . $response->getRedirectUrl());

$return = [
'status'       => 'success',
'redirectUrl'  => $response->getRedirectUrl(),
'message'      => 'Redirecting to ' . $ticket_order['payment_gateway']->provider_name
];

// GET method requests should not have redirectData on the JSON return string
if($response->getRedirectMethod() == 'POST') {
$return['redirectData'] = $response->getRedirectData();
}

return response()->json($return);

} else {
// display error to customer
return response()->json([
'status'  => 'error',
'message' => $response->getMessage(),
]);
}

Когда я отлаживаю свой код, он идет в elseif ($response->isRedirect()) {, Меня перенаправляют на Молли, и я могу сделать успешный платеж. Но когда меня перенаправляют обратно на http://myurl.dev/e/1/checkout/success?is_payment_successful=1 Я получаю ошибку.

ОБНОВИТЬ:

В моей функции возврата у меня есть следующий код:

public function showEventCheckoutPaymentReturn(Request $request, $event_id)
{
if ($request->get('is_payment_cancelled') == '1') {
session()->flash('message', 'You cancelled your payment. You may try again.');
return response()->redirectToRoute('showEventCheckout', [
'event_id'             => $event_id,
'is_payment_cancelled' => 1,
]);
}

$ticket_order = session()->get('ticket_order_' . $event_id);
$gateway = Omnipay::create($ticket_order['payment_gateway']->name);

$gateway->initialize($ticket_order['account_payment_gateway']->config + [
'testMode' => config('attendize.enable_test_payments'),
]);

$transaction = $gateway->completePurchase($ticket_order['transaction_data'][0]);

$response = $transaction->send();

if ($response->isSuccessful()) {
session()->push('ticket_order_' . $event_id . '.transaction_id', $response->getTransactionReference());
return $this->completeOrder($event_id, false);
} else {
session()->flash('message', $response->getMessage());
return response()->redirectToRoute('showEventCheckout', [
'event_id'          => $event_id,
'is_payment_failed' => 1,
]);
}

}

Проблема (ошибка) с $response = $transaction->send();,

Массив $ticket_order['transaction_data'][0] содержит это:

Array
(
[amount] => 80
[currency] => EUR
[description] => Order for customer: [email protected]
[transactionId] => 120170529082422
[returnUrl] => http://eventy.dev/e/1/checkout/success?is_payment_successful=1
)

ОБНОВЛЕНИЕ 2:

я добавил $gateway->setApiKey($apiKey); в моей функции возврата. Но проблема в том, что мой ответ НЕ успешный. Так что он не входит в $response->isSuccessful(), Когда я бросаю свой $response Переменная перед тем, как он проверит, успешна ли она, показывает это: https://pastebin.com/NKCsxJ7B.

Вы можете видеть, что есть ошибка как это:

[error] => Array
(
[type] => request
[message] => The payment id is invalid
)

Платеж в Молли выглядит так:

введите описание изображения здесь

ОБНОВЛЕНИЕ 3:

В моей функции возврата я попытался проверить состояние объекта ответа следующим образом: $response->status(), Это дало мне следующую ошибку:

Вызов неопределенного метода Omnipay \ Mollie \ Message \ CompletePurchaseResponse :: status ()

Потом я попробовал $response->getStatus() но это ничего мне не вернуло.

10

Решение

Это может быть связано с этим билетом: https://github.com/thephpleague/omnipay-eway/issues/13

Чтобы решить эту проверку, я бы предложил проверить код состояния с помощью

if ($request->status() == 201) {
//successful created
}

Моя теория состоит в том, что это проверяет против 200

Функция определяется здесь:

https://github.com/thephpleague/omnipay-mollie/blob/master/src/Message/AbstractResponse.php

  public function isSuccessful()
{
return !$this->isRedirect() && !isset($this->data['error']);
}

Это, вероятно, потерпит неудачу, потому что вы ожидаете перенаправления!

201 из-за моего теста почтальона ниже
введите описание изображения здесь

2

Другие решения

То, что @Daan сказал в своем комментарии, верно, вы получаете ошибку с целевой страницы, а не со страницы, которая создает транзакцию.

На этой целевой странице у вас будет такой звонок:

$omnipay->completePurchase($data);

В этом @data массив вам нужно включить 'transactionReference' поле, которое должно быть одним из POST параметры, которые ваши http://myurl.dev/e/1/checkout/success?is_payment_successful=‌​1 URL получен.

Вероятно, полезное средство отладки — распечатать код по этому URL-адресу или зарегистрировать весь $_POST массив, и вы можете использовать это, чтобы проверить, какой параметр вам нужно извлечь из этого массива. Это немного меняется между шлюзами.

4

По вопросам рекламы [email protected]