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; }
}