Completed
Push — master ( 6b7664...8cf912 )
by Alexey
05:42
created

WalletOne.php ➔ print_answer()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 6
rs 9.4285
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
    {
18
        $config = static::getConfig();
19
        $skey = $config['secret'];
20
        // Функция, которая возвращает результат в Единую кассу
21
22
        function print_answer($result, $description)
23
        {
24
            $print = "WMI_RESULT=" . strtoupper($result) . "&";
25
            $print .= "WMI_DESCRIPTION=" . urlencode($description);
26
            return $print;
27
        }
28
29
        // Проверка наличия необходимых параметров в POST-запросе
30
31
        if (!isset($data["WMI_SIGNATURE"]))
32
            $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...
33
34
        if (!isset($data["WMI_PAYMENT_NO"]))
35
            $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_PAYMENT_NO");
36
37
        if (!isset($data["WMI_ORDER_STATE"]))
38
            $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_ORDER_STATE");
39
40
        // Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE
41
        $params = [];
42
        foreach ($data as $name => $value) {
43
            if ($name !== "WMI_SIGNATURE")
44
                $params[$name] = $value;
45
        }
46
47
        // Сортировка массива по именам ключей в порядке возрастания
48
        // и формирование сообщения, путем объединения значений формы
49
50
        uksort($params, "strcasecmp");
51
        $values = "";
52
53
        foreach ($params as $name => $value) {
54
            //Конвертация из текущей кодировки (UTF-8)
55
            //необходима только если кодировка магазина отлична от Windows-1251
56
            $value = iconv("utf-8", "windows-1251", $value);
57
            $values .= $value;
58
        }
59
60
        // Формирование подписи для сравнения ее с параметром WMI_SIGNATURE
61
62
        $signature = base64_encode(pack("H*", md5($values . $skey)));
63
64
        //Сравнение полученной подписи с подписью W1
65
66
        if (!empty($data["WMI_SIGNATURE"]) && $signature == $data["WMI_SIGNATURE"]) {
67
            if (strtoupper($data["WMI_ORDER_STATE"]) == "ACCEPTED") {
68
                // вызываем функцию обработки в случае успеха
69
                $result['callback'] = print_answer("Ok", "Заказ #" . $data["WMI_PAYMENT_NO"] . " оплачен!");
70
                $result['payId'] = $data["WMI_PAYMENT_NO"];
71
                $result['status'] = 'success';
72
                return $result;
73
            } else {
74
                // Случилось что-то странное, пришло неизвестное состояние заказа
75
                $result['callback'] = print_answer("Retry", "Неверное состояние " . $data["WMI_ORDER_STATE"]);
76
            }
77
        } else {
78
            // Подпись не совпадает, возможно вы поменяли настройки интернет-магазина
79
            $result['callback'] = print_answer("Retry", "Неверная подпись " . (!empty($data["WMI_SIGNATURE"]) ? $data["WMI_SIGNATURE"] : 'empty'));
80
        }
81
        return $result;
82
    }
83
84
    public static function goToMerchant($payId, $amount, $currency, $description = '', $success = '/', $false = '/')
85
    {
86
        $config = static::getConfig();
87
        $merchantCurrency = static::getMerchantCurrency($currency);
88
        
89
        if (!$description)
90
            $description = "Оплата заказа на сайте " . idn_to_utf8(INJI_DOMAIN_NAME);
91
92
        //Секретный ключ интернет-магазина
93
        $key = $config['secret'];
94
95
        $fields = [];
96
97
        // Добавление полей формы в ассоциативный массив
98
        $fields["WMI_MERCHANT_ID"] = $config['shopId'];
99
        $fields["WMI_PAYMENT_AMOUNT"] = number_format($amount, 0, '.', '');
100
        $fields["WMI_CURRENCY_ID"] = $merchantCurrency->code;
101
        $fields["WMI_PAYMENT_NO"] = $payId;
102
        $fields["WMI_DESCRIPTION"] = "BASE64:" . base64_encode($description);
103
        $fields["WMI_EXPIRED_DATE"] = "2019-12-31T23:59:59";
104
        $fields["WMI_SUCCESS_URL"] = $success;
105
        $fields["WMI_FAIL_URL"] = $false;
106
        //Сортировка значений внутри полей
107
        foreach ($fields as $name => $val) {
108
            if (is_array($val)) {
109
                usort($val, "strcasecmp");
110
                $fields[$name] = $val;
111
            }
112
        }
113
114
        // Формирование сообщения, путем объединения значений формы,
115
        // отсортированных по именам ключей в порядке возрастания.
116
        uksort($fields, "strcasecmp");
117
        $fieldValues = "";
118
119
        foreach ($fields as $value) {
120
            if (is_array($value))
121
                foreach ($value as $v) {
122
                    //Конвертация из текущей кодировки (UTF-8)
123
                    //необходима только если кодировка магазина отлична от Windows-1251
124
                    $v = iconv("utf-8", "windows-1251", $v);
125
                    $fieldValues .= $v;
126
                } else {
127
                //Конвертация из текущей кодировки (UTF-8)
128
                //необходима только если кодировка магазина отлична от Windows-1251
129
                $value = iconv("utf-8", "windows-1251", $value);
130
                $fieldValues .= $value;
131
            }
132
        }
133
134
        // Формирование значения параметра WMI_SIGNATURE, путем
135
        // вычисления отпечатка, сформированного выше сообщения,
136
        // по алгоритму MD5 и представление его в Base64
137
138
        $signature = base64_encode(pack("H*", md5($fieldValues . $key)));
139
140
        //Добавление параметра WMI_SIGNATURE в словарь параметров формы
141
142
        $fields["WMI_SIGNATURE"] = $signature;
143
        /*
0 ignored issues
show
Unused Code Comprehensibility introduced by
59% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
144
          print "<form action=\"https://wl.walletone.com/checkout/checkout/Index\" method=\"POST\">";
145
146
          foreach ($fields as $key => $val) {
147
          if (is_array($val)) {
148
          foreach ($val as $value) {
149
          print "<input type=\"hidden\" name=\"$key\" value=\"$value\"/>";
150
          }
151
          } else {
152
          print "<input type=\"hidden\" name=\"$key\" value=\"$val\"/>";
153
          }
154
          }
155
156
          print "<input type=\"submit\"/></form>";
157
         */
158
        \Tools::redirect('https://www.walletone.com/checkout/default.aspx?' . http_build_query($fields));
159
    }
160
161
}
162