Laravel Омнипей - Параметр transactionReference является обязательным


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

У них уже интегрирован поставщик платежей Stripe . Теперь я пытаюсь заставить это работать с поставщиком платежей Молли.

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

enter image description here

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

$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 )

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

enter image description here

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

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

Вызов неопределенного метода Omnipay\Молли\Сообщение\Полный ответ на запрос::статус()

Затем я попытался $response->getStatus(), но это ничего не дало мне взамен.

Author: nielsv, 2017-05-24

2 answers

Это может иметь какое-то отношение к этому билету: 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 из-за моего теста почтальона ниже enter image description here

 2
Author: Thomas Moors, 2017-07-11 07:39:35

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

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

$omnipay->completePurchase($data);

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

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

 4
Author: delatbabel, 2017-05-28 06:20:30