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;
}
}
?> 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
________
посл. ред. 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