Вопрос или проблема
Я пытаюсь интегрировать платежный шлюз 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
для токенизации платёжных данных. Это может происходить из-за одной из следующих причин:
- Неправильная инициализация
monerisCheckoutInstance
. - Неправильный вызов скрипта инициализации, который может не завершиться успешно.
- Проблема с загрузкой скрипта 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-кода, либо с ошибками в загрузке сторонних скриптов. Исправление структуры кода, а также выполнение дополнительной проверки логов и консоли помогут разрешить возникшие трудности.
Если, после исправления, проблема останется нерешенной, обязательно выполните отладку, используя инструменты разработчика, чтобы глубже проанализировать, где возникает ошибка и чего не хватает в выполнении кода.