PHP, MySQL | wmz платежи
Кто принимает WMZ на сайте? можете скинуть пример обработчика и конфига. спасибо
уважаемые дайте пример кода. у кого то же он есть
Few people use WebMoney now. Look for the code in the scripts from the download center
config.php payment_form.php
php
<?php // config.php - Конфигурация мерчанта define('WMZ_PURSE', 'Z123456789012'); // Ваш WMZ кошелек define('WMZ_SECRET_KEY', 'your_secret_key_here'); // Секретный ключ define('WMZ_TEST_MODE', true); // true - тестовый режим // Настройки базы данных (пример) define('DB_HOST', 'localhost'); define('DB_NAME', 'shop_db'); define('DB_USER', 'root'); define('DB_PASS', ''); // Функция для логирования function writeLog($message) { $logFile = __DIR__ . '/wm_payments.log'; $timestamp = date('Y-m-d H:i:s'); file_put_contents($logFile, "[{$timestamp}] {$message}\n", FILE_APPEND); } // Функция подключения к БД function getDB() { try { $pdo = new PDO( "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8", DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); return $pdo; } catch (PDOException $e) { writeLog("DB Error: " . $e->getMessage()); return null; } } ?> php
<?php require_once 'config.php'; // Создаем тестовый заказ $order_id = time(); // Уникальный номер заказа $amount = 10.50; // Сумма к оплате $desc = "Оплата товара №{$order_id}"; // Сохраняем заказ в БД $pdo = getDB(); if ($pdo) { $stmt = $pdo->prepare("INSERT INTO orders (order_id, amount, status, created_at) VALUES (?, ?, 'pending', NOW())"); $stmt->execute([$order_id, $amount]); } ?> <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Оплата через WebMoney</title> <style> body { font-family: Arial; max-width: 600px; margin: 50px auto; padding: 20px; } .payment-card { background: #f5f5f5; padding: 30px; border-radius: 10px; } button { background: #007bff; color: white; padding: 12px 30px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; } button:hover { background: #0056b3; } </style> </head> <body> <div class="payment-card"> <h2>Оплата через WebMoney WMZ</h2> <p>Заказ №: <strong><?php echo $order_id; ?></strong></p> <p>Сумма: <strong><?php echo $amount; ?> USD</strong></p> <p>Кошелек: <?php echo WMZ_PURSE; ?></p> <form action="https://merchant.webmoney.ru/lmi/payment.asp" method="POST"> <input type="hidden" name="LMI_PAYEE_PURSE" value="<?php echo WMZ_PURSE; ?>"> <input type="hidden" name="LMI_PAYMENT_AMOUNT" value="<?php echo $amount; ?>"> <input type="hidden" name="LMI_PAYMENT_NO" value="<?php echo $order_id; ?>"> <input type="hidden" name="LMI_PAYMENT_DESC" value="<?php echo $desc; ?>"> <input type="hidden" name="LMI_SIM_MODE" value="<?php echo WMZ_TEST_MODE ? '1' : '0'; ?>"> <input type="hidden" name="LMI_RESULT_URL" value="https://your-site.com/wm_result.php"> <input type="hidden" name="LMI_SUCCESS_URL" value="https://your-site.com/wm_success.php"> <input type="hidden" name="LMI_FAIL_URL" value="https://your-site.com/wm_fail.php"> <button type="submit">Оплатить через WebMoney</button> </form> </div> </body> </html>
wm_result.php
________
посл. ред. 21.04.2026 в 16:48; всего 4 раз(а); by DenSBK
php
<?php // wm_result.php - Обработка уведомлений от WebMoney require_once 'config.php'; writeLog("=== Новый запрос от WebMoney ==="); writeLog("POST: " . print_r($_POST, true)); // Функция проверки подписи (SHA256) function checkWMPSignature($data, $secretKey) { $crc_str = $secretKey; // Параметры в алфавитном порядке $params = [ 'LMI_PAYEE_PURSE', 'LMI_PAYMENT_AMOUNT', 'LMI_PAYMENT_NO', 'LMI_MODE', 'LMI_SYS_INVS_NO', 'LMI_SYS_TRANS_NO', 'LMI_SYS_TRANS_DATE', 'LMI_PAYER_PURSE', 'LMI_PAYER_WM' ]; foreach ($params as $param) { if (isset($data[$param])) { $crc_str .= $data[$param]; } } $hash = strtoupper(hash('sha256', $crc_str)); $received_hash = strtoupper($data['LMI_HASH'] ?? ''); return $hash === $received_hash; } // Получаем данные $request = $_POST; // 1. Проверяем наличие обязательных полей $required_fields = ['LMI_PAYEE_PURSE', 'LMI_PAYMENT_AMOUNT', 'LMI_PAYMENT_NO', 'LMI_HASH']; foreach ($required_fields as $field) { if (!isset($request[$field])) { writeLog("ERROR: Missing field - {$field}"); exit('ERROR: Missing parameters'); } } // 2. Проверяем подпись if (!checkWMPSignature($request, WMZ_SECRET_KEY)) { writeLog("ERROR: Invalid signature! Received: {$request['LMI_HASH']}"); writeLog("Expected: " . strtoupper(hash('sha256', WMZ_SECRET_KEY . $request['LMI_PAYEE_PURSE'] . $request['LMI_PAYMENT_AMOUNT'] . $request['LMI_PAYMENT_NO'] . ($request['LMI_MODE'] ?? '') . ($request['LMI_SYS_INVS_NO'] ?? '') . ($request['LMI_SYS_TRANS_NO'] ?? '') . ($request['LMI_SYS_TRANS_DATE'] ?? '') . ($request['LMI_PAYER_PURSE'] ?? '') . ($request['LMI_PAYER_WM'] ?? '')))); exit('ERROR: Invalid signature'); } writeLog("✓ Signature valid"); // 3. Проверяем получателя if ($request['LMI_PAYEE_PURSE'] !== WMZ_PURSE) { writeLog("ERROR: Wrong purse - {$request['LMI_PAYEE_PURSE']}"); exit('ERROR: Wrong purse'); } // 4. Обрабатываем предварительный запрос if (isset($request['LMI_PREREQUEST']) && $request['LMI_PREREQUEST'] == 1) { writeLog("Pre-request for order #{$request['LMI_PAYMENT_NO']}"); $pdo = getDB(); if ($pdo) { // Проверяем существование заказа $stmt = $pdo->prepare("SELECT * FROM orders WHERE order_id = ? AND status = 'pending'"); $stmt->execute([$request['LMI_PAYMENT_NO']]); $order = $stmt->fetch(); if ($order && floatval($order['amount']) == floatval($request['LMI_PAYMENT_AMOUNT'])) { writeLog("Pre-request: OK"); echo 'YES'; } else { writeLog("Pre-request: FAILED - Order not found or amount mismatch"); echo 'NO'; } } else { echo 'YES'; // Если БД недоступна, лучше ответить YES } exit(); } // 5. Финальный запрос - деньги получены writeLog("=== Payment confirmed! ==="); $order_id = $request['LMI_PAYMENT_NO']; $amount = $request['LMI_PAYMENT_AMOUNT']; $sys_trans_no = $request['LMI_SYS_TRANS_NO']; $sys_invs_no = $request['LMI_SYS_INVS_NO']; $payer_purse = $request['LMI_PAYER_PURSE'] ?? 'unknown'; $trans_date = $request['LMI_SYS_TRANS_DATE'] ?? date('Y-m-d H:i:s'); $pdo = getDB(); if ($pdo) { try { // Проверяем, не обработан ли уже этот платеж $stmt = $pdo->prepare("SELECT * FROM orders WHERE order_id = ? AND (status = 'paid' OR transaction_id = ?)"); $stmt->execute([$order_id, $sys_trans_no]); $existing = $stmt->fetch(); if ($existing) { writeLog("WARNING: Order #{$order_id} already paid! Transaction: {$sys_trans_no}"); echo 'YES'; exit(); } // Обновляем статус заказа $stmt = $pdo->prepare("UPDATE orders SET status = 'paid', transaction_id = ?, payer_purse = ?, paid_at = NOW() WHERE order_id = ?"); $stmt->execute([$sys_trans_no, $payer_purse, $order_id]); // Сохраняем детали платежа $stmt = $pdo->prepare("INSERT INTO payments (order_id, sys_invs_no, sys_trans_no, amount, payer_purse, trans_date) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$order_id, $sys_invs_no, $sys_trans_no, $amount, $payer_purse, $trans_date]); writeLog("✓ Order #{$order_id} successfully paid! Amount: {$amount} WMZ, Transaction: {$sys_trans_no}"); // Здесь можно отправить письмо клиенту или выполнить дополнительные действия // mail($customer_email, "Оплата получена", "Ваш заказ #{$order_id} оплачен"); } catch (PDOException $e) { writeLog("DB Error: " . $e->getMessage()); } } // Всегда отвечаем YES, чтобы WebMoney не повторял запрос echo 'YES'; ?> ________
посл. ред. 21.04.2026 в 16:48; всего 4 раз(а); by DenSBK
Страница успешной оплаты (wm_success.php)
php
<?php // wm_success.php - Страница успешной оплаты if (!isset($_GET['LMI_PAYMENT_NO'])) { header('Location: /'); exit(); } $order_id = $_GET['LMI_PAYMENT_NO']; ?> <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Оплата успешна</title> <style> body { font-family: Arial; text-align: center; padding: 50px; } .success { color: green; font-size: 24px; margin-bottom: 20px; } .order { font-size: 18px; margin: 20px 0; } </style> </head> <body> <div class="success">✓ Оплата успешно произведена!</div> <div class="order">Заказ №: <?php echo htmlspecialchars($order_id); ?></div> <p>Вы будете перенаправлены через 5 секунд...</p> <p><a href="/">Вернуться на главную</a></p> <script> setTimeout(function() { window.location.href = '/'; }, 5000); </script> </body> </html>
SQL схема для базы данных
sql
-- Создание таблиц CREATE DATABASE IF NOT EXISTS shop_db; USE shop_db; -- Таблица заказов CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, order_id VARCHAR(50) UNIQUE NOT NULL, amount DECIMAL(10,2) NOT NULL, status ENUM('pending', 'paid', 'cancelled') DEFAULT 'pending', transaction_id VARCHAR(50) NULL, payer_purse VARCHAR(50) NULL, created_at DATETIME NOT NULL, paid_at DATETIME NULL, INDEX idx_order_id (order_id), INDEX idx_status (status) ); -- Таблица платежей CREATE TABLE payments ( id INT AUTO_INCREMENT PRIMARY KEY, order_id VARCHAR(50) NOT NULL, sys_invs_no VARCHAR(50) NOT NULL, sys_trans_no VARCHAR(50) NOT NULL, amount DECIMAL(10,2) NOT NULL, payer_purse VARCHAR(50), trans_date DATETIME, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY unique_transaction (sys_trans_no), FOREIGN KEY (order_id) REFERENCES orders(order_id) );
Настройка в WebMoney Merchant
Зайдите на https://merchant.webmoney.ru
Выберите кошелек Z (WMZ)
Установите настройки:
Result URL: https://your-site.com/wm_result.php
Success URL: https://your-site.com/wm_success.php
Fail URL: https://your-site.com/wm_fail.php
Secret Key: Сгенерируйте и сохраните (вставьте в WMZ_SECRET_KEY)
Сначала работайте в тестовом режиме (WMZ_TEST_MODE = true)
После отладки переключитесь на боевой режим в настройках мерчанта
🔍 Отладка
Все запросы логируются в файл wm_payments.log. Проверяйте его при возникновении проблем
Важные моменты
Проверка подписи - обязательна для безопасности
Идемпотентность - проверяйте, не обработан ли уже платеж
Логирование - пишите все запросы для отладки
HTTPS - используйте на боевом сервере
Тестовый режим - сначала тестируйте с LMI_SIM_MODE=1
Этот код готов к использованию после замены плейсхолдеров на ваши реальные данные и настройки сервера.
Это выдал депсек за 10 сек))
________
посл. ред. 21.04.2026 в 16:50; всего 1 раз(а); by DenSBK
Зайдите на https://merchant.webmoney.ru
Выберите кошелек Z (WMZ)
Установите настройки:
Result URL: https://your-site.com/wm_result.php
Success URL: https://your-site.com/wm_success.php
Fail URL: https://your-site.com/wm_fail.php
Secret Key: Сгенерируйте и сохраните (вставьте в WMZ_SECRET_KEY)
Сначала работайте в тестовом режиме (WMZ_TEST_MODE = true)
После отладки переключитесь на боевой режим в настройках мерчанта
🔍 Отладка
Все запросы логируются в файл wm_payments.log. Проверяйте его при возникновении проблем
Важные моменты
Проверка подписи - обязательна для безопасности
Идемпотентность - проверяйте, не обработан ли уже платеж
Логирование - пишите все запросы для отладки
HTTPS - используйте на боевом сервере
Тестовый режим - сначала тестируйте с LMI_SIM_MODE=1
Этот код готов к использованию после замены плейсхолдеров на ваши реальные данные и настройки сервера.
Это выдал депсек за 10 сек))
________
посл. ред. 21.04.2026 в 16:50; всего 1 раз(а); by DenSBK
Быстрее и практичней)
________
посл. ред. 21.04.2026 в 16:54; всего 1 раз(а); by DenSBK
Стр.: 1, 2