Я работаю с системой билетов с открытым исходным кодом под названием Attendize.
У них уже есть поставщик платежей Stripe. Теперь я пытаюсь выполнить эту работу с поставщиком платежей 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 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
, я получаю ошибку.
UPDATE:
В моей функции возврата у меня есть следующий код:
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
)
Оплата в Mollie выглядит следующим образом:
ОБНОВЛЕНИЕ 3:
В моей функции возврата я попытался проверить статус объекта ответа следующим образом: $response->status()
. Это дало мне следующую ошибку:
Вызов метода undefined Omnipay\Mollie\Message\CompletePurchaseResponse:: status()
Затем я попробовал $response->getStatus()
, но это ничего мне не дало.