Loading...
PHP, MySQL | wmz платежи
Кто принимает WMZ на сайте? можете скинуть пример обработчика и конфига. спасибо
уважаемые дайте пример кода. у кого то же он есть
Few people use WebMoney now. Look for the code in the scripts from the download center
config.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;     } } ?>   
payment_form.php
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
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
DenSBK , здаров бро . ты когда прислал мне это все я подумал ты меня взломал , не понял сначала 😂 . а за код спасибо большое
timeadv_ru , в общем проще спросить ИИ в наше время чем на форуме)
Быстрее и практичней)
________
посл. ред. 21.04.2026 в 16:54; всего 1 раз(а); by DenSBK
Онлайн: 4
Время:
Gen. 0.0966
(c) Bym.Guru 2010-2026