201 lines
9.2 KiB
PHP
201 lines
9.2 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Simpla CMS
|
||
*
|
||
* @copyright 2011 Denis Pikusov
|
||
* @link http://simplacms.ru
|
||
* @author Denis Pikusov
|
||
*
|
||
* К этому скрипту обращается webmoney в процессе оплаты
|
||
*
|
||
*/
|
||
|
||
// Работаем в корневой директории
|
||
chdir ('../../');
|
||
require_once('api/Simpla.php');
|
||
|
||
$simpla = new Simpla();
|
||
|
||
// Это предварительный запрос?
|
||
if(isset($_POST['LMI_PREREQUEST']) && $_POST['LMI_PREREQUEST']==1)
|
||
{
|
||
$pre_request = 1;
|
||
}
|
||
else
|
||
{
|
||
$pre_request = 0;
|
||
}
|
||
|
||
// Кошелек продавца
|
||
// Кошелек продавца, на который покупатель совершил платеж. Формат - буква и 12 цифр.
|
||
$merchant_purse = $_POST['LMI_PAYEE_PURSE'];
|
||
|
||
// Сумма платежа
|
||
// Сумма, которую заплатил покупатель. Дробная часть отделяется точкой.
|
||
$amount = $_POST['LMI_PAYMENT_AMOUNT'];
|
||
|
||
// Внутренний номер покупки продавца
|
||
// В этом поле передается id заказа в нашем магазине.
|
||
$order_id = $_POST['LMI_PAYMENT_NO'];
|
||
|
||
// Флаг тестового режима
|
||
// Указывает, в каком режиме выполнялась обработка запроса на платеж. Может принимать два значения:
|
||
// 0: Платеж выполнялся в реальном режиме, средства переведены с кошелька покупателя на кошелек продавца;
|
||
// 1: Платеж выполнялся в тестовом режиме, средства реально не переводились.
|
||
$test_mode = $_POST['LMI_MODE'];
|
||
|
||
// Внутренний номер счета в системе WebMoney Transfer
|
||
// Номер счета в системе WebMoney Transfer, выставленный покупателю от имени продавца
|
||
// в процессе обработки запроса на выполнение платежа сервисом Web Merchant Interface.
|
||
// Является уникальным в системе WebMoney Transfer.
|
||
$wm_order_id = $_POST['LMI_SYS_INVS_NO'];
|
||
|
||
// Внутренний номер платежа в системе WebMoney Transfer
|
||
// Номер платежа в системе WebMoney Transfer, выполненный в процессе обработки запроса
|
||
// на выполнение платежа сервисом Web Merchant Interface.
|
||
// Является уникальным в системе WebMoney Transfer.
|
||
$wm_transaction_id = $_POST['LMI_SYS_TRANS_NO'];
|
||
|
||
// Кошелек покупателя
|
||
// Кошелек, с которого покупатель совершил платеж.
|
||
$payer_purse = $_POST['LMI_PAYER_PURSE'];
|
||
|
||
// WMId покупателя
|
||
// WM-идентификатор покупателя, совершившего платеж.
|
||
$payer_wmid = $_POST['LMI_PAYER_WM'];
|
||
|
||
// Номер ВМ-карты (электронного чека)
|
||
// Номер чека Paymer.com или номер ВМ-карты, присутствует только в случае,
|
||
// если покупатель производит оплату чеком Пеймер или ВМ-картой.
|
||
$paymer_number = $_POST['LMI_PAYMER_NUMBER'];
|
||
|
||
|
||
// Paymer.com e-mail покупателя
|
||
// Email указанный покупателем, присутствует только в случае,
|
||
// если покупатель производит оплату чеком Paymer.com или ВМ-картой.
|
||
$paymer_email = $_POST['LMI_PAYMER_EMAIL'];
|
||
|
||
// Номер телефона покупателя
|
||
// Номер телефона покупателя, присутствует только в случае,
|
||
// если покупатель производит оплату с телефона в Keeper Mobile.
|
||
$mobile_keeper_phone = $_POST['LMI_TELEPAT_PHONENUMBER'];
|
||
|
||
// Номер платежа в Keeper Mobile
|
||
// Номер платежа в Keeper Mobile, присутствует только в случае,
|
||
// если покупатель производит оплату с телефона в Keeper Mobile.
|
||
$mobile_keeper_order_id = $_POST['LMI_TELEPAT_ORDERID'];
|
||
|
||
// Срок кредитования LMI_PAYMENT_CREDITDAY
|
||
// В случае если покупатель платит с своего кошелька типа C на кошелек продавца типа D
|
||
// (вариант продажи продавцом своих товаров или услуг в кредит), в данном параметре указывается срок кредитования в днях.
|
||
// Настоятельно рекомендуем обязательно проверять сооветствие данного параметра
|
||
// в форме оповещения о платеже значению параметра в форме запроса платежа.
|
||
$credit_days = $_POST['LMI_PAYMENT_CREDITDAYS'];
|
||
|
||
// Контрольная подпись
|
||
$hash = $_POST['LMI_HASH'];
|
||
|
||
// Дата и время выполнения платежа
|
||
// Дата и время реального прохождения платежа в системе WebMoney Transfer в формате "YYYYMMDD HH:MM:SS"
|
||
$date = $_POST['LMI_SYS_TRANS_DATE'];
|
||
|
||
|
||
// Метод оплаты
|
||
$payment_method_id = $_POST['PAYMENT_METHOD_ID'];
|
||
|
||
|
||
////////////////////////////////////////////////
|
||
// Выберем заказ из базы
|
||
////////////////////////////////////////////////
|
||
$order = $simpla->orders->get_order(intval($order_id));
|
||
if(empty($order))
|
||
die('Оплачиваемый заказ не найден');
|
||
|
||
// Нельзя оплатить уже оплаченный заказ
|
||
if($order->paid)
|
||
die('Этот заказ уже оплачен');
|
||
|
||
////////////////////////////////////////////////
|
||
// Выбираем из базы соответствующий метод оплаты
|
||
////////////////////////////////////////////////
|
||
$method = $simpla->payment->get_payment_method(intval($order->payment_method_id));
|
||
if(empty($method))
|
||
die("Неизвестный метод оплаты");
|
||
|
||
$settings = unserialize($method->settings);
|
||
|
||
|
||
////////////////////////////////////
|
||
// Проверка контрольной подписи (только для оповещения об успешной оплате, не для pre_request)
|
||
////////////////////////////////////
|
||
// Контрольная подпись данных о платеже позволяет продавцу проверять как источник данных,
|
||
// так и целостность данных, переданных на Result URL через "Форму оповещения о платеже".
|
||
// При формировании контрольной подписи сервис Web Merchant Interface "склеивает" значения полей,
|
||
// передаваемых "Формой оповещения о платеже"
|
||
if($pre_request != 1)
|
||
{
|
||
$str = $merchant_purse.$amount.$order_id.$test_mode.$wm_order_id.$wm_transaction_id.$date.$settings['secret_key'].$payer_purse.$payer_wmid;
|
||
$md5 = strtoupper(md5($str));
|
||
if($md5 !== $hash)
|
||
{
|
||
die("Контрольная подпись не верна");
|
||
}
|
||
}
|
||
|
||
////////////////////////////////////
|
||
// Проверка суммы платежа
|
||
////////////////////////////////////
|
||
|
||
// Первые буквы кошельков
|
||
$merchant_purse_first_letter = strtoupper($merchant_purse[0]);
|
||
$payer_purse_first_letter = strtoupper($payer_purse[0]);
|
||
|
||
// Если первые буквы кошельков не совпадают - ошибка
|
||
if(($first_purse_letter = $merchant_purse_first_letter) != $payer_purse_first_letter)
|
||
die("Типы кошельков продавца и покупателя не совпадают");
|
||
|
||
// Сумма заказа у нас в магазине
|
||
$order_amount = $simpla->money->convert($order->total_price, $method->currency_id, false);
|
||
|
||
// Должна быть равна переданной сумме
|
||
if($order_amount != $amount || $amount<=0)
|
||
die("Неверная сумма оплаты");
|
||
|
||
////////////////////////////////////
|
||
// Проверка кошелька продавца
|
||
////////////////////////////////////
|
||
if($merchant_purse != $settings['purse'])
|
||
die("Неверный кошелек продавца");
|
||
|
||
////////////////////////////////////
|
||
// Проверка наличия товара
|
||
////////////////////////////////////
|
||
$purchases = $simpla->orders->get_purchases(array('order_id'=>intval($order->id)));
|
||
foreach($purchases as $purchase)
|
||
{
|
||
$variant = $simpla->variants->get_variant(intval($purchase->variant_id));
|
||
if(empty($variant) || (!$variant->infinity && $variant->stock < $purchase->amount))
|
||
{
|
||
die("Нехватка товара $purchase->product_name $purchase->variant_name");
|
||
}
|
||
}
|
||
|
||
// Запишем
|
||
if(!$pre_request)
|
||
{
|
||
// Установим статус оплачен
|
||
$simpla->orders->update_order(intval($order->id), array('paid'=>1));
|
||
|
||
// Спишем товары
|
||
$simpla->orders->close(intval($order->id));
|
||
}
|
||
|
||
if(!$pre_request)
|
||
{
|
||
$simpla->notify->email_order_user(intval($order->id));
|
||
$simpla->notify->email_order_admin(intval($order->id));
|
||
}
|
||
|
||
die("Yes");
|