This is an old revision of the document!
<?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/>
Сумма: <?php echo $Sum?> руб. </div>
Номер заказа: <?php echo $this→_shopOrder→invoice?>
<input type="hidden" name="Sum" value="<?php echo $Sum?>" readonly="readonly"> <input type="hidden" name="AccountNumber" value="<?php echo $this→_shopOrder→invoice?>" readonly="readonly">
Способ оплаты:
<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; }
}