Passed
Push — master ( edbfbd...89a048 )
by Alexey
05:17
created

WalletOne::goToMerchant()   B

Complexity

Conditions 7
Paths 24

Size

Total Lines 61
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 32
nc 24
nop 6
dl 0
loc 61
rs 7.399
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Merchant helper Wallet one
5
 *
6
 * @author Alexey Krupskiy <[email protected]>
7
 * @link http://inji.ru/
8
 * @copyright 2015 Alexey Krupskiy
9
 * @license https://github.com/injitools/cms-Inji/blob/master/LICENSE
10
 */
11
12
namespace Money\MerchantHelper;
13
14
class WalletOne extends \Money\MerchantHelper {
15
16
    public static function reciver($data, $status) {
17
        $config = static::getConfig();
18
        $skey = $config['secret'];
19
20
        // Функция, которая возвращает результат в Единую кассу
21
22
        function print_answer($result, $description) {
23
            $print = "WMI_RESULT=" . strtoupper($result) . "&";
24
            $print .= "WMI_DESCRIPTION=" . urlencode($description);
25
            return $print;
26
        }
27
28
        // Проверка наличия необходимых параметров в POST-запросе
29
30
        if (!isset($data["WMI_SIGNATURE"])) {
31
                    $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_SIGNATURE");
0 ignored issues
show
Coding Style Comprehensibility introduced by
$result was never initialized. Although not strictly required by PHP, it is generally a good practice to add $result = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
32
        }
33
34
        if (!isset($data["WMI_PAYMENT_NO"])) {
35
                    $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_PAYMENT_NO");
36
        }
37
38
        if (!isset($data["WMI_ORDER_STATE"])) {
39
                    $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_ORDER_STATE");
40
        }
41
42
        // Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE
43
        $params = [];
44
        foreach ($data as $name => $value) {
45
            if ($name !== "WMI_SIGNATURE") {
46
                            $params[$name] = $value;
47
            }
48
        }
49
50
        // Сортировка массива по именам ключей в порядке возрастания
51
        // и формирование сообщения, путем объединения значений формы
52
53
        uksort($params, "strcasecmp");
54
        $values = "";
55
56
        foreach ($params as $name => $value) {
57
            //Конвертация из текущей кодировки (UTF-8)
58
            //необходима только если кодировка магазина отлична от Windows-1251
59
            $value = iconv("utf-8", "windows-1251", $value);
60
            $values .= $value;
61
        }
62
63
        // Формирование подписи для сравнения ее с параметром WMI_SIGNATURE
64
65
        $signature = base64_encode(pack("H*", md5($values . $skey)));
66
67
        //Сравнение полученной подписи с подписью W1
68
69
        if (!empty($data["WMI_SIGNATURE"]) && $signature == $data["WMI_SIGNATURE"]) {
70
            if (strtoupper($data["WMI_ORDER_STATE"]) == "ACCEPTED") {
71
                // вызываем функцию обработки в случае успеха
72
                $result['callback'] = print_answer("Ok", "Заказ #" . $data["WMI_PAYMENT_NO"] . " оплачен!");
73
                $result['payId'] = $data["WMI_PAYMENT_NO"];
74
                $result['status'] = 'success';
75
                return $result;
76
            } else {
77
                // Случилось что-то странное, пришло неизвестное состояние заказа
78
                $result['callback'] = print_answer("Retry", "Неверное состояние " . $data["WMI_ORDER_STATE"]);
79
            }
80
        } else {
81
            // Подпись не совпадает, возможно вы поменяли настройки интернет-магазина
82
            $result['callback'] = print_answer("Retry", "Неверная подпись " . (!empty($data["WMI_SIGNATURE"]) ? $data["WMI_SIGNATURE"] : 'empty'));
83
        }
84
        return $result;
85
    }
86
87
    public static function goToMerchant($payId, $amount, $currency, $description = '', $success = '/', $false = '/') {
88
        $config = static::getConfig();
89
        $merchantCurrency = static::getMerchantCurrency($currency);
90
91
        if (!$description)
92
            $description = "Оплата заказа на сайте " . idn_to_utf8(INJI_DOMAIN_NAME);
93
94
        //Секретный ключ интернет-магазина
95
        $key = $config['secret'];
96
97
        $fields = [];
98
99
        // Добавление полей формы в ассоциативный массив
100
        $fields["WMI_MERCHANT_ID"] = $config['shopId'];
101
        $fields["WMI_PAYMENT_AMOUNT"] = number_format($amount, 0, '.', '');
102
        $fields["WMI_CURRENCY_ID"] = $merchantCurrency->code;
103
        $fields["WMI_PAYMENT_NO"] = $payId;
104
        $fields["WMI_DESCRIPTION"] = "BASE64:" . base64_encode($description);
105
        $fields["WMI_EXPIRED_DATE"] = "2019-12-31T23:59:59";
106
        $fields["WMI_SUCCESS_URL"] = $success;
107
        $fields["WMI_FAIL_URL"] = $false;
108
        //Сортировка значений внутри полей
109
        foreach ($fields as $name => $val) {
110
            if (is_array($val)) {
111
                usort($val, "strcasecmp");
112
                $fields[$name] = $val;
113
            }
114
        }
115
116
        // Формирование сообщения, путем объединения значений формы,
117
        // отсортированных по именам ключей в порядке возрастания.
118
        uksort($fields, "strcasecmp");
119
        $fieldValues = "";
120
121
        foreach ($fields as $value) {
122
            if (is_array($value)) {
123
                            foreach ($value as $v) {
124
                    //Конвертация из текущей кодировки (UTF-8)
125
                    //необходима только если кодировка магазина отлична от Windows-1251
126
                    $v = iconv("utf-8", "windows-1251", $v);
127
            }
128
                    $fieldValues .= $v;
129
                } else {
130
                //Конвертация из текущей кодировки (UTF-8)
131
                //необходима только если кодировка магазина отлична от Windows-1251
132
                $value = iconv("utf-8", "windows-1251", $value);
133
                $fieldValues .= $value;
134
            }
135
        }
136
137
        // Формирование значения параметра WMI_SIGNATURE, путем
138
        // вычисления отпечатка, сформированного выше сообщения,
139
        // по алгоритму MD5 и представление его в Base64
140
141
        $signature = base64_encode(pack("H*", md5($fieldValues . $key)));
142
143
        //Добавление параметра WMI_SIGNATURE в словарь параметров формы
144
145
        $fields["WMI_SIGNATURE"] = $signature;
146
        \Tools::redirect('https://www.walletone.com/checkout/default.aspx?' . http_build_query($fields));
147
    }
148
149
}
150