This shows you the differences between two versions of the page.
market:jandeks.kassa:dlja_programmista:obrabotchik [06.05.15 в 12:38] Артем Куц создано |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | <?php | ||
- | /** | ||
- | * Яндекс.Деньги | ||
- | */ | ||
- | class Shop_Payment_System_Handler21 extends Shop_Payment_System_Handler | ||
- | { | ||
- | |||
- | /* Способы оплаты */ | ||
- | protected $ym_method_pc = 1; /* электронная валюта Яндекс.Деньги. 1 - используется, 0 - нет */ | ||
- | protected $ym_method_ac = 1; /* банковские карты VISA, MasterCard, Maestro. 1 - используется, 0 - нет */ | ||
- | protected $ym_method_gp = 1; /* Только для юридического лица! Наличными в кассах и терминалах партнеров. 1 - используется, 0 - нет */ | ||
- | protected $ym_method_mc = 1; /* Только для юридического лица! Оплата со счета мобильного телефона. 1 - используется, 0 - нет */ | ||
- | protected $ym_method_wm = 1; /* Только для юридического лица! Электронная валюта WebMoney. 1 - используется, 0 - нет */ | ||
- | protected $ym_method_ab = 1; /* Только для юридического лица! АльфаКлик. 1 - используется, 0 - нет */ | ||
- | public $_rub_currency_id = 1; | ||
- | |||
- | /* режим приема средств */ | ||
- | protected $ym_org_mode = 1; | ||
- | |||
- | /* Идентификатор магазина в системе Яндекс.Деньги. Выдается оператором системы. */ | ||
- | protected $_ShopID = 22087; | ||
- | |||
- | /* Пароль магазина в системе Яндекс.Деньги. Выдается оператором системы. */ | ||
- | protected $_shopPassword = 'termosecret'; | ||
- | |||
- | protected $_yandex_money_uri = 'https://money.yandex.ru/eshop.xml'; | ||
- | |||
- | /* Номер витрины магазина в системе Яндекс.Деньги. Выдается оператором системы. */ | ||
- | protected $_scid = 12055; | ||
- | |||
- | /* Код валюты */ | ||
- | /* | ||
- | Возможные значения: | ||
- | 643 — рубль Российской Федерации; | ||
- | 10643 — тестовая валюта (демо-рублики демо-системы «Яндекс.Деньги») | ||
- | */ | ||
- | protected $_orderSumCurrencyPaycash = 643; | ||
- | |||
- | /* Вызывается на 4-ом шаге оформления заказа*/ | ||
- | public function execute() | ||
- | { | ||
- | parent::execute(); | ||
- | |||
- | $this->printNotification(); | ||
- | |||
- | return $this; | ||
- | } | ||
- | |||
- | /* вычисление суммы товаров заказа */ | ||
- | public function getSumWithCoeff() | ||
- | { | ||
- | return Shop_Controller::instance()->round(($this->_rub_currency_id > 0 | ||
- | && $this->_shopOrder->shop_currency_id > 0 | ||
- | ? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency( | ||
- | $this->_shopOrder->Shop_Currency, | ||
- | Core_Entity::factory('Shop_Currency', $this->_rub_currency_id) | ||
- | ) | ||
- | : 0) * $this->_shopOrder->getAmount() ); | ||
- | } | ||
- | |||
- | protected function _processOrder() | ||
- | { | ||
- | parent::_processOrder(); | ||
- | |||
- | // Установка XSL-шаблонов в соответствии с настройками в узле структуры | ||
- | $this->setXSLs(); | ||
- | |||
- | // Отправка писем клиенту и пользователю | ||
- | $this->send(); | ||
- | |||
- | return $this; | ||
- | } | ||
- | |||
- | /* обработка ответа от платёжной системы */ | ||
- | public function paymentProcessing() | ||
- | { | ||
- | $this->ProcessResult(); | ||
- | return TRUE; | ||
- | } | ||
- | |||
- | /* оплачивает заказ */ | ||
- | function ProcessResult() | ||
- | { | ||
- | $invoiceId = Core_Array::getPost('invoiceId'); | ||
- | |||
- | if ($this->_shopOrder->system_information == '') | ||
- | { | ||
- | $this->_shopOrder->system_information = $invoiceId; | ||
- | $this->_shopOrder->save(); | ||
- | } | ||
- | |||
- | if ($this->_shopOrder->system_information == $invoiceId) | ||
- | { | ||
- | /* проверяем заказ */ | ||
- | $code = $this->_checkOrder($_POST); | ||
- | } | ||
- | else | ||
- | { | ||
- | $code = 1000; | ||
- | } | ||
- | |||
- | $response_params = $_POST; | ||
- | $response['requestDatetime'] = date("c"); | ||
- | |||
- | /* генерируем XML ответа */ | ||
- | $response = $this->_genXMLResponseToYandex($response_params, $code); | ||
- | |||
- | if (Core_Array::getPost('action', '') == 'paymentAviso' && $code == 0) | ||
- | { | ||
- | $oShop_Order = $this->_shopOrder; | ||
- | |||
- | $this->shopOrder($oShop_Order)->shopOrderBeforeAction(clone $oShop_Order); | ||
- | |||
- | $oShop_Order->system_information = "Товар оплачен через Яндекс.Деньги.\n"; | ||
- | $oShop_Order->paid(); | ||
- | $this->setXSLs(); | ||
- | $this->send(); | ||
- | } | ||
- | |||
- | /* даем ответ Яндексу */ | ||
- | echo $response; | ||
- | die(); | ||
- | } | ||
- | |||
- | /* генерация XML-а подтверждений магазина */ | ||
- | protected function _genXMLResponseToYandex($response_params, $code = 1000) | ||
- | { | ||
- | $action = Core_Array::get($response_params, 'action'); | ||
- | $code = intval($code); | ||
- | $current_date_time = Core_Array::get($response_params, 'requestDatetime'); | ||
- | $invoiceId = Core_Array::get($response_params, 'invoiceId'); | ||
- | |||
- | $response = '<?xml version="1.0" encoding="UTF-8"?>'; | ||
- | $response .= '<' . htmlspecialchars($action) . 'Response performedDatetime="'. htmlspecialchars($current_date_time) .'" code="' . $code . '" invoiceId="' . htmlspecialchars($invoiceId) . '" shopId="' . $this->_ShopID . '"/>'; | ||
- | |||
- | return $response; | ||
- | } | ||
- | |||
- | /* печатает форму отправки запроса на сайт платёжной системы */ | ||
- | public function getNotification() | ||
- | { | ||
- | $Sum = $this->getSumWithCoeff(); | ||
- | |||
- | $oSiteUser = Core::moduleIsActive('siteuser') | ||
- | ? Core_Entity::factory('Siteuser')->getCurrent() | ||
- | : NULL; | ||
- | |||
- | ?> | ||
- | <h2>Оплата через систему Яндекс.Деньги</h2> | ||
- | |||
- | <form method="POST" action="<?php echo $this->_yandex_money_uri?>"> | ||
- | <input class="wide" name="scid" value="<?php echo $this->_scid?>" type="hidden"> | ||
- | <input type="hidden" name="ShopID" value="<?php echo $this->_ShopID?>"> | ||
- | <input type="hidden" name="CustomerNumber" value="<?php echo (is_null($oSiteUser) ? 0 : $oSiteUser->id)?>"> | ||
- | <input type="hidden" name="orderNumber" value="<?php echo $this->_shopOrder->id?>"> | ||
- | <input type="hidden" name="orderSumCurrencyPaycash" value="<?php echo $this->_orderSumCurrencyPaycash?>"> | ||
- | |||
- | <br/> | ||
- | <div class="price"> | ||
- | Сумма: | ||
- | |||
- | <?php echo $Sum?> руб. </div> | ||
- | |||
- | <div class="price">Номер заказа: <?php echo $this->_shopOrder->invoice?></div> | ||
- | |||
- | |||
- | <input type="hidden" name="Sum" value="<?php echo $Sum?>" readonly="readonly"> | ||
- | <input type="hidden" name="AccountNumber" value="<?php echo $this->_shopOrder->invoice?>" readonly="readonly"> | ||
- | <div class="price"> | ||
- | Способ оплаты: | ||
- | </div> | ||
- | <select name="paymentType"> | ||
- | <?php if ($this->ym_method_pc){?> | ||
- | <option value="PC">электронная валюта Яндекс.Деньги</option> | ||
- | <?php } ?> | ||
- | <?php if ($this->ym_method_ac){?> | ||
- | <option value="AC">банковские карты VISA, MasterCard, Maestro</option> | ||
- | <?php } ?> | ||
- | <?php if ($this->ym_method_gp && $this->ym_org_mode){?> | ||
- | <option value="GP">наличными в кассах и терминалах партнеров</option> | ||
- | <?php } ?> | ||
- | <?php if ($this->ym_method_mc && $this->ym_org_mode){?> | ||
- | <option value="MC">оплата со счета мобильного телефона</option> | ||
- | <?php } ?> | ||
- | |||
- | <?php if ($this->ym_method_wm && $this->ym_org_mode){?> | ||
- | <option value="WM">электронная валюта WebMoney</option> | ||
- | <?php } ?> | ||
- | </select> | ||
- | <br/><br/> | ||
- | <input type="hidden" name="BuyButton" value="1" /> | ||
- | <button type="submit" id="buy" class="btn btn-warning btn-lg">Оплатить</button> | ||
- | |||
- | |||
- | </form> | ||
- | <?php | ||
- | } | ||
- | |||
- | public function getInvoice() | ||
- | { | ||
- | return $this->getNotification(); | ||
- | } | ||
- | |||
- | /* проверяем заказ */ | ||
- | protected function _checkOrder($order_params) | ||
- | { | ||
- | $site_user_id = $this->_shopOrder->siteuser_id; | ||
- | |||
- | $Sum = $this->getSumWithCoeff(); | ||
- | |||
- | if (isset($order_params['shopId']) && isset($order_params['customerNumber']) | ||
- | && isset($order_params['orderSumAmount']) && isset($order_params['AccountNumber']) | ||
- | && isset($order_params['orderSumCurrencyPaycash']) && isset($order_params['action']) | ||
- | && isset($order_params['orderNumber']) && isset($order_params['orderSumBankPaycash']) | ||
- | && isset($order_params['invoiceId']) | ||
- | ) | ||
- | { | ||
- | if (Core_Array::get($order_params, 'shopId') == $this->_ShopID | ||
- | && Core_Array::get($order_params, 'customerNumber') == $site_user_id | ||
- | && Core_Array::get($order_params, 'orderSumAmount') == $Sum | ||
- | && Core_Array::get($order_params, 'AccountNumber') == $this->_shopOrder->invoice | ||
- | && Core_Array::get($order_params, 'orderSumCurrencyPaycash') == $this->_orderSumCurrencyPaycash | ||
- | ) | ||
- | { | ||
- | $in_str = $order_params['action'] . ";" | ||
- | . sprintf("%.2f", $Sum) . ";" | ||
- | . $this->_orderSumCurrencyPaycash . ";" | ||
- | . $order_params['orderSumBankPaycash'] . ";" | ||
- | . $this->_ShopID . ";" | ||
- | . $order_params['invoiceId'] . ";" | ||
- | . $site_user_id . ";" | ||
- | . $this->_shopPassword; | ||
- | |||
- | $hash = strtoupper(md5($in_str)); | ||
- | |||
- | return intval($hash != $order_params['md5']); | ||
- | } | ||
- | elseif ($order_params['action'] == 'checkOrder') | ||
- | { | ||
- | return 100; | ||
- | } | ||
- | } | ||
- | else | ||
- | { | ||
- | return 200; | ||
- | } | ||
- | |||
- | return 1000; | ||
- | } | ||
- | } |