/** * Полученнияе массива параметров оплаты. * @param int $pay - id способа оплаты. * @return array параметры оплаты. */ public function getParamArray($pay, $orderId, $summ) { $paramArray = array(); $jsonPaymentArray = json_decode(nl2br($this->_paymentArray[$pay]['paramArray']), true); if (!empty($jsonPaymentArray)) { foreach ($jsonPaymentArray as $paramName => $paramValue) { $paramArray[] = array('name' => $paramName, 'value' => $paramValue); } if (5 == $pay) { // Для robokassa добавляем сигнатуру. $paramArray['sign'] = md5($paramArray[0]['value'] . ":" . $summ . ":" . $orderId . ":" . $paramArray[1]['value']); } if (9 == $pay) { // Для payanyway добавляем сигнатуру. $summ = sprintf("%01.2f", $summ); $currency = MG::getSetting('currencyShopIso') == "RUR" ? "RUB" : MG::getSetting('currencyShopIso'); $testmode = 0; $paramArray['sign'] = md5($paramArray[0]['value'] . $orderId . $summ . $currency . $testmode . $paramArray[1]['value']); } if (15 == $pay) { $model = new Models_Order(); $summ = sprintf("%01.2f", $summ); $order = $model->getOrder(' id = ' . DB::quote($orderId, true)); $payment = 'amt=' . $summ . '&ccy=UAH&details=заказ на ' . SITE . '&ext_details=' . $order[$orderId]['number'] . '&pay_way=privat24&order=' . $orderId . '&merchant=' . $paramArray[0]['value']; $paramArray['sign'] = sha1(md5($payment . $paramArray[1]['value'])); } } return $paramArray; }
/** * Возвращает сообщение о статусе заказа "Подтвержден". * @param type $pay - id заказа. * @return mixed - сообщение и email пользователя. */ public function confirmOrder($id) { // Модель для работы заказом. $model = new Models_Order(); // Информация о заказе по переданному id. $orderInfo = $model->getOrder('`' . PREFIX . 'order`.id = "' . $id . '"'); $hash = URL::getQueryParametr('sec'); // Информация о пользователе, сделавший заказ . $orderUser = USER::getUserInfoByEmail($orderInfo[$id]['user_email']); // Если присланный хэш совпадает с хэшом из БД для соответствующего id. if ($orderInfo[$id]['confirmation'] == $hash) { if ($orderInfo[$id]['hash'] == '') { $msg = 'Посмотреть статус заказа Вы можете в <a href="' . SITE . '/personal">личном кабинете</a>.'; } else { $msg = 'Следить за статусом заказа Вы можете по ссылке <br> ' . '<a href="' . SITE . '/order?hash=' . $orderInfo[$id]['hash'] . '">' . SITE . '/order?hash=' . $orderInfo[$id]['hash'] . '</a>'; } // Если статус заказа "Не подтвержден". if (0 == $orderInfo[$id]['status_id']) { // Подтверждаем заказ. $orderStatus = 1; // если оплата выбрана наложенным платежём, то статус заказа изменяем на "в доставке" if ($orderInfo[$id]['payment_id'] == 3) { $orderStatus = 3; } $model->sendStatusToEmail($id, $orderStatus); $model->setOrderStatus($id, $orderStatus); $orderNumber = $orderInfo[$id]['number']; $orderId = $id; $msg = 'Ваш заказ №' . $orderNumber . ' подтвержден и передан на обработку. <br> ' . $msg; } else { $msg = 'Заказ уже подтвержден и находится в работе. <br> ' . $msg; } if (!$orderUser->activity) { $userEmail = $orderUser->email; $_SESSION['id'] = $orderUser->id; } } else { $msg = 'Некорректная ссылка.<br> Заказ не подтвержден<br>'; } $result = array('msg' => $msg, 'userEmail' => $userEmail); return $result; }
/** * Получает параметры заказа */ public function getOrderData() { $model = new Models_Order(); $orderData = $model->getOrder(" id = " . DB::quote($_POST['id'])); $orderData = $orderData[$_POST['id']]; if ($orderData['number'] == '') { $orderData['number'] = $orderData['id']; DB::query("UPDATE `" . PREFIX . "order` SET `number`= " . DB::quote($orderData['number']) . " WHERE `id`=" . DB::quote($orderData['id']) . ""); } $orderData['yur_info'] = unserialize(stripslashes($orderData['yur_info'])); $orderData['order_content'] = unserialize(stripslashes($orderData['order_content'])); // Запрос для проверки, существует ли система скидок $percent = false; $discountSyst = false; $res = DB::query('SELECT * FROM `' . PREFIX . 'plugins` WHERE `folderName` = "discount-system"'); $act = DB::fetchArray($res); $result = DB::query('SHOW TABLES LIKE "' . PREFIX . 'discount-system%"'); if (DB::numRows($result) == 2 && $act['active']) { $percent = 0; $discountSyst = true; } if (!empty($orderData['order_content'])) { $product = new Models_Product(); foreach ($orderData['order_content'] as &$item) { foreach ($item as &$v) { $v = rawurldecode($v); } } foreach ($orderData['order_content'] as &$items) { $res = $product->getProduct($items['id']); $items['image_url'] = $res['image_url']; $items['property'] = htmlspecialchars_decode(str_replace('&', '&', $items['property'])); $response['discount'] = $items['discount']; $percent = $items['discount']; $items['maxCount'] = $res['count']; $variants = DB::query("SELECT `id`, `count` FROM `" . PREFIX . "product_variant`\n WHERE `product_id`=" . DB::quote($items['id']) . " AND `code`=" . DB::quote($items['code'])); if ($variant = DB::fetchAssoc($variants)) { $items['variant'] = $variant['id']; $items['maxCount'] = $variant['count']; } } } //заменить на получение скидки $codes = array(); // Запрос для проверки , существуют ли промокоды. $result = DB::query('SHOW TABLES LIKE "' . PREFIX . 'promo-code"'); if (DB::numRows($result)) { $res = DB::query('SELECT * FROM `' . PREFIX . 'plugins` WHERE `folderName` = "promo-code"'); $act = DB::fetchArray($res); if ($act['active']) { $res = DB::query('SELECT code, percent FROM `' . PREFIX . 'promo-code` WHERE invisible = 1 AND now() >= `from_datetime` AND now() <= `to_datetime`'); while ($code = DB::fetchAssoc($res)) { $codes[] = $code['code']; if ($code['code'] == $orderData['order_content'][0]['coupon']) { $percent = $percent == 0 ? $code['percent'] : $percent; } } } } $response['order'] = $orderData; $response['order']['discountsSystem'] = $discountSyst; $response['order']['discontPercent'] = $percent; $response['order']['promoCodes'] = $codes; $response['order']['date_delivery'] = $orderData['date_delivery'] ? date('d.m.Y', strtotime($orderData['date_delivery'])) : ''; $deliveryArray = $model->getDeliveryMethod(); $response['deliveryArray'] = $deliveryArray; $paymentArray = array(); $i = 1; while ($payment = $model->getPaymentMethod($i)) { $paymentArray[$i] = $payment; $i++; } $response['paymentArray'] = $paymentArray; $this->data = $response; return true; }
/** * При добавлении нового заказа проверям, нет ли партнерской куки. */ static function partnerToOrder($arg) { $partnerId = self::getPartnerCookie(); $partner = self::getPartner(self::getPartnerCookie($partnerId)); $orderId = $arg['result']; if (!empty($partner) && $orderId) { $model = new Models_Order(); $order = $model->getOrder(PREFIX . 'order.id=' . $orderId); $summ = $partner['percent'] * $order[$orderId]['summ'] / 100; self::addConnetcToPartner($partnerId, $orderId, $partner['percent'], $summ); } return $arg['result']; }
function __construct() { $lang = MG::get('lang'); $settings = MG::get('settings'); $this->lang = $lang; $status = 0; if (User::isAuth()) { $order = new Models_Order(); $status = 3; //обработка запроса на изменение данных пользователя if (URL::getQueryParametr('userData')) { $customer = URL::getQueryParametr('customer'); $userData = array('name' => URL::getQueryParametr('name'), 'sname' => URL::getQueryParametr('sname'), 'address' => URL::getQueryParametr('address'), 'phone' => URL::getQueryParametr('phone'), 'nameyur' => $customer == 'yur' ? URL::getQueryParametr('nameyur') : '', 'adress' => $customer == 'yur' ? URL::getQueryParametr('adress') : '', 'inn' => $customer == 'yur' ? URL::getQueryParametr('inn') : '', 'kpp' => $customer == 'yur' ? URL::getQueryParametr('kpp') : '', 'bank' => $customer == 'yur' ? URL::getQueryParametr('bank') : '', 'bik' => $customer == 'yur' ? URL::getQueryParametr('bik') : '', 'ks' => $customer == 'yur' ? URL::getQueryParametr('ks') : '', 'rs' => $customer == 'yur' ? URL::getQueryParametr('rs') : ''); if (USER::update(User::getThis()->id, $userData)) { $message = 'Данные успешно сохранены'; } else { $error = 'Не удалось сохранить данные ' . $this->_newUserData['sname']; } } // Обработка запроса на изменения пароля. if (URL::getQueryParametr('chengePass')) { if (USER::auth(User::getThis()->email, URL::getQueryParametr('pass'))) { $person = new Models_Personal(); $message = $person->changePass(URL::getQueryParametr('newPass'), User::getThis()->id); } else { $error = 'Неверный пароль'; } } // Обработка запроса на изменения способа оплаты. if (URL::getQueryParametr('changePaymentId')) { $order = new Models_Order(); $status = $order->updateOrder(array('payment_id' => $_POST['changePaymentId'], 'id' => $_POST['orderId'])); $result = array('status' => $status, 'comment' => 2, 'orderStatus' => 3); echo json_encode($result); MG::disableTemplate(); exit; } // Обработка AJAX запроса на закрытие заказа. if (URL::getQueryParametr('delOK')) { $comment = 'Отменено покупателем, по причине <br>"' . URL::getQueryParametr('comment') . '"'; // Пересчитываем остатки продуктов из заказа. $orderModel = new Models_Order(); $orderModel->refreshCountProducts(URL::getQueryParametr('delID'), 4); $res = DB::query(' UPDATE `' . PREFIX . 'order` SET close_date = now(), status_id = 4, comment = "%s" WHERE id = %d AND user_email = "%s"', $comment, URL::getQueryParametr('delID'), User::getThis()->email); if ($res) { $status = true; } if ($comment) { $comm = "<b>Комментарий: " . $comment . "</b>"; } $result = array('status' => $status, 'comment' => $comm, 'orderStatus' => $lang[$order->getOrderStatus(array('status_id' => 4))]); $orderModel->sendMailOfUpdateOrder(URL::getQueryParametr('delID')); echo json_encode($result); MG::disableTemplate(); exit; } // Отображение данных пользователя. $orderArray = $order->getOrder('user_email = "' . User::getThis()->email . '"', TRUE); if (is_array($orderArray)) { foreach ($orderArray as $orderId => $orderItems) { $orderArray[$orderId]['string_status_id'] = $order->getOrderStatus($orderItems); $paymentArray = $order->getPaymentMethod($orderItems['payment_id']); $orderArray[$orderId]['name'] = $paymentArray['name']; $orderArray[$orderId]['paided'] = $order->getPaidedStatus($orderItems); } } if (!User::getThis()->activity) { $status = 2; unset($_SESSION['user']); } if (User::getThis()->blocked) { $status = 1; unset($_SESSION['user']); } $paymentList = $order->getPaymentBlocksMethod(); } else { MG::redirect('/enter'); } $this->data = array('error' => !empty($error) ? $error : '', 'message' => !empty($message) ? $message : '', 'status' => !empty($status) ? $status : '', 'userInfo' => User::getThis(), 'orderInfo' => !empty($orderArray) ? $orderArray : '', 'currency' => $settings['currency'], 'paymentList' => $paymentList, 'meta_title' => 'Личный кабинет', 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "заказы,личные данные, личный кабинет", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "В личном кабинете нашего сайта вы сможете отслеживать состояние заказов и менять свои данные"); }
public function privat24($paymentID, $paymentStatus) { $order = new Models_Order(); if ('result' == $paymentStatus && isset($_POST)) { $payment = $_POST['payment']; if ($payment) { $payment_array = array(); parse_str($payment, $payment_array); $state = trim($payment_array['state']); $paymentOrderId = trim($payment_array['order']); $orderNumber = trim($payment_array['ext_details']); $paymentAmount = trim($payment_array['amt']); switch ($state) { case 'not found': $msg = "Платеж не найден"; return $msg; break; case 'fail': $msg = "Ошибка оплаты"; return $msg; break; case 'incomplete': $msg = "Пользователь не подтвердил оплату"; return $msg; break; case 'wait': $msg = "Платеж в ожидании"; return $msg; break; } if (empty($paymentOrderId)) { $msg = "Оплата не удалась"; return $msg; } if (!empty($paymentAmount) && !empty($paymentOrderId)) { $orderInfo = $order->getOrder(" id = " . DB::quote($paymentOrderId, 1)); $paymentInfo = $order->getParamArray($paymentID, $paymentOrderId, $orderInfo[$paymentOrderId]['summ']); $merchant = $paymentInfo[0]['value']; $pass = $paymentInfo[1]['value']; } if (empty($orderInfo)) { $msg = "ERR: НЕКОРРЕКТНЫЕ ДАННЫЕ ЗАКАЗА"; return $msg; } $amt = round($orderInfo[$paymentOrderId]['summ'], 2) + round($orderInfo[$paymentOrderId]['delivery_cost'], 2); $payment = 'amt=' . $amt . '&ccy=UAH&details=заказ на ' . SITE . '&ext_details=' . $orderNumber . '&pay_way=privat24&order=' . $paymentOrderId . '&merchant=' . $merchant; $signature = sha1(md5($payment . $pass)); $paymentSignatureString = 'amt=' . round($payment_array['amt'], 2) . '&ccy=' . $payment_array['ccy'] . '&details=' . $payment_array['details'] . '&ext_details=' . $payment_array['ext_details'] . '&pay_way=' . $payment_array['pay_way'] . '&order=' . $payment_array['order'] . '&merchant=' . $payment_array['merchant']; $paymentSignature = sha1(md5($paymentSignatureString . $pass)); if ($paymentSignature !== $signature) { $msg = "Подписи не совпадают!"; return $msg; } $this->actionWhenPayment(array('paymentOrderId' => $paymentOrderId, 'paymentAmount' => $paymentAmount, 'paymentID' => $paymentID)); $msg = 'Вы успешно оплатили заказ №' . $orderInfo[$paymentOrderId]['id']; $msg .= $this->msg; } else { $msg = 'Оплата не удалась'; } } else { $msg = 'Оплата не удалась'; } return $msg; }
/** * Запрос заказов */ public function query() { $orderModel = new Models_Order(); $ordersArr = $orderModel->getOrder('`updata_date`>`1c_last_export`'); $listModifyOrderId = '0'; $nXML = '<?xml version="1.0" encoding="utf-8"?> <КоммерческаяИнформация ВерсияСхемы="2.04" ДатаФормирования="' . date('Y-m-d') . '"> '; $xml = new XMLWriter(); $xml->openMemory(); $xml->setIndent(true); foreach ($ordersArr as $order) { $xml->startElement("Документ"); $xml->writeElement("Ид", $order['number']); $listModifyOrderId .= ',' . $order['id']; $xml->writeElement("Номер", $order['number']); $xml->writeElement("Дата", date('Y-m-d')); $xml->writeElement("ХозОперация", 'Заказ товара'); $xml->writeElement("Роль", 'Продавец'); $xml->writeElement("Валюта", 'руб'); $xml->writeElement("Курс", 1); $xml->writeElement("Сумма", $order['summ']); $xml->startElement("Контрагенты"); $xml->startElement("Контрагент"); $xml->writeElement("Ид", $order['user_email']); $xml->writeElement("Наименование", $order['user_email']); $xml->writeElement("Роль", "Покупатель"); $xml->writeElement("ПолноеНаименование", $order['user_email']); $xml->writeElement("Имя", $order['name_buyer']); $xml->startElement("АдресРегистрации"); $xml->writeElement("Представление", $order['address']); $xml->startElement("АдресноеПоле"); $xml->writeElement("Тип", 'Страна'); $xml->writeElement("Значение", 'RU'); $xml->endElement(); //АдресноеПоле $xml->endElement(); //АдресРегистрации $xml->startElement("Контакты"); $xml->startElement("Контакт"); $xml->writeElement("Тип", 'Телефон'); $xml->writeElement("Значение", $order['phone']); $xml->endElement(); //Контакт $xml->startElement("Контакт"); $xml->writeElement("Тип", 'Почта'); $xml->writeElement("Значение", $order['user_email']); $xml->endElement(); //Контакт $xml->endElement(); //Контакты $xml->endElement(); //Контрагент $xml->endElement(); //Контрагенты $xml->startElement("Товары"); $products = unserialize(stripslashes($order['order_content'])); foreach ($products as $product) { $xml->startElement("Товар"); $xml->writeElement("Ид", $product['id']); $xml->writeElement("Наименование", htmlspecialchars_decode($product['name'])); $xml->writeElement("ЦенаЗаЕдиницу", $product['price']); $xml->writeElement("Количество", $product['count']); $xml->writeElement("Сумма", $product['price'] * $product['count']); $xml->startElement("ЗначенияРеквизитов"); $xml->startElement("ЗначениеРеквизита"); $xml->writeElement("Наименование", 'ВидНоменклатуры'); $xml->writeElement("Значение", 'Товар'); $xml->endElement(); //ЗначениеРеквизита $xml->startElement("ЗначениеРеквизита"); $xml->writeElement("Наименование", 'ТипНоменклатуры'); $xml->writeElement("Значение", 'Товар'); $xml->endElement(); //ЗначениеРеквизита $xml->endElement(); //ЗначенияРеквизитов $xml->endElement(); //Товар } $xml->endElement(); //Товары $xml->startElement("ЗначенияРеквизитов"); $arrayStatus = array(1 => 'Подтвержден', 2 => 'Собран', 6 => 'Собран', 3 => 'Отгружен', 4 => 'Отменен', 5 => '[F] Доставлен', 0 => '[N] Принят'); if ($order['status_id']) { $xml->startElement("ЗначениеРеквизита"); $xml->writeElement("Наименование", 'Статус заказа'); $xml->writeElement("Значение", $arrayStatus[$order['status_id']]); $xml->endElement(); //ЗначениеРеквизита if ($order['status_id'] == 4) { $xml->startElement("ЗначениеРеквизита"); $xml->writeElement("Наименование", 'Отменен'); $xml->writeElement("Значение", 'true'); $xml->endElement(); } } $xml->endElement(); //ЗначенияРеквизитов $xml->endElement(); // Документ } $nXML .= $xml->outputMemory(); //$nXML = mb_convert_encoding($nXML, "WINDOWS-1251", "UTF-8"); $nXML .= '</КоммерческаяИнформация>'; if ($listModifyOrderId != '0') { DB::query('UPDATE ' . PREFIX . 'order SET `1c_last_export` = now() WHERE id IN(' . DB::quote($listModifyOrderId, 1) . ')'); } header("Content-type: text/xml; charset=utf-8"); echo ""; echo $nXML; }
/** * Возвращает сообщение о статусе заказа "Подтвержден". * @param type $pay - id заказа. * @return mixed - сообщение и email пользователя. */ public function confirmOrder($id) { // Модель для работы заказом. $model = new Models_Order(); // Информация о заказе по переданному id. $orderInfo = $model->getOrder(PREFIX . 'order.id = "' . $id . '"'); $hash = URL::getQueryParametr('sec'); // Информация о пользователе, сделавший заказ . $orderUser = USER::getUserInfoByEmail($orderInfo[$id]['user_email']); // Если присланный хэш совпадает с хэшом из БД для соответствующего id. if ($orderInfo[$id]['confirmation'] == $hash) { // Если статус заказа "Не подтвержден". if (0 == $orderInfo[$id]['status_id']) { // Подтверждаем заказ. $model->setOrderStatus($id, 1); $orderId = $id; } else { $msg = 'Заказ уже подтвержден и находится в работе. <br> Посмотреть статус заказа Вы можете в <a href="' . SITE . '/personal">личном кабинете</a>.'; } if (!$orderUser->activity) { $userEmail = $orderUser->email; $_SESSION['id'] = $orderUser->id; } } else { $msg = 'Некорректная ссылка.<br> Заказ не подтвержден<br>'; } $result = array('msg' => $msg, 'userEmail' => $userEmail); return $result; }
/** * проверка платежа через Yandex */ public function yandex($paymentID, $paymentStatus) { $order = new Models_Order(); if ('success' == $paymentStatus) { $orderInfo = $order->getOrder(" id = " . DB::quote($_POST['label'], 1)); $msg = 'Вы успешно оплатили заказ №' . $orderInfo[$_POST['label']]['number']; $msg .= $this->msg; } elseif ('result' == $paymentStatus && isset($_POST)) { $paymentAmount = trim($_POST['withdraw_amount']); $paymentOrderId = trim($_POST['label']); if (!empty($paymentAmount) && !empty($paymentOrderId)) { $orderInfo = $order->getOrder(" id = " . DB::quote($paymentOrderId, 1) . " and summ+delivery_cost = " . DB::quote($paymentAmount, 1)); $paymentInfo = $order->getParamArray($paymentID, $paymentOrderId, $orderInfo[$paymentOrderId]['summ']); } // предварительная проверка платежа if (empty($orderInfo)) { echo "ERR: НЕКОРРЕКТНЫЕ ДАННЫЕ ЗАКАЗА"; exit; } $secret = $paymentInfo[1]['value']; $alg = $paymentInfo[3]['value']; $pre_sha = $_POST['notification_type'] . '&' . $_POST['operation_id'] . '&' . $_POST['amount'] . '&' . $_POST['currency'] . '&' . $_POST['datetime'] . '&' . $_POST['sender'] . '&' . $_POST['codepro'] . '&' . $secret . '&' . $_POST['label']; $sha = hash($alg, $pre_sha); if ($sha == $_POST['sha1_hash']) { $this->actionWhenPayment(array('paymentOrderId' => $paymentOrderId, 'paymentAmount' => $orderInfo[$paymentOrderId]['summ'], 'paymentID' => $paymentID)); echo "0"; exit; } else { echo "1"; exit; } } return $msg; }