public static function reciver($data, $status) { $config = static::getConfig(); $skey = $config['secret']; // Функция, которая возвращает результат в Единую кассу function print_answer($result, $description) { $print = "WMI_RESULT=" . strtoupper($result) . "&"; $print .= "WMI_DESCRIPTION=" . urlencode($description); return $print; } // Проверка наличия необходимых параметров в POST-запросе if (!isset($data["WMI_SIGNATURE"])) { $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_SIGNATURE"); } if (!isset($data["WMI_PAYMENT_NO"])) { $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_PAYMENT_NO"); } if (!isset($data["WMI_ORDER_STATE"])) { $result['callback'] = print_answer("Retry", "Отсутствует параметр WMI_ORDER_STATE"); } // Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE $params = []; foreach ($data as $name => $value) { if ($name !== "WMI_SIGNATURE") { $params[$name] = $value; } } // Сортировка массива по именам ключей в порядке возрастания // и формирование сообщения, путем объединения значений формы uksort($params, "strcasecmp"); $values = ""; foreach ($params as $name => $value) { //Конвертация из текущей кодировки (UTF-8) //необходима только если кодировка магазина отлична от Windows-1251 $value = iconv("utf-8", "windows-1251", $value); $values .= $value; } // Формирование подписи для сравнения ее с параметром WMI_SIGNATURE $signature = base64_encode(pack("H*", md5($values . $skey))); //Сравнение полученной подписи с подписью W1 if (!empty($data["WMI_SIGNATURE"]) && $signature == $data["WMI_SIGNATURE"]) { if (strtoupper($data["WMI_ORDER_STATE"]) == "ACCEPTED") { // вызываем функцию обработки в случае успеха $result['callback'] = print_answer("Ok", "Заказ #" . $data["WMI_PAYMENT_NO"] . " оплачен!"); $result['payId'] = $data["WMI_PAYMENT_NO"]; $result['status'] = 'success'; return $result; } else { // Случилось что-то странное, пришло неизвестное состояние заказа $result['callback'] = print_answer("Retry", "Неверное состояние " . $data["WMI_ORDER_STATE"]); } } else { // Подпись не совпадает, возможно вы поменяли настройки интернет-магазина $result['callback'] = print_answer("Retry", "Неверная подпись " . (!empty($data["WMI_SIGNATURE"]) ? $data["WMI_SIGNATURE"] : 'empty')); } return $result; }
function check_ipn_response() { global $woocommerce; if (!isset($_POST["WMI_SIGNATURE"])) { print "WMI_RESULT=" . strtoupper("Retry") . "&"; print "WMI_DESCRIPTION=" . urlencode("Отсутствует параметр WMI_SIGNATURE"); exit; } if (!isset($_POST["WMI_PAYMENT_NO"])) { print "WMI_RESULT=" . strtoupper("Retry") . "&"; print "WMI_DESCRIPTION=" . urlencode("Отсутствует параметр WMI_PAYMENT_NO"); exit; } if (!isset($_POST["WMI_ORDER_STATE"])) { print "WMI_RESULT=" . strtoupper("Retry") . "&"; print "WMI_DESCRIPTION=" . urlencode("Отсутствует параметр WMI_ORDER_STATE"); exit; } if (isset($_POST["WMI_SIGNATURE"]) && $this->merchant_id == $_POST["WMI_MERCHANT_ID"]) { if (strtoupper($_POST["WMI_ORDER_STATE"]) == "ACCEPTED") { $order_id = $_POST['WMI_PAYMENT_NO']; $order = new WC_Order($order_id); $order->update_status('on-hold', __('Платеж успешно оплачен', 'woocommerce')); $woocommerce->cart->empty_cart(); print "WMI_RESULT=" . strtoupper("Ok") . "&"; print "WMI_DESCRIPTION=" . urlencode("Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!"); wp_redirect(add_query_arg('key', $order->order_key, add_query_arg('order', $order_id, get_permalink(get_option('woocommerce_thanks_page_id'))))); exit; } else { $inv_id = $_POST['WMI_PAYMENT_NO']; $order = new WC_Order($inv_id); $order->update_status('failed', __('Платеж не оплачен', 'woocommerce')); print_answer("Retry", "Неверное состояние " . $_POST["WMI_ORDER_STATE"]); wp_redirect($order->get_cancel_order_url()); exit; } } else { print "WMI_RESULT=" . strtoupper("Retry") . "&"; print "WMI_DESCRIPTION=" . urlencode("Неверная подпись " . $_POST["WMI_SIGNATURE"]); wp_redirect($order->get_cancel_order_url()); exit; } }