Radiance |
Дата: Вторник, 22.07.2014, 12:51 | Сообщение # 1
|
Боец
Сообщений: 209
Статус: Offline
|
Итак, есть задача - привязка аккаунта ВК к профилю на сайте. Есть несколько методов - использование OAuth VK, через приложения, и собственные костыли. Решил я предоставить вам этот самый костыль. Итак, для начала, собственно, пошагово разберемся как это будет работать: Цитата 1. Пользователь авторизуется на Вашем сайте. 2. При успешной авторизации извлекаем данные пользователя из таблицы, где эти данные хранятся и проверяем наличие заполнения столбца. Если VKID = 0 -> выбиваем мессагу о том, что необходимо прикрутить ID, если VKID из таблицы больше 0 -> пропускаем привязку и оперируем имеющимися данными дальше, как - вам виднее. 3. Если VKID = 0 выводим скрипт. который будет требовать с нашего юзверя, гада такого, ввести этот ID далее -> сверяемся с базой, если введённый ID уже имеется в базе - шлем его далеко и на долго и снова требуем ввода ID, если ID в базе нет - > переходим к шагу 4. 4. Генерируем уникальный код для проверки и просим пользователя отправить пост с этим кодом к себе на стену ВК. 5. С помощью VK API методом wall/get получаем самую свежую запись со стены пользователя, парсим до нужного нам места. Если текст со стены совпадает с нашим кодом -> заносим в базу VKID, если нет - пользователь, пока. Итак, начнём. Для начала убедимся, работает ли наш сервер с PDO (что это - гуглите. Кратко - более современная библиотека для работы с базами данных. Пытаемся подключиться к БД: Код <?php try { // создаём подключение. $db = new PDO('mysql:host=хост_базы_данных;dbname=имя_базы','имя-пользователя','Пароль'); } catch(PDOException $e) { // если при подключении произошли какие то траблы выдаём мессагу с текстом ошибки die("Error: ".$e->getMessage()); } ?> Если сервер не ругается на синтаксис, и нет ошибок PDO - всё ок, продолжаем. Если нет - грусть и пичаль, устанавливайте либы PDO и читайте далее. Итак, представим - юзер авторизовался на сайте, теперь устраиваем проверку - записан его ID или нет. Приведу пример такой - в сессии есть переменная с именем login, в которой собственно и хранится логин пользователя. Код <?php session_start(); if (empty($_SESSION['login'])){ echo 'Не авторизован жи!'; }else{ include 'pdoconnect.php'; // В файле код выше, т.е. коннект к базе. if ($result = $db->prepare("SELECT * FROM `users` WHERE `login`=:lo")) // тут, думаю, всё понятно
{ $lo = $_SESSION['login']; // присваиваем переменной $lo значение логина из сессии для последующей обработки $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // на всякий случай - выведет эрроры $result->bindParam(":ni",$ni,PDO::PARAM_STR);// благодаря этой строчке мы обрабатываем переменную $lo, приводя её к плейскодеру, что защищает нас от SQL INJ, приводим данные к строке $result->execute(); // выполняем запрос к базу $res = $result->fetch(PDO::FETCH_ASSOC); // результат преобразуем в ассоциативный массив } // далее будем проверять: if ($res['vkid'] = 0){ echo ' Необходимо привязать ID VK'; // далее сгенерируем код для проверки, что именно туда пихать - дело ваше. Я просто помещу логин из сессии $key = md5($_SESSION['login']; $_SESSION['prov_key'] = $key; // поместили код в сессию // здесь можно вывести форму для вставки ID }else{ // что то там, если VK ID имеется и не равен 0 } ?>
Вот, собственно, проверка у нас уже есть. Теперь обрисуем наши действия, если ID равен 0: Код <p>Для привязки аккаунта ВК добавьте на стену пост с текстом: <? echo $_SESSION['prov_key']; ?>, заполните форму и нажмите "продолжить"</p> <form action = "" method = "post">
<p>Введите ID </p> <p><input type = "number" name = "vkid"></p> <button type = "submit">Продолжить</button> </form> <?php $vkid = $_POST[''vkid']; if (empty($vkid)){ echo 'ID НЕ ВВЕДЁН!'; }else{ $qw = file_get_contents("https://api.vk.com/method/wall.get?v=5.3&filter=owner&owner_id=$vkid&count=1"); // запрос к апи $json = json_decode($qw , true);// разбираем JSON, пришдший от вкапи
if ($json["response"]["items"][0]["text"] == $_SESSION['prov_key']){// проверяем, если код со стены такой же, что и в сессии, то if ($result = $db->prepare("INSERT INTO `users`(`vkid`, `prov_key`) VALUES (?, ?)")) { $id = $vkid; $prov_key = $_SESSION['prov_key']; $data = array ( $id, $prov_key); // помещаем данные в массив $result->execute($data); // отправляем } echo 'ID успешно привязан'; }else{ echo 'Ошибка, коды не совпадают!'; } } ?>
Вот так всё просто, Писалось на скорую руку, так что тапками не кидаемся, а принимаем на вооружение
Радик камбек :D
|
|
|
|