Я сталкиваюсь с этой проблемой, когда нажимаю кнопку оплаты: экземпляр Moneris Checkout не инициализирован.

Вопрос или проблема

Я пытаюсь интегрировать платежный шлюз Moneris, используя PHP и JSON. Но когда я нажимаю кнопку “Оплатить”, в консоли появляется ошибка; иногда пишется, что moerischeckout не является функцией, а иногда показываются другие ошибки. Я пробовал множество методов, но все еще сталкиваюсь с этой проблемой. Сейчас у меня ошибка “Экземпляр Moneris Checkout не инициализирован”.

Я перепробовал много методов, но всегда возникает ошибка на консоли. Я прикрепил код к своему вопросу, пожалуйста, сообщите, где я допустил ошибку.

Вот мой код,

<?php
require "inc/mpgClasses.php";

// Проверяем, был ли отправлен форма
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Замените своими учетными данными Moneris
    $store_id = 'store5'; // ID магазина для тестирования
    $api_token = 'yesguy'; // Тестовый API токен
    $token = $_POST['token']; // Токен, полученный от Moneris Checkout

    /************************* Транзакционные переменные ****************************/
    $type="purchase";
    $order_id = 'Test' . date("dmy-G:i:s");
    $amount = $_POST['amount']; // Получаем сумму из формы
    $pan = $_POST['cardNumber']; // Номер карты из формы
    $expdate = $_POST['expiryDate']; // Дата истечения из формы
    $crypt="7"; // Тип шифрования (для данных карты)
    $dynamic_descriptor="123"; // Необязательное описание
    $status_check = 'false'; // Для проверки статуса; можно установить в true, если нужно

    /*********************** Ассоциативный массив транзакции **********************/
    $txnArray = array(
        'type' => $type,
        'order_id' => $order_id,
        'amount' => $amount,
        'pan' => $pan,
        'expdate' => $expdate,
        'crypt_type' => $crypt,
    );

    /**************************** Объект транзакции *****************************/
    $mpgTxn = new mpgTransaction($txnArray);

    /****************************** Объект запроса *******************************/
    $mpgRequest = new mpgRequest($mpgTxn);
    $mpgRequest->setProcCountryCode("CA"); // "US" для отправки транзакции в США
    $mpgRequest->setTestMode(true); // Установите в false для производственных транзакций

    /***************************** HTTPS Объект поста *****************************/
    $mpgHttpPost = new mpgHttpsPost($store_id, $api_token, $mpgRequest);

    /******************************* Ответ ************************************/
    $mpgResponse = $mpgHttpPost->getMpgResponse();

    // Обработка ответа
    if ($mpgResponse) {
        echo "<h2>Ответ на платёж:</h2>";
        echo "<p>Тип карты: " . $mpgResponse->getCardType() . "</p>";
        echo "<p>Сумма транзакции: " . $mpgResponse->getTransAmount() . "</p>";
        echo "<p>Номер транзакции: " . $mpgResponse->getTxnNumber() . "</p>";
        echo "<p>ID квитанции: " . $mpgResponse->getReceiptId() . "</p>";
        echo "<p>Тип транзакции: " . $mpgResponse->getTransType() . "</p>";
        echo "<p>Справочный номер: " . $mpgResponse->getReferenceNum() . "</p>";
        echo "<p>Код ответа: " . $mpgResponse->getResponseCode() . "</p>";
        echo "<p>Сообщение: " . $mpgResponse->getMessage() . "</p>";
        echo "<p>Код авторизации: " . $mpgResponse->getAuthCode() . "</p>";
        echo "<p>Завершено: " . $mpgResponse->getComplete() . "</p>";
    } else {
        echo "<p>Ошибка при обработке платежа.</p>";
    }
    // Отправка данных ответа на другой сервер (например, ваш внутренний сервер журналирования)
    $logUrl="https://esqa.moneris.com/gateway2/transaction/payment.json"; // Замените на ваш URL
    $ch = curl_init($logUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
    ]);
    $logResponse = curl_exec($ch);
    curl_close($ch);

    // При необходимости обработайте ответ сервера журналирования
    // echo "Ответ сервера журналирования: " . $logResponse;
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Интеграция платежа Moneris</title>
    <script src="https://gatewayt.moneris.com/chktv2/js/chkt_v2.00.js"></script>
</head>
<body>

<h2>Форма платежа Moneris</h2>
<form id="paymentForm" method="post">
    <label for="amount">Сумма:</label>
    <input type="text" id="amount" name="amount" required><br>

    <label for="cardNumber">Номер карты:</label>
    <input type="text" id="cardNumber" name="cardNumber" required><br>

    <label for="expiryDate">Дата истечения (MMYY):</label>
    <input type="text" id="expiryDate" name="expiryDate" required><br>

    <label for="cvv">CVV:</label>
    <input type="text" id="cvv" name="cvv" required><br>

    <input type="hidden" id="token" name="token">
    <button type="submit">Оплатить</button>
</form>

<script>
    let monerisCheckoutInstance;

    // Инициализация Moneris Checkout при загрузке окна
    window.onload = function () {
        window.onbeforeunload = function (e) 
        {
            const storeId = 'store5'; // ID магазина для тестирования
            const apiKey = 'yesguy'; // Тестовый API ключ

            // Инициализация Moneris Checkout
            monerisCheckoutInstance = monerisCheckout({
                checkoutId: apiKey, // Используйте API ключ в качестве checkoutId
                environment: 'qa', // Установите в 'qa' для тестирования, используйте 'prod' для производства
            });
        };
    };

    // Обработка отправки формы
    document.getElementById('paymentForm').onsubmit = function (e) {
        e.preventDefault();

        if (monerisCheckoutInstance) {
            // Токенизация данных карты
            monerisCheckoutInstance.tokenize({
                card: {
                    pan: document.getElementById('cardNumber').value,
                    expdate: document.getElementById('expiryDate').value,
                    cvv: document.getElementById('cvv').value
                }
            }, function (response) {
                // Обработка ответа токена
                if (response && response.token) {
                    // Установка токена в скрытое поле ввода
                    document.getElementById('token').value = response.token;
                    // Теперь отправьте форму
                    document.getElementById('paymentForm').submit();
                } else {
                    alert('Токенизация не удалась. Пожалуйста, проверьте введенные данные карты.');
                }
            }, function (error) {
                console.error('Ошибка при оформлении заказа:', error);
                alert('Ошибка во время процесса платежа. Пожалуйста, проверьте консоль для получения дополнительной информации.');
            });
        } else {
            console.error('Экземпляр Moneris Checkout не инициализирован.');
        }
    };
</script>

</body>
</html>

Ответ или решение

Решение проблемы с интеграцией Moneris Checkout: "Экземпляр Moneris Checkout не инициализирован"

Введение

Интеграция платёжного шлюза Moneris с использованием PHP и JavaScript может возникнуть с различными проблемами, среди которых одна из распространённых — сообщение об ошибке: "Экземпляр Moneris Checkout не инициализирован". Эта проблема может возникать по различным причинам, включая неправильное использование функции или ошибки в логике инициализации экземпляра. В этом руководстве мы разберёмся с основными моментами вашего кода и выделим шаги для их устранения.

Анализ проблемы

Согласно вашему описанию, ошибка "Moneris Checkout instance not initialized" возникает в тот момент, когда вы пытаетесь использовать экземпляр monerisCheckoutInstance для токенизации платёжных данных. Это может происходить из-за одной из следующих причин:

  1. Неправильная инициализация monerisCheckoutInstance.
  2. Неправильный вызов скрипта инициализации, который может не завершиться успешно.
  3. Проблема с загрузкой скрипта Moneris Checkout.

Конструкция кода

Инициализация Moneris Checkout

Глядя на ваш JavaScript-код, имеются некорректности в момент инициализации:

window.onload = function () {
    window.onbeforeunload = function (e) 
    {
        const storeId = 'store5'; // Test Store ID
        const apiKey = 'yesguy'; // Test API Key

        // Initialize Moneris Checkout
        monerisCheckoutInstance = monerisCheckout({
            checkoutId: apiKey, // Use the API Key as the checkoutId
            environment: 'qa', // Set to 'qa' for testing, use 'prod' for production
        });
    };
};

Здесь вы устанавливаете инициализацию monerisCheckoutInstance внутри window.onbeforeunload, что не является корректным подходом. Вместо этого, инициализацию следует вынести в window.onload, чтобы обеспечить правильное выполнение кода.

Рекомендуемая правка

Исправьте часть вашего кода, касающуюся инициализации monerisCheckoutInstance, следующим образом:

window.onload = function () {
    const storeId = 'store5'; // Test Store ID
    const apiKey = 'yesguy'; // Test API Key

    // Initialize Moneris Checkout
    monerisCheckoutInstance = monerisCheckout({
        checkoutId: apiKey, // Use the API Key as the checkoutId
        environment: 'qa', // Set to 'qa' for testing, use 'prod' for production
    });
};

Таким образом, monerisCheckoutInstance будет инициализирован при загрузке страницы, а не при уходе со страницы.

Проверка консоли браузера

Также важно проверить, загружается ли скрипт Moneris Checkout без ошибок. Сопроводите ваш код проверками на наличие ошибок в консоли. Вам следует убедиться, что ссылка на скрипт корректна и доступна:

<script src="https://gatewayt.moneris.com/chktv2/js/chkt_v2.00.js"></script>

Если возникают ошибки сети или другие проблемы, это может объяснять, почему ваше приложение не может выполнить инициализацию.

Заключение

Обратите внимание на исправления, предложенные в данном руководстве. Потенциальная проблема с инициализацией экземпляра Moneris Checkout чаще всего связана либо с некорректной логикой выполнения JavaScript-кода, либо с ошибками в загрузке сторонних скриптов. Исправление структуры кода, а также выполнение дополнительной проверки логов и консоли помогут разрешить возникшие трудности.

Если, после исправления, проблема останется нерешенной, обязательно выполните отладку, используя инструменты разработчика, чтобы глубже проанализировать, где возникает ошибка и чего не хватает в выполнении кода.

Оцените материал
Добавить комментарий

Капча загружается...