уу

verify($_GET['email-verify'])) $view->showVerifiedEmail(); else $view->showVerifiedEmailError(); unset($_SESSION['accounts']); }elseif(date('d') < 21 || date('d') > 28) { echo '

Уважаемый абонент!

' . 'Передача показаний приборов учета осуществляется только с 21 по 28 число расчетного месяца.

'. 'А сейчас вы можете оплатить электроэнергию в своем личном кабинете.

'; } elseif(isset($_GET['done'])){ //Показания переданы $view = new view(); $view->showDone(); } elseif(isset($_GET['done-email'])){ //Отправлено тестовое письмо для подтверждения email'а $email = isset($_POST['email']) && $_POST['email'] ? htmlspecialchars($_POST['email']) : ''; $view = new view(); try { $account = ''; foreach ($_SESSION['accounts'] as $key => $obj) { $account = $key; break; } if(!$account) return Header('Location: /peredat-pokazaniya/'); else { $confirm = new emailComfirm(); $confirm->send($account, $email); $view->showDoneEmail($email); } } catch (Exception $e) { $view->showDoneEmail($email, $e->getMessage()); } } else { //Передача показаний try { $postAccount = isset($_POST['account']) && $_POST['account'] ? intval($_POST['account']) : ''; $postCaptcha = isset($_POST['g-recaptcha-response'])? $_POST['g-recaptcha-response'] : ''; $postData = isset($_POST['data']) && is_array($_POST['data'])? array_map('intval', $_POST['data']) : array(); $captcha = new captcha(); $billing = new Billing(); $view = new view(); $error = array(); if(isset($_POST['account'])) { //Заполнен номер лицевого счета if(!$captcha->checkCaptcha($postCaptcha)) $error['captcha'] = 1; if(!$accounts = $billing->getAccounts($postAccount)) $error['account'] = 1; if(empty($error)) { $_SESSION['accounts'] = $accounts; $view->showDataForm($error, $accounts, $postData); } else { $view->showAccountForm($error, $postAccount); } } elseif (isset($_POST['data']) && isset($_SESSION['accounts'])) { //Заполнены показания foreach($_SESSION['accounts'] as $acc => $data) if(!isset($postData[$acc]) || !$postData[$acc]) $error['data'][$acc] = 1;//Показания не заполнены elseif($postData[$acc] < $data->counter) $error['data'][$acc] = 2;//Меньше предыдущих показаний elseif(strlen($postData[$acc]) > $data->counterSize) $error['data'][$acc] = 3; //Неверная значность счетчика elseif(empty($error['data']) && !$billing->setReadingsData($acc, $postData[$acc])) $error['data'][$acc] = 4; if(empty($error)) Header('Location: ?done'); else $view->showDataForm($error, $_SESSION['accounts'], $postData); } //Ничего не заполнено else { $view->showAccountForm($error, $postAccount); } } catch (Exception $e) { echo '

Сервис временно недоступен

Обновите страницу или свяжитесь с нами по телефону 8 (495) 133-65-40.
'; echo $e->getMessage(); exit; } } class Billing { public function getAccounts($userId) { if(!$userId) return false; $req = array('command' => 'get', 'account' => $userId); $response = $this->get_url('https://billing.ivseti.org/readings/?' . http_build_query($req)); $content = json_decode($response['content']); if($content->result == 5) return false; if($content->result != 0) throw new \Exception('Billing is not available.'); return $content->data; } public function setReadingsData($account, $value) { $req = array('command' => 'set', 'account' => $account, 'value' => $value); $response = $this->get_url('https://billing.ivseti.org/readings/?' . http_build_query($req)); $content = json_decode($response['content']); if($content->result != 0) throw new \Exception('Billing is not available.'); return $content->data; } public function setEmail($account, $email) { $req = array('command' => 'set', 'account' => $account, 'value' => $email); $response = $this->get_url('https://billing.ivseti.org/emails/?' . http_build_query($req)); $content = json_decode($response['content']); if($content->result != 0) throw new \Exception('Billing is not available.'); return $content->data; } private function get_url( $url ) { $options = array( CURLOPT_RETURNTRANSFER => true, // return web page CURLOPT_HEADER => false, // don't return headers CURLOPT_FOLLOWLOCATION => true, // follow redirects CURLOPT_ENCODING => "", // handle all encodings CURLOPT_USERAGENT => "www.ivseti.org", // who am i CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 3, // timeout on connect CURLOPT_TIMEOUT => 5, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_VERBOSE => true, CURLOPT_SSLCERT=> '/home/ivsetior/ssl-billing/ivsetiorg.crt', CURLOPT_SSLKEY=> '/home/ivsetior/ssl-billing/ivsetiorg.key', CURLOPT_SSLCERTPASSWD => '', CURLOPT_SSLKEYPASSWD => '' ); $ch = curl_init( $url ); curl_setopt_array( $ch, $options ); $content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; $header['errmsg'] = $errmsg; $header['content'] = $content; return $header; } } class captcha { private $api_key = '6LcepRUTAAAAAKezqFEfR0s9Qu8_L6UjrB7124az'; public function checkCaptcha($value) { return true; if(!$value) return false; $req = array('secret' => $this->api_key, 'response' => $value, 'remoteip' => $_SERVER['REMOTE_ADDR']); $response = $this->get_url('https://www.google.com/recaptcha/api/siteverify?' . http_build_query($req)); if($response['errno']) throw new \Exception('ReCaptcha servers is not available.'); $result = json_decode($response['content']); return isset($result->success) && ($result->success == true) ? true : false; } private function get_url( $url ) { $options = array( CURLOPT_RETURNTRANSFER => true, // return web page CURLOPT_HEADER => false, // don't return headers CURLOPT_FOLLOWLOCATION => true, // follow redirects CURLOPT_ENCODING => "", // handle all encodings CURLOPT_USERAGENT => "www.ivseti.org", // who am i CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 3, // timeout on connect CURLOPT_TIMEOUT => 5, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects CURLOPT_SSL_VERIFYPEER => false // Disabled SSL Cert checks ); $ch = curl_init( $url ); curl_setopt_array( $ch, $options ); $content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; $header['errmsg'] = $errmsg; $header['content'] = $content; return $header; } } class emailComfirm { public function send($account, $email) { if(!filter_var($email, FILTER_VALIDATE_EMAIL)) throw new Exception('Укажите правильный email'); $token = md5(uniqid('txt' . $email . rand(0,1000),1)); $mysqli = new mysqli(DB_HOST, DB_USER_NAME, DB_PASSWORD, DB_NAME); $query = $mysqli->prepare('INSERT INTO readings_email (email, token, account, verified, date) VALUES(?,?,?,0, NOW())'); $query->bind_param('ssi', $email, $token, $account); $query->execute(); $query->close(); $mysqli->close(); $subject = 'Проверочное письмо для получения счетов за электроэнергию'; $url = 'http://ivseti.org/peredat-pokazaniya/?email-verify='.$token; $text = ' Доброго дня!

Ваш электронный адрес был указан для получения счетов за электроэнергию от МУП "Ивантеевские Электросети".
Если это сделали вы, пройдите по ссылке для подтвреждения электронного ящика '.$url.'

Если письмо попало к вам по ошибке, пожалуйста, проигнорируйте и удалите его из своего почтового ящика.

---
С уважением,
МУП "Ивантеевские Электросети"
эл.почта: pokazaniya@ivseti.org
тел.: +7 (496) 536-00-42
веб-сайт: http://www.ivseti.org

'; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf8' . "\r\n"; $headers .= 'From: Ивантеевские Электросети ' . "\r\n"; if(!mail($email, $subject, $text, $headers)) throw new Exception('Не удалось отправить письмо'); } public function verify($token) { $id = 0; $email = ''; $account = 0; $mysqli = new mysqli(DB_HOST, DB_USER_NAME, DB_PASSWORD, DB_NAME); $query = $mysqli->prepare('SELECT id, email, account FROM readings_email WHERE token = ? and verified = 0 AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(date) < 60*60*24*3'); $query->bind_param('s', $token); $query->execute(); $query->bind_result($id, $email, $account); $query->fetch(); $query->close(); if($id && $email && $account) { try { $billing = new Billing(); $billing->setEmail($account, $email); $query = $mysqli->prepare('UPDATE readings_email SET verified = 1 WHERE id = ?'); $query->bind_param('i', $id); $query->execute(); return true; } catch (Exception $e) { return false; } } return false; } public function getEmail() { $id = 0; $email = ''; $account = ''; foreach ($_SESSION['accounts'] as $key => $obj) { $account = $key; break; } if(!$account) return Header('Location: /peredat-pokazaniya/'); $mysqli = new mysqli(DB_HOST, DB_USER_NAME, DB_PASSWORD, DB_NAME); $query = $mysqli->prepare('SELECT id, email FROM readings_email WHERE account = ? and verified = 1 ORDER BY id DESC LIMIT 1'); $query->bind_param('s', $account); $query->execute(); $query->bind_result($id, $email); $query->fetch(); $query->close(); return $this->obfuscateEmail($email); } private function obfuscateEmail($email) { if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return ''; $em = explode("@",$email); $name = implode(array_slice($em, 0, count($em)-1), '@'); $len = floor(strlen($name)/2); return substr($name,0, $len) . str_repeat('*', $len) . "@" . end($em); } } class view { public function showAccountForm($error, $postAccount) { $this->showHeader(); ?>

Введите свои данные

  •  
    Неверный номер лицевого счета
    '; ?>
    Посмотрите на своей квитанции

showHeader(); ?>

Введите показания счетчика

  • $data) { ?>
  •  
    '.$errorMsg[$error['data'][$accId]].'
    '; ?>
    Посмотрите на электросчетчике

showHeader(); $emailObj = new emailComfirm(); $email = $emailObj->getEmail(); echo '

Ваши показания успешно приняты

До 5-го числа по почте придет счет для оплаты электроэнергии.
'; if($email) echo 'Счет будет продублирован на электронную почту '. htmlspecialchars($email) . '
'; echo '
Высылать счета '. ($email?'на другой ящик':'по электронной почте') .'

'; } public function showDoneEmail($email = '', $error = '') { $this->showHeader(); if(!$error) echo '

Проверьте электронную почту

Мы отправили вам проверочное письмо, чтобы счет за свет случайно не потерялся.
Пожалуйста, проверьте свою почту и пройдите по ссылке из письма.

Мне не пришло проверочное письмо

'; else echo '

Произошла ошибка

Мы пытались отправить вам проверочное письмо, чтобы счет за свет случайно не потерялся.
И при этом произошла ошибка. Проверьте свой ящик и попробуйте еще раз.


 

'; } public function showVerifiedEmail(){ $this->showHeader(); echo '

Счета будут приходить на электронную почту

Поздравляем, теперь счета за электроэнергию будут поступать вам по электронной почте.

Хотите передать новые показания?

'; } public function showVerifiedEmailError(){ $this->showHeader(); echo '

Произошла ошибка!

Проверочного кода не существует или проверочное письмо отправлено более 3-х суток назад.

Передать показания и повторить запрос

'; } private function showHeader() { echo '' . ''. ''. ' '; } } ?>
Комиссия %

При ошибочном перечислении, денежные средства могут быть возвращены только на Вашу карту.