· 9 years ago · Oct 19, 2016, 04:54 PM
1<?php
2
3if(class_exists('WRP_Payment')){
4
5add_action('init','wrp_add_walletone_payment');
6function wrp_add_walletone_payment(){
7 $pm = new WRP_Walletone_Payment();
8 $pm->register_payment('walletone');
9}
10
11class WRP_Walletone_Payment extends WRP_Payment{
12
13 public $form_pay_id;
14 public $payments_json;
15
16 function register_payment($form_pay_id){
17 $this->form_pay_id = $form_pay_id;
18 parent::add_payment($this->form_pay_id, array(
19 'class'=>get_class($this),
20 'request'=>'WMI_PAYMENT_NO',
21 'name'=>'WalletOne'
22 ));
23 if(is_admin()) $this->add_options();
24 }
25
26 function add_options(){
27 add_filter('wrp_pay_option',(array($this,'options')));
28 add_filter('wrp_pay_child_option',(array($this,'child_options')));
29 }
30
31 function options($options){
32 $options[$this->form_pay_id] = __('WalletOne','rcl-walletone');
33 return $options;
34 }
35
36 function child_options($child){
37
38 $opt = new WRP_Options();
39
40 $child .= $opt->child(
41 array(
42 'name'=>'connect_sale',
43 'value'=>$this->form_pay_id
44 ),
45 array(
46 $opt->title(__('ÐаÑтройки Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ WalletOne','rcl-walletone')),
47 $opt->label(__('Merchant ID','rcl-walletone')),
48 $opt->option('text',array('name'=>'WO_MERCHANT_ID')),
49 $opt->label(__('Секретный ключ','rcl-walletone')),
50 $opt->option('password',array('name'=>'WO_SECRET_KEY')),
51 $opt->label(__('ДоÑтупные ÑпоÑобы оплаты','rcl-walletone')),
52 $content
53 )
54 );
55
56 return $child;
57 }
58
59 function pay_form($data){
60 global $wrp_options;
61
62 $merchant_id = $wrp_options['WO_MERCHANT_ID'];
63 $secret_key = $wrp_options['WO_SECRET_KEY'];
64
65 $curs = array( 'RUB' => 643, 'UAH' => 980, 'KZT' => 398, 'USD' => 840, 'EUR' => 978 );
66 $code_cur = (isset($curs[$wrp_options['primary_cur']]))? $curs[$wrp_options['primary_cur']]: 643;
67
68 $desc = ($data->description)? $data->description: 'Платеж от '.$data->email_user;
69
70 $fields = array(
71 'WMI_MERCHANT_ID'=>$merchant_id,
72 'WMI_PAYMENT_AMOUNT'=>$data->pay_summ.'.00',
73 'WMI_CURRENCY_ID'=>$code_cur,
74 'WMI_PAYMENT_NO'=>$data->pay_id,
75 'WMI_DESCRIPTION'=>$desc,
76 'WMI_EXPIRED_DATE'=>'2016-10-19 16:31:00', // <- ÐТО Я ДОПИСÐЛ
77 'WMI_SUCCESS_URL'=>get_permalink($wrp_options['page_successfully_pay']),
78 'WMI_FAIL_URL'=>get_permalink($wrp_options['page_fail_pay']),
79 'USER_ID'=>$data->email_user,
80 'TYPE_PAY'=>$data->pay_type,
81 'CMS'=>30
82 );
83
84 //Сортировка значений внутри полей
85 foreach($fields as $name => $val)
86 {
87 if (is_array($val))
88 {
89 usort($val, "strcasecmp");
90 $fields[$name] = $val;
91 }
92 }
93
94 // Формирование ÑообщениÑ, путем Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ формы,
95 // отÑортированных по именам ключей в порÑдке возраÑтаниÑ.
96 uksort($fields, "strcasecmp");
97 $fieldValues = "";
98
99 foreach($fields as $value)
100 {
101 if (is_array($value))
102 foreach($value as $v)
103 {
104 //ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¸Ð· текущей кодировки (UTF-8)
105 //необходима только еÑли кодировка магазина отлична от Windows-1251
106 $v = iconv("utf-8", "windows-1251", $v);
107 $fieldValues .= $v;
108 }
109 else
110 {
111 //ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¸Ð· текущей кодировки (UTF-8)
112 //необходима только еÑли кодировка магазина отлична от Windows-1251
113 $value = iconv("utf-8", "windows-1251", $value);
114 $fieldValues .= $value;
115 }
116 }
117
118 // Формирование Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° WMI_SIGNATURE, путем
119 // вычиÑÐ»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿ÐµÑ‡Ð°Ñ‚ÐºÐ°, Ñформированного выше ÑообщениÑ,
120 // по алгоритму MD5 и предÑтавление его в Base64
121
122 $signature = base64_encode(pack("H*", md5($fieldValues . $secret_key)));
123
124 //Добавление параметра WMI_SIGNATURE в Ñловарь параметров формы
125
126 $fields["WMI_SIGNATURE"] = $signature;
127
128 $form = parent::form($fields,$data,'https://wl.walletone.com/checkout/checkout/Index');
129
130 return $form;
131 }
132
133 function result($data){
134 global $wrp_options;
135
136 $secret_key = $wrp_options['WO_SECRET_KEY'];
137
138 $data->pay_summ = $_REQUEST["WMI_PAYMENT_AMOUNT"];
139 $data->pay_id = $_REQUEST["WMI_PAYMENT_NO"];
140 $data->email_user = $_REQUEST["USER_ID"];
141 $data->pay_type = $_REQUEST["TYPE_PAY"];
142
143 // Ð’ÐШ код
144 $order = wpr_get_order($data->pay_id);
145 if(!$order||$order[0]->res_status!=0){
146 //заказа не ÑущеÑтвует или уже оплачен
147 $this->print_answer("Retry", "Заказа не ÑущеÑтвует или уже оплачен");
148 }
149
150
151 if (!isset($_REQUEST["WMI_SIGNATURE"]))
152 $this->print_answer("Retry", "ОтÑутÑтвует параметр WMI_SIGNATURE");
153
154 if (!isset($_REQUEST["WMI_PAYMENT_NO"]))
155 $this->print_answer("Retry", "ОтÑутÑтвует параметр WMI_PAYMENT_NO");
156
157 if (!isset($_REQUEST["WMI_ORDER_STATE"]))
158 $this->print_answer("Retry", "ОтÑутÑтвует параметр WMI_ORDER_STATE");
159
160 // Извлечение вÑех параметров POST-запроÑа, кроме WMI_SIGNATURE
161
162 foreach($_REQUEST as $name => $value)
163 {
164 if ($name !== "WMI_SIGNATURE") $params[$name] = $value;
165 }
166
167 // Сортировка маÑÑива по именам ключей в порÑдке возраÑтаниÑ
168 // и формирование ÑообщениÑ, путем Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ формы
169
170 uksort($params, "strcasecmp"); $values = "";
171
172 foreach($params as $name => $value)
173 {
174 //ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¸Ð· текущей кодировки (UTF-8)
175 //необходима только еÑли кодировка магазина отлична от Windows-1251
176 //$value = iconv("utf-8", "windows-1251", $value);
177 $values .= $value;
178 }
179
180 // Формирование подпиÑи Ð´Ð»Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ ÐµÐµ Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ WMI_SIGNATURE
181
182 $signature = base64_encode(pack("H*", md5($values . $secret_key)));
183
184 //Сравнение полученной подпиÑи Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñью W1
185
186 if ($signature == $_REQUEST["WMI_SIGNATURE"]){
187 if (strtoupper($_REQUEST["WMI_ORDER_STATE"]) == "ACCEPTED"){
188 // TODO: Пометить заказ, как «Оплаченный» в ÑиÑтеме учета магазина
189 if(!parent::get_pay($data)){
190 //print_answer("Ok", "Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
191 print "WMI_RESULT=" . strtoupper("Ok") . "&";
192 print "WMI_DESCRIPTION=" .urlencode("Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
193 parent::insert_pay($data);
194 exit;
195 }
196 }else{
197 // СлучилоÑÑŒ что-то Ñтранное, пришло неизвеÑтное ÑоÑтоÑние заказа
198 $this->print_answer("Retry", "Ðеверное ÑоÑтоÑние ". $_REQUEST["WMI_ORDER_STATE"]);
199 }
200 }else{
201 // ПодпиÑÑŒ не Ñовпадает, возможно вы поменÑли наÑтройки интернет-магазина
202 $this->print_answer("Retry", "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ " . $_REQUEST["WMI_SIGNATURE"],$signature);
203 }
204
205 }
206
207 function print_answer($result, $description,$signature=false){
208 wrp_mail_payment_error($signature);
209 print "WMI_RESULT=" . strtoupper($result) . "&";
210 print "WMI_DESCRIPTION=" .urlencode($description);
211 exit();
212 }
213
214}
215
216}