Completed
Push — trunk ( 8e4860...9a1e7c )
by SuperNova.WS
10:52
created

metamatter.php (1 issue)

Labels
Severity
1
<?php
2
3
global $debug;
4
5
// Придумать какой статус должен быть у глобальных ответов, что бы не перекрывать статусы платежных систем
6
// Может добавить спецстатус "Ответ системы платежа" и парсить дальше getMessage
7
// см constants.php
8
9
use Modules\sn_module;
10
11
include_once('common.' . substr(strrchr(__FILE__, '.'), 1));
12
13
if (!SN::$gc->modules->countModulesInGroup('payment')) {
14
  sys_redirect('dark_matter.php');
15
  die();
16
}
17
18
global $config;
19
20
lng_include('payment');
21
lng_include('infos');
22
23
$template = gettemplate('metamatter', true);
24
25
// $player_currency_default = player_load_option($user, PLAYER_OPTION_CURRENCY_DEFAULT);
26
$player_currency_default = SN::$user_options[PLAYER_OPTION_CURRENCY_DEFAULT];
27
$player_currency = sys_get_param_str('player_currency', $player_currency_default);
28
empty(SN::$lang['pay_currency_list'][$player_currency]) ? ($player_currency = $player_currency_default ? $player_currency_default : SN::$config->payment_currency_default) : false;
29
// $player_currency_default != $player_currency ? player_save_option($user, PLAYER_OPTION_CURRENCY_DEFAULT, $player_currency) : false;
30
$player_currency_default != $player_currency ? SN::$user_options[PLAYER_OPTION_CURRENCY_DEFAULT] = $player_currency : false;
31
32
//// Конвертация ММ в ТМ
33
//if(sys_get_param('mm_convert_do')) {
34
//  try {
35
//    if(!($mm_convert = sys_get_param_id('mm_convert'))) {
36
//      throw new exception($lang['pay_msg_mm_convert_wrong_amount'], ERR_ERROR);
37
//    }
38
//
39
//    sn_db_transaction_start();
40
//    $user = db_user_by_id($user['id'], true);
41
//    if($mm_convert > mrc_get_level($user, null, RES_METAMATTER)) {
42
//      throw new exception($lang['pay_msg_mm_convert_not_enough'], ERR_ERROR);
43
//    }
44
//
45
//    $payment_comment = sprintf("Игрок сконвертировал %d Метаматерии в Тёмную Материю", $mm_convert);
46
//    if(!mm_points_change($user['id'], RPG_CONVERT_MM, -$mm_convert, $payment_comment)) {
47
//      throw new exception($lang['pay_msg_mm_convert_mm_error'], ERR_ERROR);
48
//    }
49
//    if(!rpg_points_change($user['id'], RPG_CONVERT_MM, $mm_convert, $payment_comment)) {
50
//      throw new exception($lang['pay_msg_mm_convert_dm_error'], ERR_ERROR);
51
//    }
52
//
53
//    $template->assign_block_vars('result', array(
54
//      'STATUS'  => ERR_NONE,
55
//      'MESSAGE' => sprintf('Конвертация %1$s единиц Метаматерии в %1$s единиц Тёмной Материи успешно произведена', pretty_number($mm_convert)),
56
//    ));
57
//
58
//    sn_db_transaction_commit();
59
//  } catch(exception $e) {
60
//    sn_db_transaction_rollback();
61
//    $template->assign_block_vars('result', $response = array(
62
//      'STATUS'  => $e->getCode(),
63
//      'MESSAGE' => $e->getMessage(),
64
//    ));
65
//  }
66
//}
67
68
// Таблица скидок
69
$prev_discount = 0;
70
if (isset(sn_module_payment::$bonus_table) && is_array(sn_module_payment::$bonus_table)) {
71
  foreach (sn_module_payment::$bonus_table as $sum => $discount) {
72
    if ($discount && $discount != $prev_discount) {
73
      $template->assign_block_vars('discount', array(
74
        'SUM'          => $sum,
75
        'DISCOUNT'     => $discount * 100,
76
        'DISCOUNT_ONE' => 1 + $discount,
77
        'TEXT'         => sprintf(SN::$lang['pay_mm_bonus_each'], HelperString::numberFloorAndFormat($sum), round($discount * 100)),
78
      ));
79
      $prev_discount = $discount;
80
    }
81
  }
82
}
83
84
// Результат платежа
85
if (
86
    ($payment_id = sys_get_param_id('payment_id'))
87
    ||
88
    ($payment_id = sys_get_param_id('ik_pm_no'))
89
) {
90
  $payment = doquery("SELECT * FROM {{payment}} WHERE `payment_id` = {$payment_id} LIMIT 1;", true);
91
  if ($payment && $payment['payment_user_id'] == $user['id']) {
92
    if ($payment['payment_status'] == PAYMENT_STATUS_COMPLETE) {
93
      $template->assign_block_vars('result', array('MESSAGE' => sprintf(SN::$lang['pay_msg_mm_purchase_complete'], $payment['payment_dark_matter_paid'], $payment['payment_module_name'], $payment['payment_dark_matter_gained'])));
94
    }
95
    if ($payment['payment_status'] == PAYMENT_STATUS_NONE) {
96
      $template->assign_block_vars('result', array(
97
        'MESSAGE' => sprintf(SN::$lang['pay_msg_mm_purchase_incomplete'], $payment['payment_dark_matter_paid'], $payment['payment_module_name']),
98
        'STATUS'  => 1,
99
      ));
100
    }
101
    if ($payment['payment_test']) {
102
      $template->assign_block_vars('result', array(
103
        'MESSAGE' => sprintf(SN::$lang['pay_msg_mm_purchase_test']),
104
        'STATUS'  => -1,
105
      ));
106
    }
107
  }
108
}
109
110
$unit_available_amount_list = &sn_module_payment::$bonus_table;
111
112
$request = array(
113
  'metamatter' => sys_get_param_float('metamatter'),
114
);
115
116
if (!$request['metamatter']) {
117
  unset($_POST);
118
}
119
120
$payment_methods_available = array_combine(array_keys(sn_module_payment::$payment_methods), array_fill(0, count(sn_module_payment::$payment_methods), null));
121
array_walk($payment_methods_available, function (&$value, $index) {
122
  $value = !empty(sn_module_payment::$payment_methods[$index]) ? array_combine(array_keys(sn_module_payment::$payment_methods[$index]), array_fill(0, count(sn_module_payment::$payment_methods[$index]), null)) : $value;
123
});
124
125
$payment_module_valid = false;
126
$payment_module_request = sys_get_param_str('payment_module');
127
foreach (SN::$gc->modules->getModulesInGroup('payment', true) as $module_name => $module) {
128
  /**
129
   * @var sn_module $module
130
   */
131
132
  if (!is_object($module) || !$module->isActive()) {
133
    continue;
134
  }
135
136
  lng_include($module_name, $module->getRootRelative());
137
138
  foreach (sn_module_payment::$payment_methods as $payment_type_id => $available_methods) {
139
    foreach ($available_methods as $payment_method => $payment_currency) {
140
      if (isset($module->manifest['payment_method'][$payment_method])) {
141
        $payment_methods_available[$payment_type_id][$payment_method][$module_name] = $module->manifest['payment_method'][$payment_method];
142
      }
143
    }
144
  }
145
146
  $payment_module_valid = $payment_module_valid || $module_name == $payment_module_request;
147
}
148
149
global $template_result;
150
// Доступные платежные методы
151
foreach ($payment_methods_available as $payment_type_id => $payment_methods) {
152
  if (empty($payment_methods)) {
153
    continue;
154
  }
155
156
  $template_result['.']['payment'][$payment_type_id] = array(
157
    'ID'   => $payment_type_id,
158
    'NAME' => SN::$lang['pay_methods'][$payment_type_id],
159
  );
160
  foreach ($payment_methods as $payment_method_id => $module_list) {
161
    if (empty($module_list)) {
162
      continue;
163
    }
164
    $template_result['.']['payment'][$payment_type_id]['.']['method'][$payment_method_id] = array(
165
      'ID'         => $payment_method_id,
166
      'NAME'       => SN::$lang['pay_methods'][$payment_method_id],
167
      'IMAGE'      => isset(sn_module_payment::$payment_methods[$payment_type_id][$payment_method_id]['image'])
168
        ? sn_module_payment::$payment_methods[$payment_type_id][$payment_method_id]['image'] : '',
169
      'NAME_FORCE' => isset(sn_module_payment::$payment_methods[$payment_type_id][$payment_method_id]['name']),
170
      'BUTTON'     => isset(sn_module_payment::$payment_methods[$payment_type_id][$payment_method_id]['button']),
171
    );
172
    foreach ($module_list as $payment_module_name => $payment_module_method_details) {
173
      $template_result['.']['payment'][$payment_type_id]['.']['method'][$payment_method_id]['.']['module'][] = array(
174
        'MODULE' => $payment_module_name,
175
      );
176
    }
177
  }
178
179
  if (empty($template_result['.']['payment'][$payment_type_id]['.'])) {
180
    unset($template_result['.']['payment'][$payment_type_id]);
181
  }
182
}
183
184
$template->assign_recursive($template_result);
185
186
$payment_type_selected = sys_get_param_int('payment_type');
187
$payment_method_selected = sys_get_param_int('payment_method');
188
189
$payment_module_valid = $payment_module_valid && (!$payment_method_selected || isset($payment_methods_available[$payment_type_selected][$payment_method_selected][$payment_module_request]));
190
191
// If payment_module invalid - making it empty OR if there is only one payment_module - selecting it
192
if ($payment_module_valid) {
193
  // $payment_module = $payment_module; // Really - do nothing
194
} elseif ($payment_type_selected && count($payment_methods_available[$payment_type_selected][$payment_method_selected]) == 1) {
195
  reset($payment_methods_available[$payment_type_selected][$payment_method_selected]);
196
  $payment_module_request = key($payment_methods_available[$payment_type_selected][$payment_method_selected]);
197
} elseif (SN::$gc->modules->countModulesInGroup('payment') == 1) {
198
  $payment_module_request = $module_name;
199
} else {
200
  $payment_module_request = '';
201
}
202
203
if ($payment_type_selected && $payment_method_selected) {
204
  foreach ($payment_methods_available[$payment_type_selected][$payment_method_selected] as $module_name => $temp) {
205
    /**
206
     * @var sn_module_payment $mod
207
     */
208
    $mod = SN::$gc->modules->getModule($module_name);
209
210
    $aPrice = method_exists($mod, 'getPrice') ? $mod->getPrice($payment_method_selected, $player_currency, $request['metamatter']) : '';
0 ignored issues
show
$request['metamatter'] of type double is incompatible with the type integer expected by parameter $metamatter of sn_module_payment::getPrice(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

210
    $aPrice = method_exists($mod, 'getPrice') ? $mod->getPrice($payment_method_selected, $player_currency, /** @scrutinizer ignore-type */ $request['metamatter']) : '';
Loading history...
211
212
    $k = [
213
      'ID'          => $module_name,
214
      'NAME'        => SN::$lang["module_{$module_name}_name"],
215
      'DESCRIPTION' => SN::$lang["module_{$module_name}_description"],
216
    ];
217
218
    if (is_array($aPrice) && !empty($aPrice)) {
219
      $k['COST']     = $aPrice[$mod::FIELD_SUM];
220
      $k['CURRENCY'] = $aPrice[$mod::FIELD_CURRENCY];
221
    }
222
223
224
    $template->assign_block_vars('payment_module', $k);
225
  }
226
}
227
228
foreach (SN::$lang['pay_currency_list'] as $key => $value) {
229
  $course = get_exchange_rate($key);
230
  if (!$course) {
231
    continue;
232
  }
233
  $template->assign_block_vars('exchange', array(
234
    'SYMBOL'          => $key,
235
    'TEXT'            => $value,
236
    'COURSE_DIRECT'   => HelperString::numberFormat($course, 4),
237
    'COURSE_REVERSE'  => HelperString::numberFormat(1 / $course, 4),
238
    'MM_PER_CURRENCY' => HelperString::numberFormat(sn_module_payment::currency_convert(1, $key, 'MM_'), 2),
239
    'LOT_PRICE'       => sn_module_payment::currency_convert(get_mm_cost(), 'MM_', $key),
240
    'DEFAULT'         => $key == SN::$config->payment_currency_default,
241
  ));
242
}
243
244
if ($request['metamatter'] && $payment_module_request) {
245
  try {
246
    $paymentModuleReal = SN::$gc->modules->getModule($payment_module_request);
247
    if(!is_object($paymentModuleReal)) {
248
      throw new Exception('{ Менеджер модулей вернул null вместо платёжного модуля для }' . $payment_module_request, ERR_ERROR);
249
    }
250
    /**
251
     * @var sn_module_payment $paymentModuleReal
252
     */
253
254
    // Any possible errors about generating paylink should be raised in module!
255
    $pay_link = $paymentModuleReal->compile_request($request);
256
257
    // Поддержка дополнительной информации
258
    if (is_array($pay_link['RENDER'])) {
259
      foreach ($pay_link['RENDER'] as $html_data) {
260
        $template->assign_block_vars('render', $html_data);
261
        if (isset($html_data['VALUE']) && is_array($html_data['VALUE'])) {
262
          foreach ($html_data['VALUE'] as $value_id => $value_value) {
263
            $template->assign_block_vars('render.value', array(
264
              'FIELD' => $value_id,
265
              'VALUE' => $value_value,
266
            ));
267
          }
268
        }
269
      }
270
    }
271
272
    // Поддержка передачи данных для многошаговых платежных систем
273
    if (is_array($pay_link['DATA'])) {
274
      foreach ($pay_link['DATA'] as $key => $value) {
275
        $template->assign_block_vars('pay_link_data', array(
276
          'FIELD' => $key,
277
          'VALUE' => $value,
278
        ));
279
      }
280
    }
281
282
    if (is_array($pay_link) && in_array($pay_link['PAY_LINK_METHOD'], array('POST', 'GET', 'LINK', 'STEP'))) {
283
      // TODO Переделать это под assign_vars_recursive и возвращать пустые строки если нет платежного метода - для унификации формы в темплейте
284
      $template->assign_vars(array(
285
        'PAY_LINK_METHOD' => $pay_link['PAY_LINK_METHOD'],
286
        'PAY_LINK_URL'    => $pay_link['PAY_LINK_URL'],
287
      ));
288
    } else {
289
      throw new exception(SN::$lang['pay_msg_request_paylink_unsupported'], ERR_ERROR);
290
    }
291
  } catch (exception $e) {
292
    $template->assign_block_vars('result', $response = array(
293
      'STATUS'  => $e->getCode(),
294
      'MESSAGE' => $e->getMessage(),
295
    ));
296
    $debug->warning('Результат операции: код ' . $e->getCode() . ' сообщение "' . $e->getMessage() . '"', 'Ошибка платежа', LOG_INFO_PAYMENT);
297
  }
298
}
299
300
// Прегенерированные пакеты
301
foreach ($unit_available_amount_list as $unit_amount => $discount) {
302
  $temp = sn_module_payment::currency_convert($unit_amount, 'MM_', $player_currency);
303
  $template->assign_block_vars('mm_amount', array(
304
    'VALUE'            => $unit_amount,
305
    // 'PRICE' => $temp,
306
    'PRICE_TEXT'       => HelperString::numberFormat($temp, 2),
307
    'CURRENCY'         => $player_currency,
308
    'DISCOUNT'         => $discount,
309
    'DISCOUNT_PERCENT' => $discount * 100,
310
    'DISCOUNTED'       => $unit_amount * (1 + $discount),
311
    'TEXT'             => HelperString::numberFloorAndFormat($unit_amount),
312
    'TEXT_DISCOUNTED'  => HelperString::numberFloorAndFormat($unit_amount * (1 + $discount)),
313
  ));
314
}
315
316
$currency = $payment_module_request ? sn_module_payment::$payment_methods[$payment_type_selected][$payment_method_selected]['currency'] : '';
317
$bonus_percent = round(sn_module_payment::bonus_calculate($request['metamatter'], true, true) * 100);
318
$income_metamatter_text = prettyNumberStyledDefault(sn_module_payment::bonus_calculate($request['metamatter']));
319
320
$approxCost = '';
321
if(!empty($module_name) && !empty($payment_method_selected)) {
322
  $mod = SN::$gc->modules->getModule($module_name);
323
324
  /**
325
   * @var sn_module_payment $mod
326
   */
327
  $tPrice = method_exists($mod, 'getPrice') ? $mod->getPrice($payment_method_selected, $player_currency, $request['metamatter']) : '';
328
  if(!empty($tPrice) && is_array($tPrice)) {
329
    $approxCost = sprintf(
330
      SN::$lang['pay_mm_buy_approximate_cost'],
331
      HelperString::numberFormat($tPrice[$mod::FIELD_SUM], 2),
332
      $tPrice[$mod::FIELD_CURRENCY]
333
    );
334
  }
335
}
336
337
338
$template->assign_vars(array(
339
  'PAGE_HEADER' => SN::$lang['sys_metamatter'],
340
341
  'URL_PURCHASE' => SN::$config->url_purchase_metamatter,
342
343
  'PAYMENT_TYPE'        => $payment_type_selected,
344
  'PAYMENT_METHOD'      => $payment_method_selected,
345
  'PAYMENT_METHOD_NAME' => SN::$lang['pay_methods'][$payment_method_selected],
346
347
  'PAYMENT_MODULE'             => $payment_module_request,
348
  'PAYMENT_MODULE_NAME'        => SN::$lang["module_{$payment_module_request}_name"],
349
  'PAYMENT_MODULE_DESCRIPTION' => SN::$lang["module_{$payment_module_request}_description"],
350
351
  'PLAYER_CURRENCY'              => $player_currency,
352
  'PLAYER_CURRENCY_PRICE_PER_MM' => sn_module_payment::currency_convert(1, $player_currency, 'MM_', 10),
353
354
  'UNIT_AMOUNT'                 => (float)$request['metamatter'],
355
  'UNIT_AMOUNT_TEXT'            => HelperString::numberFloorAndFormat($request['metamatter']),
356
  'UNIT_AMOUNT_BONUS_PERCENT'   => $bonus_percent,
357
  'UNIT_AMOUNT_TEXT_DISCOUNTED' => $income_metamatter_text,
358
  'UNIT_AMOUNT_TEXT_COST_BASE'  => HelperString::numberFormat(sn_module_payment::currency_convert($request['metamatter'], 'MM_', $player_currency), 2),
359
360
  'PAYMENT_CURRENCY_EXCHANGE_DEFAULT' => prettyNumberStyledDefault(get_mm_cost()),
361
  'PAYMENT_CURRENCY_DEFAULT_TEXT'     => SN::$lang['pay_currency_list'][SN::$config->payment_currency_default],
362
363
  'METAMATTER' => mrc_get_level($user, '', RES_METAMATTER),
364
365
  'METAMATTER_COST_TEXT'       => sprintf(SN::$lang['pay_mm_buy_conversion_cost'],
366
    prettyNumberStyledDefault($request['metamatter']),
367
    number_format($mmWish = sn_module_payment::currency_convert($request['metamatter'], 'MM_', $currency), 2, ',', '.'),
368
    $currency,
369
    prettyNumberGetClass($mmWish, true)),
370
  'METAMATTER_COST_BONUS_TEXT' => $bonus_percent
371
    ? sprintf(SN::$lang['pay_mm_buy_real_income'], prettyNumberStyledDefault($bonus_percent), $income_metamatter_text)
372
    : '',
373
374
  'METAMATTER_COST_ON_PAYMENT' => $approxCost,
375
376
  'DARK_MATTER_DESCRIPTION' => SN::$lang['info'][RES_DARK_MATTER]['description'],
377
378
  'PAYMENT_AVAILABLE' => SN::$gc->modules->countModulesInGroup('payment') && !defined('SN_GOOGLE'),
379
380
));
381
382
display($template, SN::$lang['sys_metamatter']);
383