forked from Mcross82/yandex-money-cms-hostcms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandlerXX.php
315 lines (268 loc) · 13.2 KB
/
handlerXX.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
<?php
/**
* Яндекс.Деньги
* Версия 1.1.0
*/
class Shop_Payment_System_HandlerXX extends Shop_Payment_System_Handler
{
/* Тестовый или полный режим функциональности. */
protected $ym_test_mode = 1; // 1 - тестовый, 0 - полный
/* режим приема средств */
protected $ym_org_mode = 0; // 1 - На расчетный счет организации с заключением договора с Яндекс.Деньгами (юр.лицо), 0 - На счет физического лица в электронной валюте Яндекс.Денег'
/* Только для физического лица! Идентификатор магазина в системе Яндекс.Деньги. Выдается оператором системы. */
protected $ym_account = '410011680044609';
/* Пароль магазина в системе Яндекс.Деньги. Выдается оператором системы. */
protected $ym_password = 'mEG2ninQcEOc8xTbHy5ApQOf';
/* Способы оплаты */
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 - нет */
protected $ym_method_sb = 1; /* Только для юридического лица! Сбербанк Онлайн. 1 - используется, 0 - нет */
protected $ym_method_ma = 1; /* Только для юридического лица! MasterPass. 1 - используется, 0 - нет */
protected $ym_method_pb = 1; /* Только для юридического лица! Интернет-банк Промсвязьбанка. 1 - используется, 0 - нет */
/* Только для юридического лица! Идентификатор вашего магазина в Яндекс.Деньгах (ShopID) */
protected $ym_shopid = 101;
/* Только для юридического лица! Идентификатор витрины вашего магазина в Яндекс.Деньгах (scid) */
protected $ym_scid = 51642;
// id валюты, в которой будет производиться рассчет суммы
protected $ym_currency_id = 1; // 1 - рубли (RUR), 2 - евро (EUR), 3 - доллары (USD)
/* Код валюты, в которой будет производиться оплата в Яндекс-Деньги */
protected $ym_orderSumCurrencyPaycash = 643; /* Возможные значения: 643 — рубль Российской Федерации; 10643 — тестовая валюта (демо-рублики демо-системы «Яндекс.Деньги») */
/* Вызывается на 4-ом шаге оформления заказа*/
public function execute()
{
parent::execute();
$this->printNotification();
return $this;
}
/* вычисление суммы товаров заказа */
public function getSumWithCoeff()
{
return Shop_Controller::instance()->round(($this->ym_currency_id > 0
&& $this->_shopOrder->shop_currency_id > 0
? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
$this->_shopOrder->Shop_Currency,
Core_Entity::factory('Shop_Currency', $this->ym_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;
}
public function checkSign($callbackParams){
$string = $callbackParams['action'].';'.$callbackParams['orderSumAmount'].';'.$callbackParams['orderSumCurrencyPaycash'].';'.$callbackParams['orderSumBankPaycash'].';'.$callbackParams['shopId'].';'.$callbackParams['invoiceId'].';'.$callbackParams['customerNumber'].';'.$this->ym_password;
$md5 = strtoupper(md5($string));
//var_dump($string, $md5, $callbackParams);
return ($callbackParams['md5']==$md5);
}
public function sendAviso($callbackParams, $code){
header("Content-type: text/xml; charset=utf-8");
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<paymentAvisoResponse performedDatetime="'.date("c").'" code="'.$code.'" invoiceId="'.$callbackParams['invoiceId'].'" shopId="'.$this->ym_shopid.'"/>';
echo $xml;
}
public function sendCode($callbackParams, $code){
header("Content-type: text/xml; charset=utf-8");
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<checkOrderResponse performedDatetime="'.date("c").'" code="'.$code.'" invoiceId="'.$callbackParams['invoiceId'].'" shopId="'.$this->ym_shopid.'"/>';
echo $xml;
}
public function checkOrder($callbackParams, $sendCode=FALSE, $aviso=FALSE){
if ($this->checkSign($callbackParams)){
$code = 0;
}else{
$code = 1;
}
if ($sendCode){
if ($aviso){
$this->sendAviso($callbackParams, $code);
}else{
$this->sendCode($callbackParams, $code);
}
exit;
}else{
return $code;
}
}
public function individualCheck($callbackParams){
$string = $callbackParams['notification_type'].'&'.$callbackParams['operation_id'].'&'.$callbackParams['amount'].'&'.$callbackParams['currency'].'&'.$callbackParams['datetime'].'&'.$callbackParams['sender'].'&'.$callbackParams['codepro'].'&'.$this->ym_password.'&'.$callbackParams['label'];
$check = (sha1($string) == $callbackParams['sha1_hash']);
if (!$check){
header('HTTP/1.0 401 Unauthorized');
return false;
}
return true;
}
/* оплачивает заказ */
function ProcessResult()
{
$callbackParams = $_POST;
$order_id = false;
if ($this->ym_org_mode){
if ($callbackParams['action'] == 'checkOrder'){
$code = $this->checkOrder($callbackParams);
$this->sendCode($callbackParams, $code);
$order_id = (int)$callbackParams["orderNumber"];
}
if ($callbackParams['action'] == 'paymentAviso'){
$this->checkOrder($callbackParams, TRUE, TRUE);
}
}else{
$check = $this->individualCheck($callbackParams);
if (!$check){
exit;
}else{
$order_id = (int)$callbackParams["label"];
}
}
if ($order_id > 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();
}
die();
}
/* печатает форму отправки запроса на сайт платёжной системы */
public function getNotification()
{
$Sum = $this->getSumWithCoeff();
$oSiteUser = Core::moduleIsActive('siteuser')
? Core_Entity::factory('Siteuser')->getCurrent()
: NULL;
$oSite_Alias = $this->_shopOrder->Shop->Site->getCurrentAlias();
$site_alias = !is_null($oSite_Alias) ? $oSite_Alias->name : '';
$shop_path = $this->_shopOrder->Shop->Structure->getPath();
$handler_url = 'http://'.$site_alias.$shop_path . "cart/?order_id={$this->_shopOrder->id}";
$successUrl = $handler_url . "&payment=success";
$failUrl = $handler_url . "&payment=fail";
?>
<h2>Оплата через систему Яндекс.Деньги</h2>
<form method="POST" action="<?php echo $this->getFormUrl(); ?>">
<?php if ($this->ym_org_mode){ ?>
<input class="wide" name="scid" value="<?php echo $this->ym_scid; ?>" type="hidden">
<input type="hidden" name="ShopID" value="<?php echo $this->ym_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="shopSuccessURL" value="<?php echo $successUrl; ?>">
<input type="hidden" name="shopFailURL" value="<?php echo $failUrl; ?>">
<input type="hidden" name="cms_name" value="hostcms">
<?php }else {?>
<input type="hidden" name="receiver" value="<?php echo $this->ym_account; ?>">
<input type="hidden" name="formcomment" value="<?php echo $site_alias;?>">
<input type="hidden" name="short-dest" value="<?php echo $site_alias;?>">
<input type="hidden" name="writable-targets" value="false">
<input type="hidden" name="comment-needed" value="true">
<input type="hidden" name="label" value="<?php echo $this->_shopOrder->id;?>">
<input type="hidden" name="quickpay-form" value="shop">
<input type="hidden" name="targets" value="Заказ <?php echo $this->_shopOrder->id;?>">
<input type="hidden" name="sum" value="<?php echo $Sum;?>" data-type="number" >
<input type="hidden" name="comment" value="<?php echo $this->_shopOrder->description;?>" >
<input type="hidden" name="need-fio" value="true">
<input type="hidden" name="need-email" value="true" >
<input type="hidden" name="need-phone" value="false">
<input type="hidden" name="need-address" value="false">
<?php } ?>
<style>
.ym_table tr td{
padding: 10px;
}
.ym_table td{
padding: 10px;
}
</style>
<table class="ym_table" border = "1" cellspacing = "20" width = "80%" bgcolor = "#FFFFFF" align = "center" bordercolor = "#000000">
<tr>
<td>Сумма, руб.</td>
<td> <input type="text" name="Sum" value="<?php echo $Sum?>" readonly="readonly"> </td>
</tr>
<tr>
<td>Способ оплаты</td>
<td>
<?php if ($this->ym_org_mode){?>
<select name="paymentType">
<?php }else {?>
<select name="payment-type">
<?php } ?>
<?php if ($this->ym_method_pc){?>
<option value="PC">Оплата из кошелька в Яндекс.Деньгах</option>
<?php } ?>
<?php if ($this->ym_method_ac){?>
<option value="AC">Оплата с произвольной банковской карты</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_ab && $this->ym_org_mode){?>
<option value="AB">Оплата через Альфа-Клик</option>
<?php } ?>
<?php if ($this->ym_method_sb && $this->ym_org_mode){?>
<option value="SB">Оплата через Сбербанк: оплата по SMS или Сбербанк Онлайн</option>
<?php } ?>
<?php if ($this->ym_method_wm && $this->ym_org_mode){?>
<option value="WM">Оплата из кошелька в системе WebMoney</option>
<?php } ?>
<?php if ($this->ym_method_ma && $this->ym_org_mode){?>
<option value="MA">Оплата через MasterPass</option>
<?php } ?>
<?php if ($this->ym_method_pb && $this->ym_org_mode){?>
<option value="PB">Оплата через интернет-банк Промсвязьбанка</option>
<?php } ?>
</select>
</td>
</tr>
</table>
<table border="0" cellspacing="1" align="center" width = "80%" bgcolor="#CCCCCC" >
<tr bgcolor="#FFFFFF">
<td width="490"></td>
<td width="48"><input type="submit" name = "BuyButton" value = "Оплатить"></td>
</tr>
</table>
</form>
<?php
}
public function getInvoice()
{
return $this->getNotification();
}
public function getFormUrl(){
if (!$this->ym_org_mode){
return $this->individualGetFormUrl();
}else{
return $this->orgGetFormUrl();
}
}
public function individualGetFormUrl(){
if ($this->ym_test_mode){
return 'https://demomoney.yandex.ru/quickpay/confirm.xml';
}else{
return 'https://money.yandex.ru/quickpay/confirm.xml';
}
}
public function orgGetFormUrl(){
if ($this->ym_test_mode){
return 'https://demomoney.yandex.ru/eshop.xml';
} else {
return 'https://money.yandex.ru/eshop.xml';
}
}
}