Как создать бота в Телеграм для получения оповещений с форм сайта

В принципе, данная инструкция может быть актуальной и для других форм и плагинов, для которых нужен бот в Телеграм. Суть у всех одна, боты создаются одинаково. Главное что нужно после создания это Токен вашего бота и ID чата куда он добавлен или чата самого бота.

Если подключить к форме отправку на Телеграм или вы используете один из моих плагинов, то вы будете получать оповещения прям в мессенджер.

Как создать бота
1. Первым делом, у вас должен быть установлен мессенджер Telegram. На телефоне или ПК, а желательно и там и там. Я буду показывать на примере ПК, но на телефоне все то же самое.

2. Далее нужно найти через поиск в мессенджере главного бота, что создает других. Это BotFather - единственный бот, который управляет ими всеми. Используйте его для создания новых учетных записей ботов и управления существующими ботами. Найдите и нажмите на него, чтобы открылся его чат.

3. Теперь нужно запустить BotFather. Для этого нужно нажать кнопку ЗАПУСТИТЬ внизу чата или написать в чат /start, если вместо кнопки у вас поле для ввода.

4. После запуска появится список команд, переместитесь в начало сообщения и нажмите на команду /newbot или просто пропишите эту команду через поле сообщения.

5. Теперь BotFather предложит вам назвать своего бота. Это название вы будете видеть в списке контактов. В примере бот назван как testmailbot. Можете называть как угодно, например: Бот для формы контактов, Бот какого-то плагина, Мой бот с сайта и тд. Без разницы, лишь бы вы понимали что это за бот и если у вас их будет много, вы их не путали.

6. Далее BotFather предложит вам указать имя бота. Вот тут нужно быть внимательным. Имя бота вводится только латиницей и в конце должно заканчиваться на bot. В примере это testmailbot_bot. Задавайте что хотите, если имя будет существовать, BotFather вас предупредит. Так что придумайте что-то уникальное.

7. Если вы задали правильное имя, то BotFather напишет вам, что все готово и вашему боту присвоен Токен, который понадобится для доступа через HTTP API. Этот токен нам и нужен для того, чтобы формы отправляли свои данные в Телеграм.

8. Теперь найдем и запустим нашего бота. Для этого в поиске контактов в Telegram найдите бота и нажмите на него.

9. Так же нужно запустить бота. Внизу есть кнопка ЗАПУСТИТЬ или напишите в чат /start, если вместо кнопки у вас поле для ввода.

Это еще не конец. Если вы не хотите создавать групповой чат для многих ботов, если у вас одна форма или один плагин или вы хотите чтобы данные со всех форм приходили только к одному боту, что вполне нормально, то можно пропустить следующие 4 шага и перейти к пункту - 12.

8. Чтобы добавить бота в групповой чат, если вы захотите иметь несколько ботов для нескольких форм, то вам нужно перейти в настройки Telegram и выбрать пункт - Создать группу.

9. Далее нужно ввести название для группы. Вводите какое вам нравится.

10. Теперь нужно добавить участников в группу, то бишь нашего бота. Есть 2 способа. Можно просто на странице самого бота нажать на его настройки и там выбрать пункт Добавить в группу. После чего вам предложит ваши собственные группы. Выберите ту что создали только что для ботов и все. Второй вариант - нажмите на настройки группы и выберите пункт - Добавить участников.

11. Перед вами появится окно поиска, введите в поле имя своего бота, то что вводили в пункте 6. Возможно, найдется несколько ботов, но только у одного будет точное название, в нашем примере это @testmailbot_bot. Когда найдете своего бота, выделите и нажмите кнопку - Добавить.

12. Последнее что нужно сделать чтобы передавать данные с форм которые поддерживают передачу на Телеграм, это получить ID чата. Тут два варианта. Если вы используете только чат бота, то ID один, если чат группы с ботами, то ID другой. Чтобы узнать нужный ID, нужно в адресной строке браузера перейти по ссылке, которую нужно сформировать.

https://api.telegram.org/botХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ/getUpdates

Вместо ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ нужно вставить тот токен, который вам дал BotFather в пункте 7, этой инструкции.

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


12. Последнее что нужно сделать чтобы передавать данные с форм которые поддерживают передачу на Телеграм, это получить ID чата. Тут два варианта. Если вы используете только чат бота, то ID один, если чат группы с ботами, то ID другой. Чтобы узнать нужный ID, нужно в адресной строке браузера перейти по ссылке, которую нужно сформировать.

https://api.telegram.org/botХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ/getUpdates

Вместо ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ нужно вставить тот токен, который вам дал BotFather в пункте 7, этой инструкции.

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

Рекомендую открывать ссылку в браузере Mozilla Firefox. В нем данные отображаются сгруппировано и очень легко понять где нужный ID. Где чат бота, где чат группы, если вы в нее добавили бота.


Как видите, по изображению видно что вначале показывает ID чата бота с моим именем, у вас будет с вашим, после того как вы напишите что-нибудь боту. Ну а далее ID группы, в которую мы добавили нашего бота в пункте 9/10.

Много непонятного, но среди этого кода нужно всего одно значение. Какое, зависит от того используете ли вы лишь бота или чат. Если только бота то ищите, ID такого типа - "id":380199086,"first_name". И з этого вам нужно только номер 380199086. Если у вас группа с ботами, то такого "id":-1011500162037. У ID груп стоит черточка в начале. Вам, опять же, нужен номер только с черточкой -1011500162037. Если, вдруг, вы добавили токен и ID в форму, а сообщения не приходят, то попробуйте другой. Сложностей не должно возникнуть.

После успешного добавления испытайте плагин или форму. Вы должны получить оповещение на Telegram, в моем примере, это выглядело так:

Теперь у вас есть и токен и нужный ID. Они вам потребуются чтобы их добавить в настройках моих плагинов, других разработчиков, в свои собственные формы, если вы такие создаете.

Добавлено: 15 Мая 2021 07:58:40 Добавил: Андрей Ковальчук

Определяем, сколько человек онлайн в вашей группе

Для работы скрипта будем использовать библиотеку, созданную ранее в посте Автоматический постинг в ВКонтакте на стену группы или пользователя. Оттуда нам понадобиться только один файл с библиотекой vk.php.

По задаче, нам требуется определить сколько человек находится в онлайн в текущий момент. Как такогого функционала у самой соц. сети ВКонтакте нет, зато есть общедоступное Api. Сам по себе алгоритм достаточно прост, для его реализации мы будем использовать только две функции из api: groups.getMembers и users.search.

Перед тем, как приступить, необходимо получить access_token для работы с api ВКонтакте, для этого вобъём ссылку в адресную строку браузера:

http://oauth.vk.com/authorize?client_id=YOUR_CLIENT_ID&scope=wall,offline&redirect_uri=http://oauth.vk.com/blank.html&response_type=token

Соответственно YOUR_CLIENT_ID вы должны заменить на ID своего приложения. В итоге мы получаем некую ссылку с нашим токеном. Теперь создадим файлик vk_group_online.php с таким содержимым:

<?
include "vk.php";
$access_token = "ACCESS_TOKEN";
$group_id = "GROUP_ID";

//Инициализируем класс
$vk = new Model_Vk($access_token);

//Получаем список пользователей
$page = 0;
$limit = 1000;
$online = 0;
do {

    //Получаем список пользователей
    $members = $vk->method("groups.getMembers", array(
        "group_id" => $group_id,
        "offset" => $page * $limit,
        "count" => $limit
    ));

    //Спим
    sleep(1);

    //Получаем данные пользователей
    $users = $vk->method("users.get", array(
        "user_ids" => implode(",", $members->response->users),
        "fields" => "online"
    ), true);

    //Проходим по списку, считаем онлайн
    foreach( $users->response as $user ) {
        if( $user->online ) {
            $online++;
        }
    }
    sleep(1);

    //Увеличиваем страницу
    $page++;
} while( $members->response->count > $page * $limit );

echo "Online: " . $online . PHP_EOL;

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

$ php vk_group_online.php

Добавлено: 08 Апреля 2021 09:03:44 Добавил: Андрей Ковальчук

Как добавить в свою форму отправки писем reCAPTCHA v3

Что же такое reCAPTCHA v3? Это скрытая капча от Google. Ее суть в том, что не надо больше ставить галочки, для того чтобы отправить письмо. Она просто проверяет как вы ведете себя на странице, похожи ли ваши действия на человека, а не робота и как вы просматриваете страницы, через обычный браузер или с использованием каких-то плагинов, скрытых сетей и тд.

Я перебрал много вариантов и описаний решений, для реализации того, что мне нужно. Сам же Google подробных инструкций не дает. Там общая инструкция по которой ничего не понятною.

Первое что вам нужно сделать, это авторизоваться на сервисе reCAPTCHA и получить ключи для нужного вам сайта. Инструкцию по этому делать смысла нет, их сотни, да там и так все интуитивно понятно. Если вы имеете свою PHP форму, написанную своими руками, то думаю, такая простая вещь, как получение ключей, для вас не проблема. Вам понадобятся - ключ сайта и секретный ключ. Еще раз повторюсь, вам надо ключи для reCAPTCHA v3, именно третяя версия, не вторая, та что с галочкой, а именно невидимая reCAPTCHA v3.

Теперь самая тяжелая часть - код. Для начала нужно подключить API JavaScript для reCAPTCHA. Данная строка в коде должна быть ниже библиотеки jQuery. Если нет, то это нужно сделать.

<script async src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY_HERE"></script>

YOUR_SITE_KEY_HERE - нужно заменить на ваш ключ сайта, что вы получили. Не перепутайте с секретным ключом, его показывать на фронтенде нельзя, только ключ сайта!

Следующим шагом нужно добавить скрытое поле к вашей форме отправки письма на PHP. Его надо добавить перед кнопкой отправки формы.
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">

После этого надо вызывать grecaptcha.execute, которая будет генерировать токен и передавать данные с формы уже на сторону сервера, где будет сверка с секретным ключом.
<script>
jQuery(document).ready(function() {
grecaptcha.ready(function () {
   grecaptcha.execute('YOUR_SITE_KEY_HERE', { action: 'contact' }).then(function (token) {
      var recaptchaResponse = document.getElementById('recaptchaResponse');
      recaptchaResponse.value = token;
       
      // СЮДА НАДО ДОБАВИТЬ ВАШУ AJAX ОТПРАВКУ ДАННЫХ
       
   });
});
});
</script>

Сам код заключен в тегах script для вставки в HTML среду, например сразу после формы, если у вас лендинг. Если вы хотите добавлять в отдельный файл то теги script нужно убрать в начале и в конце.

YOUR_SITE_KEY_HERE - опять как и выше, нужно заменить на ваш ключ сайта, не секретный, только ключ сайта! После комментария - "сюда надо добавить вашу Ajax отправку данных" или вместо него, вы должны добавить свой код Ajax отправку данных. Ниже я приведу пример, его нельзя использовать в своем коде, это просто пример!
//НЕ ДОБАВЛЯЙТЕ ЭТОТ КОД - ЭТО ПРОСТО ПРИМЕР!
   jQuery.ajax({
        url: "ajax_form.php",
        type:"POST",
        dataType: "html",
        data: jQuery("#ajax_form").serialize(),
        success: function(response) { 
             alert("Mail send!");
        },
        error: function(response) {
            alert("Error");
        }
    });

Больше ничего менять вам в скрипте не нужно. Оставьте все как есть. Далее переходим к следующему шагу.

Последний шаг - это проверка на стороне сервера, то бишь код нужно добавлять в ваш файл PHP, в котором у вас mail() функция отправки письма. Вам нужно открыть его и переделать. Данный код нужно разместить в самом начале файла перед вашим кодом.
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = 'YOUR_SECRET_KEY_HERE';
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if ($recaptcha->success == true && $recaptcha->score >= 0.5 && $recaptcha->action == 'contact') {
 
//ТУТ КОД ВАШЕЙ ОТПРАВКИ ЕСЛИ ВСЕ ОК
 
} 
    else
{
//ТУТ КОД, ЕСЛИ ОТПРАВКА НЕВОЗМОЖНА
}

После того как разместили, вам нужно заменить во второй строке - YOUR_SECRET_KEY_HERE, уже на СЕКРЕТНЫЙ КЛЮЧ.

Так же, вам нужно ваш старый код перенести внутрь данного. Точнее, сразу после комментария - "тут код вашей отправки если все ок". Думаю, логика понятна. Сначала идет проверка не спам, робот ли отправил форму, а уже потом идет ваша отправка письма на почту.

Сам код простой и если вы хоть немного знакомы с PHP, то поймете его логику. Сначала задаем переменную, где подключается API от Google для проверки. После переменная где вы задаете секретный ключ, третья переменная - данные с нашего скрытого поля, которое мы добавляли перед кнопкой отправки. После идет две строки где мы получаем данные, чтобы использовать их в сравнении.

Самим сравнением - if, мы проверяем соответствует ли все параметры для отправки. У нас три параметра - успешность отправленных с формы, оценка отправки и то что мы передали событие action == 'contact'. В третьем шаге, когда мы добавляли скрипт, там вы можете увидеть что в нем есть параметр, где мы задаем такое же название события. Это нужно, если у вас будет несколько форм для которых нужно создавать разные события.

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

В самом начале я сказал, что данный материал требует от вас определенных знаний. Я не могу вам 1 в 1 расписать как сделать правильно вам, потому как каждая форма уникальна и требует своих действий по внедрению в нее reCAPTCHA v3. Данный метод я лично применяю на сайтах где требуется подключение капчи, потому уверен в его работоспособности.

Добавлено: 21 Марта 2021 10:05:50 Добавил: Андрей Ковальчук

Как добавить в свою форму отправки писем reCAPTCHA v3

Что же такое reCAPTCHA v3? Это скрытая капча от Google. Ее суть в том, что не надо больше ставить галочки, для того чтобы отправить письмо. Она просто проверяет как вы ведете себя на странице, похожи ли ваши действия на человека, а не робота и как вы просматриваете страницы, через обычный браузер или с использованием каких-то плагинов, скрытых сетей и тд.

Я перебрал много вариантов и описаний решений, для реализации того, что мне нужно. Сам же Google подробных инструкций не дает. Там общая инструкция по которой ничего не понятною.

Первое что вам нужно сделать, это авторизоваться на сервисе reCAPTCHA и получить ключи для нужного вам сайта. Инструкцию по этому делать смысла нет, их сотни, да там и так все интуитивно понятно. Если вы имеете свою PHP форму, написанную своими руками, то думаю, такая простая вещь, как получение ключей, для вас не проблема. Вам понадобятся - ключ сайта и секретный ключ. Еще раз повторюсь, вам надо ключи для reCAPTCHA v3, именно третяя версия, не вторая, та что с галочкой, а именно невидимая reCAPTCHA v3.

Как добавить в свою форму отправки писем reCAPTCHA v3

Теперь самая тяжелая часть - код. Для начала нужно подключить API JavaScript для reCAPTCHA. Данная строка в коде должна быть ниже библиотеки jQuery. Если нет, то это нужно сделать.

<script async src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY_HERE"></script>

YOUR_SITE_KEY_HERE - нужно заменить на ваш ключ сайта, что вы получили. Не перепутайте с секретным ключом, его показывать на фронтенде нельзя, только ключ сайта!

Следующим шагом нужно добавить скрытое поле к вашей форме отправки письма на PHP. Его надо добавить перед кнопкой отправки формы.
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">

После этого надо вызывать grecaptcha.execute, которая будет генерировать токен и передавать данные с формы уже на сторону сервера, где будет сверка с секретным ключом.
jQuery(document).ready(function() {
grecaptcha.ready(function () {
   grecaptcha.execute('YOUR_SITE_KEY_HERE', { action: 'contact' }).then(function (token) {
      var recaptchaResponse = document.getElementById('recaptchaResponse');
      recaptchaResponse.value = token;
       
      // СЮДА НАДО ДОБАВИТЬ ВАШУ AJAX ОТПРАВКУ ДАННЫХ
       
   });
});
});

Сам код заключен в тегах script для вставки в HTML среду, например сразу после формы, если у вас лендинг. Если вы хотите добавлять в отдельный файл то теги script нужно убрать в начале и в конце.

YOUR_SITE_KEY_HERE - опять как и выше, нужно заменить на ваш ключ сайта, не секретный, только ключ сайта! После комментария - "сюда надо добавить вашу Ajax отправку данных" или вместо него, вы должны добавить свой код Ajax отправку данных. Ниже я приведу пример, его нельзя использовать в своем коде, это просто пример!
//НЕ ДОБАВЛЯЙТЕ ЭТОТ КОД - ЭТО ПРОСТО ПРИМЕР!
   jQuery.ajax({
        url: "ajax_form.php",
        type:"POST",
        dataType: "html",
        data: jQuery("#ajax_form").serialize(),
        success: function(response) { 
             alert("Mail send!");
        },
        error: function(response) {
            alert("Error");
        }
    });

Больше ничего менять вам в скрипте не нужно. Оставьте все как есть. Далее переходим к следующему шагу.

Последний шаг - это проверка на стороне сервера, то бишь код нужно добавлять в ваш файл PHP, в котором у вас mail() функция отправки письма. Вам нужно открыть его и переделать. Данный код нужно разместить в самом начале файла перед вашим кодом.
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = 'YOUR_SECRET_KEY_HERE';
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if ($recaptcha->success == true && $recaptcha->score >= 0.5 && $recaptcha->action == 'contact') {
 
//ТУТ КОД ВАШЕЙ ОТПРАВКИ ЕСЛИ ВСЕ ОК
 
} 
    else
{
//ТУТ КОД, ЕСЛИ ОТПРАВКА НЕВОЗМОЖНА
}

После того как разместили, вам нужно заменить во второй строке - YOUR_SECRET_KEY_HERE, уже на СЕКРЕТНЫЙ КЛЮЧ.

Так же, вам нужно ваш старый код перенести внутрь данного. Точнее, сразу после комментария - "тут код вашей отправки если все ок". Думаю, логика понятна. Сначала идет проверка не спам, робот ли отправил форму, а уже потом идет ваша отправка письма на почту.

Сам код простой и если вы хоть немного знакомы с PHP, то поймете его логику. Сначала задаем переменную, где подключается API от Google для проверки. После переменная где вы задаете секретный ключ, третья переменная - данные с нашего скрытого поля, которое мы добавляли перед кнопкой отправки. После идет две строки где мы получаем данные, чтобы использовать их в сравнении.

Самим сравнением - if, мы проверяем соответствует ли все параметры для отправки. У нас три параметра - успешность отправленных с формы, оценка отправки и то что мы передали событие action == 'contact'. В третьем шаге, когда мы добавляли скрипт, там вы можете увидеть что в нем есть параметр, где мы задаем такое же название события. Это нужно, если у вас будет несколько форм для которых нужно создавать разные события.

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

В самом начале я сказал, что данный материал требует от вас определенных знаний. Я не могу вам 1 в 1 расписать как сделать правильно вам, потому как каждая форма уникальна и требует своих действий по внедрению в нее reCAPTCHA v3. Данный метод я лично применяю на сайтах где требуется подключение капчи, потому уверен в его работоспособности.

Добавлено: 12 Марта 2021 10:47:26 Добавил: Андрей Ковальчук

Проложить маршрут на Яндекс.Картах с помощью API

Пример отображения на карте маршрута от Белорусского вокзала до Лефортово:

ymaps.route(['Москва, Белорусский вокзал', 'Москва, Лефортово'], {mapStateAutoApply:true}).then(
  function(route) {
    map.geoObjects.add(route);
    alert('Длина маршрута = ' + route.getHumanLength());
  },
  function(error) {
    alert('Невозможно построить маршрут');
  }
);

Написанное актуально для
Яндекс.Карты API 2

Добавлено: 30 Июля 2018 08:21:48 Добавил: Андрей Ковальчук

Универсальное сколонение слов на PHP с использованием Яндекс.API

Пример простейшей функции, которая возвращает слово в нужном склонении

<?php
function inflect($what,$inflection_id)
{
   // Функция склонения названий, имен и любой другой фигни
   // Суть функции - ищем слово с нужной формой склонения в базе.
   // Если не нашли - дергаем склонятор Яндекса и кешируем в базу ответ.
   GLOBAL $mysql;
   $inflected="";

   $res_inflected=$mysql->query_to_array("select * from set_of_inflections where `original`='".$what."' and inflection_id='".$inflection_id."' limit 1");
   if(!empty($res_inflected))
   {
     $inflected=$res_inflected['inflected'];
   }
   else
   {

    $parser=xml_parser_create();
    
$data=@file_get_contents('http://export.yandex.ru/inflect.xml?name='.urlencode($what));
// print_r($data);
    if($data){
     xml_parse_into_struct($parser,$data,$structure,$index);
     if($structure){
// print_r($structure);
     foreach($structure as $key)
        {
          if(!isset($key['tag']) || !isset($key['value']))continue;
          elseif($key['tag']=='INFLECTION')
          {
            $inf[$what][$key['attributes']['CASE']]=$key['value'];
            $res_inflected=$mysql->query_to_array("insert into set_of_inflections (`original`, `inflection_id`, `inflected`)
            values ('".$what."',".$key['attributes']['CASE'].",'".$key['value']."')");
            if($key['attributes']['CASE']==$inflection_id)
            {
               $inflected=$key['value'];
            }
          }
        }
         }
    }
    xml_parser_free($parser);
   }
   if($inflected=="") $inflected=$what;
   return $inflected;
}
?>

Описание Яндекс.Склонятора

(c)Илья Артеменко (goblin)

Пример пакетного склонения
Для всех строк в файле file.txt запрашиваются все словоформы и выводятся на экран. Не используйте этот пример повторно, обзательно сохраняйте все в базу, иначе получите бан от яндекса.
<?php
header('Content-Type: text/html ; charset="utf-8"');
$file = file_get_contents('file.txt'); 
$file = explode(chr(10), $file);
$delim = '|';

foreach ($file as $k => $v) {
    $url = "http://export.yandex.ru/inflect.xml?name=$v";
    $xml = simplexml_load_file($url);
    $original = $xml->original;
    $im = trim($xml->inflection[0]);
    $rod = trim($xml->inflection[1]);
    $dat = trim($xml->inflection[2]);
    $vin = trim($xml->inflection[3]);
    $tvor = trim($xml->inflection[4]);
    $predl = trim($xml->inflection[5]);

    echo $im.$delim.$rod.$delim.$dat.$delim.$vin.$delim.$tvor.$delim.$predl.chr(10);
    echo '<br />';
}
?>

Добавлено: 29 Мая 2018 18:49:48 Добавил: Андрей Ковальчук

Как написать свое API

В этой статье я хочу рассказать о том, как можно написать api для своего сервиса. Сделаем сервис по проверки корректности e-mail адреса. То есть, мы будем вызывать нашу api функцию, передавать ей параметр, в данном случае e-mail, а в ответ api должно вернуть результат проверки или код ошибки.
Для начала нужно определиться, что и как будет отвечать api. Я думаю, самый простой способ сделать ответ в формате JSON. А возвращать будем ассоциативный массив, состоящий из трех массивов: status, response и error. Status может иметь только два значения, OK и ERROR – это будет обозначать, как прошло обращение к api. Error – тут мы будем передавать числовой код ошибки, если ошибки нет, то передавать будем 0. Response – этот массив будет хранить интересующий ответ: true – если, e-mail адрес корректный или false, если e-mail не корректный.
В теории, надеюсь все ясно, теперь непосредственно код. Создадим скрипт api.php:

<?php
$status = 'OK';
$response = null;
$error = 0;
if(!isset($_GET['email'])){ // если не получили параметр
    $status = 'ERROR';
    $error = 1;
}else{
    $email = $_GET['email'];
    if(preg_match("|^[-0-9a-z_\.]+@[-0-9a-z_^\.]+\.[a-z]{2,6}$|i", $email)){ // проверяем корректрость e-mail
        $response = true;
    }else{
        $response = false;
    }
}
// массив для ответа
$result = array(
    'status' => $status,
    'response' => $response,
    'error' => $error,
);
echo json_encode($result); // ответ в формате json
?>

Все, наше api готова, теперь попробуем сделать вызов нашей api функции, для этого создадим скрипт api_test.php
<?
$email = 'test@test.ru';
$resp = file_get_contents('http://myService.ru/api.php?email='.$email);
$data = json_decode($resp, true);
if($data['status']=='OK'){
    if($data['response']){
        echo 'E-mail корректный';
    }else{
        echo 'E-mail НЕ корректный';
    }
}else{
    echo 'Код ошибки: '.$data['error'];
}
?>

В скрипте мы пробовали вызывать api в php скрипте, но также можно сделать вызов с помощью java script
<script type="text/javascript">
var email = "test@test.ru";
$.ajax({
    url: 'http://myService.ru/api.php?email='+email,
    dataType : "json",
    success: function (data) {
        console.log(data);
        if(data['status'] == 'OK'){
            if(data['response'] === true){
                alert('e-mail корректный');
            }else{
                alert('e-mail НЕ корректный');                  
            }
        }
    }               
});
</script>

Добавлено: 09 Мая 2018 17:29:34 Добавил: Андрей Ковальчук

Получаем количество Twitter последователей на чистом PHP

Сегодня мы посмотрим на простую реализацию скрипта с помощью которого можно получить число ваших последователей на Twitter.

Можете пользоваться данным скриптом на своё усмотрение.

Во-первых, создаём файл Cache.php и копируем туда код:

/**
* @desc Class реализация кэш функциональности
*/
class Cache
{
    const PATH_TO_CACHE = 'cache/';
 
    /**
    * @desc считать данные из кэша
    * @param string $fileName - название кэш файла
    * @return bool/string
    * Usage: Cache::read('fileName.extension')
    */
    function read($fileName)
    {
        $fileName = self::PATH_TO_CACHE . $fileName;
        if (file_exists($fileName)) {
            $handle = fopen($fileName, 'rb');
            $data = fread($handle, filesize($fileName));
            $data = unserialize($data);
            // проверка истечения срока жизни кэша
            if (time() > $data[0]) {
                // it expired, delete the file
                @unlink($fileName);
                return false;
            }
            fclose($handle);
            // если кэш валиден, возвращаем данные
            return $data[1];
        } else {
            return false;
        }
    }
 
    /**
    * @desc записать кэш типа key => value
    * @param string $fileName - название кэш файла (ключ)
    * @param mixed $variable - значение
    * @param number $ttl - время жизни файла
    * @return void
    * Usage: Cache::write('fileName.extension', value)
    */
    function write($fileName, $variable, $ttl)
    {
        $fileName = self::PATH_TO_CACHE . $fileName;
        $handle = fopen($fileName, 'a');
        fwrite($handle, serialize(array(time() + $ttl, $variable)));
        fclose($handle);
    }
 
    /**
    * @desc удаление кэш файла
    * @param string $fileName - название кэш файла (ключ)
    * @return void
    * Usage: Cache::delete('fileName.extension')
    */
    function delete($fileName)
    {
        $fileName = self::PATH_TO_CACHE . $fileName;
        @unlink($fileName);
    }
 
}

Данный класс будет использоваться для создания и считки кэша. Так же в классе есть такой параметр как время жизни кэша, так что вы можете быть спокойны о “свежести” информации.

Для работы с Twitter, я заюзаю библиотеку, которую нашёл на Github. Создайте файл TwitterAPIExchange.php и вставьте следующий код:
function getTwitterFollowers($screenName = 'codeforest')
{
    require_once('Cache.php');
    require_once('TwitterAPIExchange.php');
    // данную информаци можно взять при создании Twitter приложения на  http://dev.twitter.com/apps
    $settings = array(
        'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN",
        'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET",
        'consumer_key' => "YOUR_CONSUMER_KEY",
        'consumer_secret' => "YOUR_CONSUMER_SECRET"
    );
 
    $cache = new Cache();
 
    // получаем последователей из кэша
    $numberOfFollowers = $cache->read('cfTwitterFollowers.cache');
    // если кэша нет или время его жизни истекло
    if (false === $numberOfFollowers) {
        // создаём запрос
        $apiUrl = "https://api.twitter.com/1.1/users/show.json";
        $requestMethod = 'GET';
        $getField = '?screen_name=' . $screenName;
 
        $twitter = new TwitterAPIExchange($settings);
        $response = $twitter->setGetfield($getField)
             ->buildOauth($apiUrl, $requestMethod)
             ->performRequest();
 
        $followers = json_decode($response);
        $numberOfFollowers = $followers->followers_count;
 
        // кэшируем информацию на час
        $cache->write('cfTwitterFollowers.cache', $numberOfFollowers, 1*60*60);
    }
 
    return $numberOfFollowers;
}

Теперь, там где вам нужно внедрить функционал воспользуйтесь следующем кодом:
// подключаем файлы!
require_once(getTwitterFollowers.php);
// получаем инфу из Twitter
echo getTwitterFollowers('codeforest');

Добавлено: 07 Мая 2018 06:40:13 Добавил: Андрей Ковальчук

Создание коротких ссылок с помощью Bit.ly

Bit.ly — великолепная служба сокращения ссылок (URL). Эта служба обладает по истине невероятной надежностью, очень маленькой длиной ссылок и представляемой информацией о ссылке (URL).

А раз недавно Bit.ly обновил их API до 3 версии, то и появился дополнительный стимул написать о них. И так, представляем код сниппета на PHP, через который можно создавать короткие URL из длинных и наоборот через Bit.ly.

PHP

/* возвращает короткий url */
function get_bitly_short_url($url,$login,$appkey,$format='txt') {
	$connectURL = 'http://api.bit.ly/v3/shorten?login='.$login.'&apiKey='.$appkey.'&uri='.urlencode($url).'&format='.$format;
	return curl_get_result($connectURL);
}

/* возвращает длинный url */
function get_bitly_long_url($url,$login,$appkey,$format='txt') {
	$connectURL = 'http://api.bit.ly/v3/expand?login='.$login.'&apiKey='.$appkey.'&shortUrl='.urlencode($url).'&format='.$format;
	return curl_get_result($connectURL);
}

/* возвращает result form url */
function curl_get_result($url) {
	$ch = curl_init();
	$timeout = 5;
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
	$data = curl_exec($ch);
	curl_close($ch);
	return $data;
}

/* пример работы функции короткой url ссылки */
$short_url = get_bitly_short_url('http://davidwalsh.name/','davidwalshblog','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
/* пример работы функции длинной url ссылки */
$long_url = get_bitly_long_url($short_url,'davidwalshblog',
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

Все что вам нужно, это пройти регистрацию на сайте Bit.ly и получить appkey и логин (вы должны быть зарегистрированными, чтобы использовать их API). В функциях Вы указываете логин, appkey, длинный или короткий URL и формат, в котором должен выйти результат. Если Вы хотите простую URL ссылку без дополнительной информации, просто используйте формат “txt”. XML или JSON форматы, позволят получить более полную информацию об URL.

Сервис Bit.ly зарекомендовал себя так, что даже Twitter использует его. Что вам еще нужно для рекомендации?

Добавлено: 07 Мая 2018 06:32:26 Добавил: Андрей Ковальчук

Аутентификация через Yandex

Сегодня мы продолжим разговор, посвящённый созданию аутентификации пользователей через социальные сети и сервисы. На этот раз под наш прицел попадает Yandex.

Если кто пропустил предыдущие выпуски, то их можно найти по следующим ссылкам:

Заметка. Как и в предыдущих статьях, пример, созданный в данном уроке, предназначен для работы на локальном сервере.

Шаг 1. Добавление нового приложения
Для начала нам необходимо добавить новое приложение на Yandex. Сделать это можно, пройдя по вот этой ссылке.

Название будет "Yandex Auth". В Правах кликаем на "Яндекс.Логин" и выбираем все подпункты: адрес электронной почты, дата рождения, имя пользователя, ФИО, пол. Если пользователь заполнил эти данные в своём профиле, то в последствии, мы получим к ним доступ. Callback URI выбираем: http://localhost/yandex-auth. Таким образом, на локальном сервере поместим наши файлы в каталог "yandex-auth". Нажимаем на кнопку "Создать".

На следующей странице нам отобразится блок со специальными параметрами:

Отсюда мы можем извлечь такие параметры, как `Id приложения`, и`Пароль приложения`. Запишем их в специальные переменные в файле index.php:

<?php
 
$client_id = '22d7dfc5f4358b47b41f6e1f8a80efa0'; // Id приложения
$client_secret = '721a338df24447efe9080cfd36a2da7a'; // Пароль приложения
$redirect_uri = 'http://localhost/yandex-auth'; // Callback URI

Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = 'https://oauth.yandex.ru/authorize';
 
$params = array(
    'response_type' => 'code',
    'client_id'     => $client_id,
    'display'       => 'popup'
);

С помощью функции http_build_query, передав массив параметров, мы получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран. Тут же, в очередной раз, я воспользовался функцией urldecode. Если этого не сделать, то в сгенерированной ссылке могут появиться закодированные символы слешей, знаков двоеточия и так далее. Если же мы пропустим данную строку через функцию urldecode, то получим:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Yandex</a></p>';
 
// https://oauth.yandex.ru/authorize?response_type=code&client_id=22d7dfc5f4358b47b41f6e1f8a80efa0&display=popup

Ссылка для аутентификации готова. Если мы сформировали все параметры верно и получили правильный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/yandex-auth'). Как и в предыдущих случаях (при работе с Вконтакте, Одноклассниками и Mail.ru), к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой
http://localhost/yandex-auth/?state=&code=3408004

Шаг 3. Получение токена
Если к нам пришёл параметр code, то можем начать процедуру аутентификации. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.

В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `grand_type`, равный значению "authorization_code" - код активации; `code` - url параметр, пришедший от Yandex-а; `client_id` - id приложения; `client_secret` - пароль приложения:
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code'],
        'client_id'     => $client_id,
        'client_secret' => $client_secret
    );
 
    $url = 'https://oauth.yandex.ru/token';
}

Далее нам нужно отправить POST запрос на адрес https://oauth.yandex.ru/token, передав перечисленные параметры. В PHP выполнить POST запрос можно с помощью создания curl-а:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
 
$tokenInfo = json_decode($result, true);

При успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Yandex-а в JSON формате. Данная строка содержит 2 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе, token_type - тип токена:
{
  "access_token": "221b0ff4a4714efd956afe0ae2773ade",
  "token_type": "bearer"
}

Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.

Шаг 4. Получение информации о пользователе
Теперь, когда у нас есть параметры access_token, мы можем сделать запрос к Yandex API и получить информацию о пользователе:
if (isset($tokenInfo['access_token'])) {
    $params = array(
        'format'       => 'json',
        'oauth_token'  => $tokenInfo['access_token']
    );
}

В параметр format передаём значение json - формат возвращаемых данных; в oauth_token записываем access_token - токен доступа, который мы достали по POST запросу в предыдущем шаге.

Для получения информации о пользователе сформированные параметры нам нужно отправить GET запросом по адресу https://login.yandex.ru/info:
$userInfo = json_decode(file_get_contents('https://login.yandex.ru/info' . '?' . urldecode(http_build_query($params))), true);

В результате, если всё было сделано успешно, то получим JSON ответ. Преобразуем его сразу же в массив:
Array
(
    [display_name] => stanislav.protasevich
    [real_name] => Протасевич Станислав
    [sex] => male
    [birthday] => 1988-07-03
    [id] => 203179654
    [default_email] => stanislav.protasevich@yandex.com
    [emails] => Array
        (
            [0] => stanislav.protasevich@yandex.com
        )
)

Если в массиве есть ключ id, то записываем пришедший массив в переменную $userInfo:
if (isset($userInfo['id'])) {
    $userInfo = $userInfo;
    $result = true;
}

Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    <title>Аутентификация через Yandex</title>
</head>
<body>
 
<?php
 
$client_id = '22d7dfc5f4358b47b41f6e1f8a80efa0'; // Id приложения
$client_secret = '721a338df24447efe9080cfd36a2da7a'; // Пароль приложения
$redirect_uri = 'http://localhost/yandex-auth'; // Callback URI
 
$url = 'https://oauth.yandex.ru/authorize';
 
$params = array(
    'response_type' => 'code',
    'client_id'     => $client_id,
    'display'       => 'popup'
);
 
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Yandex</a></p>';
 
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code'],
        'client_id'     => $client_id,
        'client_secret' => $client_secret
    );
 
    $url = 'https://oauth.yandex.ru/token';
 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($curl);
    curl_close($curl);
 
    $tokenInfo = json_decode($result, true);
 
    if (isset($tokenInfo['access_token'])) {
        $params = array(
            'format'       => 'json',
            'oauth_token'  => $tokenInfo['access_token']
        );
 
        $userInfo = json_decode(file_get_contents('https://login.yandex.ru/info' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['id'])) {
            $userInfo = $userInfo;
            $result = true;
        }
    }
}
 
?>
 
</body>
</html>

Шаг 5. Извлечение информации о пользователе
Достаём данные о пользователе из переменной $userInfo:
if ($result) {
    echo "Социальный ID пользователя: " . $userInfo['id'] . '<br />';
    echo "Имя пользователя: " . $userInfo['real_name'] . '<br />';
    echo "Email: " . $userInfo['default_email'] . '<br />';
    echo "Пол пользователя: " . $userInfo['sex'] . '<br />';
    echo "День Рождения: " . $userInfo['birthday'] . '<br />';
}

Шаг 6. Дальнейшие шаги
После этого всё, что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;

На странице выхода из системы просто удаляем сессию с помощью функци и unset.

Итог
Подробную информацию о Yandex OAuth вы сможете найти на сайте Yandex API. Ну вот и всё. С отечественными соц сетями и сервисами мы закончили, а начиная со следующей статьи, приступим к созданию аутентификации через зарубежные социальные сети.

Добавлено: 03 Мая 2018 06:36:48 Добавил: Андрей Ковальчук

Аутентификация через Google

Приветствую Вас, пользователи руселлера! Сегодня мы сделаем ещё один шаг на пути реализации аутентификации через социальные сети. На этот раз возьмёмся за Google.

Прежде чем мы начнём, хочу поблагодарить всех, кто оставляет комментарии к данным статьям! Я принимаю во внимание все пожелания и в последующем постараюсь оправдать Ваши ожидания.

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

Шаг 1. Регистрация нового приложения
Для начала нам необходимо создать новое приложение на сайте Google Console.

В меню, расположенном слева, выбираем пункт "API Access". На открывшейся странице нажимаем на крупную синюю кнопку "Create an OAuth 2.0 client ID...".

Тип приложения (Application Type) выбираем Web Application. Your site and hostname формируем следующим образом: в выподающем списке выбираем http, адрес пишем localhost/google-auth. После того как вы кликните за предел данного текстового поля, введённые нами данные несколько поменяются, так и должно быть. В результате, Google автоматически сформирует Redirect URI.

Далее, всю нужную для аутентификации информацию можем найти на той же странице в Google Console:

Запишем нужные нам данные в файл index.php:

<?php
$client_id = '321934335118-fhpi6i4cpvp3643tvb7ipaha7qb48j3r.apps.googleusercontent.com'; // Client ID
$client_secret = 'hHQRLbR6RJzHPSBPaF4T-Hk0'; // Client secret
$redirect_uri = 'http://localhost/google-auth'; // Redirect URI

Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = 'https://accounts.google.com/o/oauth2/auth';
 
$params = array(
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code',
    'client_id'     => $client_id,
    'scope'         => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
);

С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Google</a></p>';
// https://accounts.google.com/o/oauth2/auth?redirect_uri=http://localhost/google-auth&response_type=code&client_id=333937315318-fhpi4i6cp36vp43b7tvipaha7qb48j3r.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile

Итак, ссылка для аутентификации готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/google-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой
http://localhost/google-auth/?code=4/UTIIYyKbcYV8ruGsLsLqeg-tA3hp.Ys3PTfXQxhUYOl05ti8ZT3b110wOewI

Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.

В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` - id приложения; `client_secret` - секретный ключ; `redirect_uri` - страница, на которую будет возвращён пользователь; `grand_type`, равный значению "authorization_code" - код активации; `code` - url параметр, пришедший от Google:
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'client_id'     => $client_id,
        'client_secret' => $client_secret,
        'redirect_uri'  => $redirect_uri,
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code']
    );
 
    $url = 'https://accounts.google.com/o/oauth2/token';
}

Далее нам нужно отправить POST запрос на адрес https://accounts.google.com/o/oauth2/token, передав перечисленные параметры. В PHP выполнить POST запрос можно с помощью создания curl запроса:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
 
$tokenInfo = json_decode($result, true);

В результате, при успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Google в JSON формате. Данная строка содержит 4 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе; token_type - тип токена; expires_in - время жизни токена; id_token - id токена:
{
  "access_token" : "ya29.AHES6ZTGg0TYv6x-FIGNB438AlH4sTu54C8_6jCJ-GY6b8AeD7NSOxQ",
  "token_type" : "Bearer",
  "expires_in" : 3599,
  "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQwODg0NDZmZjY2YjVjNjY4ZmE5MGJjYTEzZGJhMGI5NjhmMzc3ZGYifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWQiOiIxMDExMDMzMDM1ODE1NjEyNzMwMTQiLCJzdWIiOiIxMDExMDMzMDM1ODE1NjEyNzMwMTQiLCJ0b2tlbl9oYXNoIjoiTlVJU0R6T2lCeGlWQ3hkODM5RGRJZyIsImF0X2hhc2giOiJOVUlTRHpPaUJ4aVZDeGQ4MzlEZElnIiwiZW1haWwiOiJzdGFuaXNsYXYucHJvdGFzZXZpY2hAZ21haWwuY29tIiwiYXVkIjoiMzMzOTM3MzE1MzE4LWZocGk0aTZjcDM2dnA0M2I3dHZpcGFoYTdxYjQ4ajNyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiY2lkIjoiMzMzOTM3MzE1MzE4LWZocGk0aTZjcDM2dnA0M2I3dHZpcGFoYTdxYjQ4ajNyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXpwIjoiMzMzOTM3MzE1MzE4LWZocGk0aTZjcDM2dnA0M2I3dHZpcGFoYTdxYjQ4ajNyLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwidmVyaWZpZWRfZW1haWwiOiJ0cnVlIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiaWF0IjoxMzYzNzcyOTM4LCJleHAiOjEzNjM3NzY4Mzh9.ZFkCkV5HIlQ-IefdCHtRLk0yCu5HRmaI90lmd57GMfxjLRiyjZ3pRUrbSngfwVww0d7RErvemKHJSsHQPk1A0IcVd64JpcR50WNcz7Qxq6SJyzsiHsAQtwvS-xms_Kw8kdoctl_7ZeE9tCD71vtczL429-pNihVY50goaZs5R14"
 
}

Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.

Шаг 4. Получение информации о пользователе
Далее делаем запрос к Google API для получения информации о пользователе. Для этого к параметрам, которые мы сформировали на предыдущем шаге, добавим ещё один - access_token:
if (isset($tokenInfo['access_token'])) {
    $params['access_token'] = $tokenInfo['access_token'];
 
    $userInfo = json_decode(file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo' . '?' . urldecode(http_build_query($params))), true);
    if (isset($userInfo['id'])) {
        $userInfo = $userInfo;
        $result = true;
    }
}

Отправляем GET запрос по адресу https://www.googleapis.com/oauth2/v1/userinfo.

В результате, если всё было сделано правильно, то получим JSON ответ примерно следующего вида:
{
  "id": "101103303581561273014",
  "email": "stanislav.protasevich@gmail.com",
  "verified_email": true,
  "name": "Станислав Протасевич",
  "given_name": "Станислав",
  "family_name": "Протасевич",
  "link": "https://plus.google.com/101103303581561273014",
  "picture": "https://lh6.googleusercontent.com/-11v2dm14whE/AAAAAAAAAAI/AAAAAAAAAGk/KGrBbK8SGJU/photo.jpg",
  "gender": "male",
  "locale": "ru"
}

Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    <title>Аутентификация через Google</title>
</head>
<body>
 
<?php
 
$client_id = '321934335118-fhpi6i4cpvp3643tvb7ipaha7qb48j3r.apps.googleusercontent.com'; // Client ID
$client_secret = 'hHQRLbR6RJzHPSBPaF4T-Hk0'; // Client secret
$redirect_uri = 'http://localhost/google-auth'; // Redirect URIs
 
$url = 'https://accounts.google.com/o/oauth2/auth';
 
$params = array(
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code',
    'client_id'     => $client_id,
    'scope'         => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
);
 
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Google</a></p>';
 
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'client_id'     => $client_id,
        'client_secret' => $client_secret,
        'redirect_uri'  => $redirect_uri,
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code']
    );
 
    $url = 'https://accounts.google.com/o/oauth2/token';
 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($curl);
    curl_close($curl);
    $tokenInfo = json_decode($result, true);
 
    if (isset($tokenInfo['access_token'])) {
        $params['access_token'] = $tokenInfo['access_token'];
 
        $userInfo = json_decode(file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['id'])) {
            $userInfo = $userInfo;
            $result = true;
        }
    }
}
 
?>
 
</body>
</html>

Шаг 5. Извлечение информации о пользователе
Для просмотра большего количества полей загляните в содержание переменной $userInfo:
if ($result) {
    echo "Социальный ID пользователя: " . $userInfo['id'] . '<br />';
    echo "Имя пользователя: " . $userInfo['name'] . '<br />';
    echo "Email: " . $userInfo['email'] . '<br />';
    echo "Ссылка на профиль пользователя: " . $userInfo['link'] . '<br />';
    echo "Пол пользователя: " . $userInfo['gender'] . '<br />';
    echo '<img src="' . $userInfo['picture'] . '" />'; echo "<br />";
}

Шаг 6. И снова дело за вами
Тут всё как и в предыдущих случаях. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.

После этого всё, что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;

На странице выхода из системы просто удаляем сессию с помощью функции unset.

Итог
Всё. Нам осталось разобрать процесс аутентификации через Facebook, и далее мы рассмотрим общий пример с прикруткой к БД.

Добавлено: 03 Мая 2018 06:29:58 Добавил: Андрей Ковальчук

Аутентификация через Mail.ru

Продолжаем цикл статей, посвящённых созданию аутентификации пользователей через социальные сети и сервисы. Сегодня посмотрим, как осуществить подобный функционал через сервис Mail.ru

Если кто пропустил предыдущие выпуски, то их можно найти по следующим ссылкам:

Заметка. Как и в предыдущих статьях, пример, созданный в данном уроке, предназначен для работы на локальном сервере.

Шаг 1. Добавление нового приложения
Для начала нам необходимо добавить новый сайт в нашу учётную запись сервиса Mail.ru. Сделать это можно пройдя по вот этой ссылке. Для работы примера вам нужно будет самим зарегистрировать новое приложение и ввести собственные параметры.

На открывшейся странице, в первую очередь, соглашаемся с правилами размещения сайтов. Далее заполняем форму:

Название будет "Mail.ru Auth". Адрес главной страницы - это тот url адрес страницы, где будет внедрён основной функционал: http://localhost/mailru-auth. Таким образом, на локальном сервере поместим наши файлы в каталог "mailru-auth".

Далее нажимаем на кнопку "Продолжить" и переходим к следующему шагу. На третьем шаге необходимо скачать файл receiver.html, поместить его в каталог вашего проекта и дать Mail.ru возможность проверить существование данного файла. Поскольку наш пример предназначен для работы на локальном сервере, то мы этого делать не будем. Просто нажимаем кнопку "Продолжить", и на следующей странице "Пропустить". Если же вы создаёте пример для приложения работающего на каком-то реальном сервере, то сначала пройдите процедуру проверки наличия файла receiver.html, иначе функциональность вашего примера может быть ограничена.

Итак, после успешного добавления сайта в сервис Mail.ru, нам должно выдастся следующее сообщение со специальными параметрами:

Отсюда мы можем извлечь такие параметры, как `ID` приложения, `Приватный ключ` и`Секретный ключ`. Запишем их в специальные переменные в файле index.php:

<?php
 
$client_id = '702253'; // ID
$client_secret = '81fefec83a3ff8903af3fc4ae7bcc18e'; // Секретный ключ
$redirect_uri = 'http://localhost/mailru-auth'; // Ссылка на приложение

Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = 'https://connect.mail.ru/oauth/authorize';
 
$params = array(
    'client_id'     => $client_id,
    'response_type' => 'code',
    'redirect_uri'  => $redirect_uri
);

С помощью функции http_build_query, передав массив параметров, мы получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Mail.ru</a></p>';

Тут же, в очередной раз, я воспользовался функцией urldecode. Если этого не сделать, то в сгенерированной ссылке могут появиться закодированные символы слешей, знаков двоеточия и так далее:
https://connect.mail.ru/oauth/authorize?client_id=702253&client_secret=81fefec83a3ff8903af3fc4ae7bcc18e&grant_type=authorization_code&code=81c3a267c791b2f451ffdaa54c8abe31&redirect_uri=http%3A%2F%2Flocalhost%2Fmailru-auth

Если же мы пропустим данную строку через функцию urldecode, то получим:
https://connect.mail.ru/oauth/authorize?client_id=702253&client_secret=81fefec83a3ff8903af3fc4ae7bcc18e&grant_type=authorization_code&code=81c3a267c791b2f451ffdaa54c8abe31&redirect_uri=http://localhost/mailru-auth

Ссылка для аутентификации готова. Если мы сформировали все параметры верно и получили правильный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/mailru-auth'). Как и в предыдущих случаях (при работе с Вконтакте и Одноклассниками), к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой
http://localhost/mailru-auth/?code=5adc5521461df2b28be76b5cfdd6c7e5

Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.

В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` - id приложения; `client_secret` - секретный ключ; `grand_type`, равный значению "authorization_code" - код активации; `code` - url параметр, пришедший от Mail.ru; `redirect_uri` - страница, на которую будет возвращён пользователь:
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'client_id'     => $client_id,
        'client_secret' => $client_secret,
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code'],
        'redirect_uri'  => $redirect_uri
    );
 
    $url = 'https://connect.mail.ru/oauth/token';
}

Далее нам нужно отправить POST запрос на адрес https://connect.mail.ru/oauth/token, передав перечисленные параметры. В PHP выполнить POST запрос можно с помощью создания curl запроса:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
 
$tokenInfo = json_decode($result, true);

При успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Mail.ru в JSON формате. Данная строка содержит 5 параметров: refresh token - маркер обновления информации, expires_in - время жизни токена, access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе, token_type - тип токена, x_mailru_vid - id пользователя в системе Mail.ru, который пытается авторизоваться:
{"refresh_token":"3d6c0c97abc7ce4a0a07a2950cf41a9f","expires_in":86400,"access_token":"bd0773b8b4f34394feec2f0ad3420968","token_type":"bearer","x_mailru_vid":"11138941216447863497"}

Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.

Шаг 4. Получение информации о пользователе
Теперь, когда у нас есть параметры access_token, мы можем сделать запрос к Mail.ru API и получить информацию о пользователе. Перед тем, как мы подготовим массив с параметрами, которые в последствии превратим во фрагмент url строки, нам нужно сформировать специальную `подпись` запроса $sign с помощью хэша md5;
if (isset($tokenInfo['access_token'])) {
    $sign = md5("app_id={$client_id}method=users.getInfosecure=1session_key={$tokenInfo['access_token']}{$client_secret}");
 
    $params = array(
        'method'       => 'users.getInfo',
        'secure'       => '1',
        'app_id'       => $client_id,
        'session_key'  => $tokenInfo['access_token'],
        'sig'          => $sign
    );

В параметр method записываем название метода Mail.ru API, который вернёт нам информацию о пользователе; параметру secure ставим 1 - это нужно для безопасности. Далее в параметр app_id передаём id нашего приложения; в session_key записываем access_token - токен доступа, который мы достали по POST запросу в предыдущем шаге и конечно же подпись запроса (sig).

Для получения информации о пользователе сформированные параметры нам нужно отправить GET запросом по адресу http://www.appsmail.ru/platform/api:
$params = array(
    'method'       => 'users.getInfo',
    'secure'       => '1',
    'app_id'       => $client_id,
    'session_key'  => $tokenInfo['access_token'],
    'sig'          => $sign
);
 
$userInfo = json_decode(file_get_contents('http://www.appsmail.ru/platform/api' . '?' . urldecode(http_build_query($params))), true);

В результате, если всё было сделано успешно, то получим JSON ответ приблизительно следующего вида:
[
  {
    "pic_50":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar50",
    "friends_count":2,
    "pic_22":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar22",
    "nick":"Стас Протасевич",
    "is_verified":1,
    "is_online":0,
    "pic_big":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatarbig",
    "last_name":"Протасевич",
    "has_pic":1,
    "email":"stanislav.protasevich@mail.ru",
    "pic_190":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar190",
    "referer_id":"",
    "vip":0,
    "pic_32":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar32",
    "birthday":"03.07.1988",
    "referer_type":"",
    "link":"http://my.mail.ru/mail/stanislav.protasevich/",
    "last_visit":"1363274031",
    "uid":"11138941216447863497",
    "app_installed":1,
    "status_text":"",
    "pic_128":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar128",
    "sex":0,
    "pic":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar",
    "pic_small":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatarsmall",
    "pic_180":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar180",
    "pic_40":"http://avt.appsmail.ru/mail/stanislav.protasevich/_avatar40",
    "first_name":"Стас"
  }
]

Далее преобразуем JSON ответ в массив и проверим наличие в нём нулевого элемента с ключом uid. Если такой элемент есть, извлечём его из общего массива $userInfo с помощью метода array_shift:
if (isset($userInfo[0]['uid'])) {
    $userInfo = array_shift($userInfo);
    $result = true;
}

Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    <title></title>
</head>
<body>
 
<?php
 
$client_id = '702253'; // ID
$client_secret = '81fefec83a3ff8903af3fc4ae7bcc18e'; // Секретный ключ
$redirect_uri = 'http://localhost/mailru-auth'; // Ссылка на приложение
 
$url = 'https://connect.mail.ru/oauth/authorize';
 
$params = array(
    'client_id'     => $client_id,
    'response_type' => 'code',
    'redirect_uri'  => $redirect_uri
);
 
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Mail.ru</a></p>';
 
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'client_id'     => $client_id,
        'client_secret' => $client_secret,
        'grant_type'    => 'authorization_code',
        'code'          => $_GET['code'],
        'redirect_uri'  => $redirect_uri
    );
 
    $url = 'https://connect.mail.ru/oauth/token';
 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($curl);
    curl_close($curl);
 
    $tokenInfo = json_decode($result, true);
 
    if (isset($tokenInfo['access_token'])) {
        $sign = md5("app_id={$client_id}method=users.getInfosecure=1session_key={$tokenInfo['access_token']}{$client_secret}");
 
        $params = array(
            'method'       => 'users.getInfo',
            'secure'       => '1',
            'app_id'       => $client_id,
            'session_key'  => $tokenInfo['access_token'],
            'sig'          => $sign
        );
 
        $userInfo = json_decode(file_get_contents('http://www.appsmail.ru/platform/api' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo[0]['uid'])) {
            $userInfo = array_shift($userInfo);
            $result = true;
        }
    }
}
 
 
?>
 
</body>
</html>

Шаг 5. Извлечение информации о пользователе
Теперь извлекать информацию о пользователе мы можем из массива, хранящегося в переменной $userInfo, по ключам, которые вы можете найти в листинге JSON ответа последнего GET запроса. Я выведу лишь несколько значений:
if ($result) {
    echo "Социальный ID пользователя: " . $userInfo['uid'] . '<br />';
    echo "Имя пользователя: " . $userInfo['nick'] . '<br />';
    echo "Email: " . $userInfo['email'] . '<br />';
    echo "Ссылка на профиль пользователя: " . $userInfo['link'] . '<br />';
    echo "Пол пользователя: " . $userInfo['sex'] . '<br />';
    echo "День Рождения: " . $userInfo['birthday'] . '<br />';
    echo '<img src="' . $userInfo['pic_small'] . '" />'; echo "<br />";
}

Шаг 6. Что же дальше?
На данном этапе дальнейшая последовательность действий остаётся за вами. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.

После этого, всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;

На странице выхода из системы просто удаляем сессию с помощью функции unset.

Итог
Ещё один рецепт создания сторонней аутентификацией у вас в копилке.

P.S. В комментариях к предыдущим статьям многие просят показать, что делать дальше. Как заполнить базу данных, как организовать полный процесс... Я обязательно расскажу об этом в заключительной части цикла данных статей, а до этого нам предстоит ознакомиться с созданием подобного функционала ещё для нескольких соц сетей и сервисов.

Дело в том, что процесс работы с БД для всех примеров будет одинаков, а вот в аутентификации через различные соц сети есть свои характерные детали.

Удачи!

Добавлено: 02 Мая 2018 19:28:06 Добавил: Андрей Ковальчук

Кросс-доменная API для сайта

В данном уроке мы сделаем собственный кросс-доменный API. Может быть вы уже пробовали делать что-то подобное, и, вероятно, сталкивались с невозможностью нормальной работы функций API со сторонних доменов. В основном не получается сделать нормальный запрос AJAX к удаленному серверу и получить ответ в JavaScript функциях. А причина заключается в настройках безопасности. Мы покажем, как решать подобные проблемы.

Шаг 1. PHP
Первым делом приготовим наш сервер.

api.php

<?php
 
// Устанавливаем возможность отправлять ответ для любого домена
header('Access-Control-Allow-Origin: *');
 
if (version_compare(phpversion(), '5.3.0', '>=')  == 1)
  error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
else
  error_reporting(E_ALL & ~E_NOTICE);
 
// Получаем параметры POST
$sAction = $_POST['action'];
$iParam1 = (int)$_POST['param1'];
$iParam2 = (int)$_POST['param2'];
 
// Выполняем вычисления
$iResult = 0;
switch ($sAction) {
    case 'sum':
        $iResult = $iParam1 + $iParam2;
        break;
    case 'sub':
        $iResult = $iParam1 - $iParam2;
        break;
    case 'mul':
        $iResult = $iParam1 * $iParam2;
        break;
    case 'div':
        $iResult = $iParam1 / $iParam2;
        break;
}
 
// Подготавливаем массив результатов
$aResult = array(
    'result' => $iResult
);
 
// Генерируем результат
header('Content-type: application/json');
echo json_encode($aResult);

Следует уделить внимание первой строке, в которой используется установка для заголовка ‘Access-Control-Allow-Origin’. Так разрешается отправка ответа любому серверу (что означает - любому домену). Если вы хотите ограничить область использования определенным доменом, делайте это в данной строке. Затем мы выполняем простые операции в зависимости от полученных параметров $_POST. В нашем примере реализуются простые математические операции. Мы возвращаем результат в формате JSON. Теперь время подготовить библиотеку JavaScript.

Шаг 2. JavaScript
api.js
function do_sum(param1, param2, cfunction) {
 
    // Отправляем AJAX ответ на сервер
    $.ajax({
        type: 'POST',
        url: 'http://ваш_сайт/api.php',
        crossDomain: true,
        dataType: 'json',
        data: 'action=sum&param1=' + param1 + '&param2=' + param2,
        success: function(json) {
            // и вызываем функцию клиента
            cfunction(json);
        }
    });
}
 
function do_sub(param1, param2, cfunction) {
 
    // Отправляем AJAX ответ на сервер
    $.ajax({
        type: 'POST',
        url: 'http://ваш_сайт/api.php',
        crossDomain: true,
        dataType: 'json',
        data: 'action=sub&param1=' + param1 + '&param2=' + param2,
        success: function(json) {
            // и вызываем функцию клиента
            cfunction(json);
        }
    });
}
 
function do_mul(param1, param2, cfunction) {
 
    // Отправляем AJAX ответ на сервер
    $.ajax({
        type: 'POST',
        url: 'http://ваш_сайт/api.php',
        crossDomain: true,
        dataType: 'json',
        data: 'action=mul&param1=' + param1 + '&param2=' + param2,
        success: function(json) {
            // и вызываем функцию клиента
            cfunction(json);
        }
    });
}
 
function do_div(param1, param2, cfunction) {
 
    // Отправляем AJAX ответ на сервер
    $.ajax({
        type: 'POST',
        url: 'http://ваш_сайт/api.php',
        crossDomain: true,
        dataType: 'json',
        data: 'action=div&param1=' + param1 + '&param2=' + param2,
        success: function(json) {
            // и вызываем функцию клиента
            cfunction(json);
        }
    });
}

Это обертка для нашей серверной части. В примере подготовлены 4 функции JavaScript: do_sum, do_sub, do_mul и do_div. Для каждой серверной операции. Обобщая, можно сказать, что нужно для правильного запроса: первое, установить необходимы URL для файла серверной части API (например: http://ваш_сайт/api.php); второе, установить для ‘crossDomain’ значение true; и последнее, установить тип данных dataType (для нашего примера ‘json’). Обратите внимание, что третий параметр каждой нашей функции - ‘cfunction’. Это пользовательская функция и нам следует передавать полученный ответ сервера в данную функцию.

Шаг 3. Использование
Небольшой пример использования подобного API.
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8" />
 
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="http://ваш_сервер/api.js"></script>
</head>
<body>
 
<script type="text/javascript">
$(document).ready(function() {
 
    // Выполняем метод 1 (сумма) на сервере
    var param1 = 5;
    var param2 = 10;
    do_sum(param1, param2, function(data) {
        $('#results').append(param1 + ' + ' + param2 + ' = ' + data.result + '<br />');
 
        // Выполняем метод  2 (вычитание) на сервере
        param1 = 25;
        param2 = 15;
        do_sub(param1, param2, function(data) {
            $('#results').append(param1 + ' - ' + param2 + ' = ' + data.result + '<br />');
 
            // Выполняем метод  3 (умножение) на сервере
            param1 = 8;
            param2 = 5;
            do_mul(param1, param2, function(data) {
                $('#results').append(param1 + ' * ' + param2 + ' = ' + data.result + '<br />');
 
                // Выполняем метод  4 (деление) на сервере
                param1 = 33;
                param2 = 11;
                do_div(param1, param2, function(data) {
                    $('#results').append(param1 + ' / ' + param2 + ' = ' + data.result + '<br />');
                });
            });
 
        });
    });
 
});
</script>
 
<div id="results"></div>
</body>
</html>

Здесь показано, как можно использовать функции API. Вот единичный пример:
var param1 = 5;
var param2 = 10;
do_sum(param1, param2, function(data) {
    $('#results').append(param1 + ' * ' + param2 + ' = ' + data.result + '<br />');
});

Мы просто передаем 3 параметра в нашу функцию: 2 цифры и одну функцию. Ответ сервера будет получать данная функция. И можно будет выводить результат где-нибудь (как пример используется элемент #results).

Добавлено: 02 Мая 2018 16:14:30 Добавил: Андрей Ковальчук

Аутентификация через Facebook

Привет всем! Сегодня мы выходим на финишную прямую и рассмотрим, как осуществить процесс аутентификации через социальную сеть Facebook.

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

Шаг 1. Регистрация нового приложения
Для того чтобы добавить новое приложение на Facebook, отправляемся на специально подготовленную для этого страницу.

В верхнем правом углу нажимаем на кнопку "+ Создать новое приложение". Далее вписываем название приложения:

Затем вводим проверочный код:

Далее, на странице настроек вашего приложения, отправляемся к блоку "Как ваше приложение встроено в Facebook" и кликаем на пункт "Website with Facebook Login". В открвшемся поле вводим адрес нашего сайта. В моём случае, это http://localhost/facebook-auth:

После этого сохраняем все настройки. Для дальнейшей работы вам понадобятся параметры, которые вы сможете найти в следующих полях:

Запишем их в специальные переменные файла index.php:

<?php
$client_id = '578516362116657'; // Client ID
$client_secret = 'eb1814bd3980ab9a306dc35073021fb3'; // Client secret
$redirect_uri = 'http://localhost/facebook-auth'; // Redirect URIs

Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:
$url = 'https://www.facebook.com/dialog/oauth';
 
$params = array(
    'client_id'     => $client_id,
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code',
    'scope'         => 'email,user_birthday'
);

С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Facebook</a></p>';
// https://www.facebook.com/dialog/oauth?client_id=578516362116657&redirect_uri=http://localhost/facebook-auth&response_type=code&scope=email,user_birthday

Итак, ссылка для аутентификации готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/facebook-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой
http://localhost/facebook-auth/?code=AQD5q80zafjvVZoZex87ROxkCvWT9rZhjwZtkBLajYwH20KztPOI0jpb5lHZisPd3mA49Wu_onAeEioU5K6KVuoCliznf61B5bDfZSLFaIn6E7E49zqs4fO6NjTYyxN43LBttCvsSlirJOAtbOpB3oyMrl3bbjlPhGHsCyJzA-DypEIZ1c_36WAEBPmfSq3TroekvTLme3jIzZk0C-93cu8z#_=_

Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем в том случае, если к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.

В первую очередь, снова сформируем параметры для этого запроса. Нам потребуется передать параметры: `client_id` - id приложения; `redirect_uri` - страница, на которую будет возвращён пользователь; `client_secret` - секретный ключ; `code` - url параметр, пришедший от Facebook:
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'client_id'     => $client_id,
        'redirect_uri'  => $redirect_uri,
        'client_secret' => $client_secret,
        'code'          => $_GET['code']
    );
 
    $url = 'https://graph.facebook.com/oauth/access_token';
}

Далее нам нужно отправить GET запрос на адрес https://graph.facebook.com/oauth/access_token, передав перечисленные параметры. В PHP выполнить GET запрос по какому-то адресу можно несколькими способами. Для данного урока я воспользуюсь функцией file_get_contents. В отличии от других социальных сетей, Facebook присылает ответ не в JSON формате, а в виде строки, где параметры разделены специальными символами. Для того чтобы распарсить данный ответ, воспользуемся функцией parse_str, а результат (в виде массива) запишем в переменную $tokenInfo:
$tokenInfo = null;
parse_str(file_get_contents($url . '?' . http_build_query($params)), $tokenInfo);

В результате, при успешном выполнении запроса в переменную $tokenInfo будет записан ответ от Facebook в JSON формате. Данная строка содержит 4 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе; token_type - тип токена; expires_in - время жизни токена; id_token - id токена:
array(2) {
  ["access_token"]=>
  string(115) "AAAIOREZCDAnUBAOEmLbNqgHzQSNFoZBBdZC99eNv6DkZA842GUTHP3H7j7YnxEPOZCmZBiPgEZCJCb80zVXDGP9JeX8DGSRi6PU2liZAPQuj9QZDZD"
  ["expires"]=>
  string(7) "5177324"
}

Шаг 4. Получение информации о пользователе

Далее делаем запрос к Facebook API для получения информации о пользователе. Передавать будем один единственный параметр access_token:
if (count($tokenInfo) > 0 && isset($tokenInfo['access_token'])) {
        $params = array('access_token' => $tokenInfo['access_token']);
 
        $userInfo = json_decode(file_get_contents('https://graph.facebook.com/me' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['id'])) {
            $userInfo = $userInfo;
            $result = true;
        }
    }

Отправляем GET запрос по адресу https://graph.facebook.com/me.

В результате, если всё было сделано правильно, то получим JSON ответ примерно следующего вида:
Array
(
    [id] => 100000317390816
    [name] => Стас Протасевич
    [first_name] => Стас
    [last_name] => Протасевич
    [birthday] => 07/03/1988
    [hometown] => Array
        (
            [id] => 110228142339670
            [name] => Chisinau, Moldova
        )
 
    [location] => Array
        (
            [id] => 110228142339670
            [name] => Chisinau, Moldova
        )
 
    [work] => Array
        (
            [0] => Array
                (
                    [employer] => Array
                        (
                            [id] => 159295210819421
                            [name] => Web-Concept
                        )
 
                    [location] => Array
                        (
                            [id] => 110228142339670
                            [name] => Chisinau, Moldova
                        )
 
                    [position] => Array
                        (
                            [id] => 108480125843293
                            [name] => Web Developer
                        )
 
                    [start_date] => 2010-09
                    [end_date] => 2011-10
                )
 
        )
 
    [sports] => Array
        (
            [0] => Array
                (
                    [id] => 106011416097502
                    [name] => Ice hockey
                )
 
        )
 
    [favorite_athletes] => Array
        (
            [0] => Array
                (
                    [id] => 202766356426583
                    [name] => Michael Jordan
                )
 
        )
 
    [inspirational_people] => Array
        (
            [0] => Array
                (
                    [id] => 7170054127
                    [name] => Hans Zimmer
                )
 
            [1] => Array
                (
                    [id] => 113529011990795
                    [name] => Steve Jobs
                )
 
            [2] => Array
                (
                    [id] => 225471537469600
                    [name] => Albert Einstein
                )
        )
 
    [education] => Array
        (
            [0] => Array
                (
                    [school] => Array
                        (
                            [id] => 135979339750670
                            [name] => Лицей Василия Лупу
                        )
 
                    [year] => Array
                        (
                            [id] => 140617569303679
                            [name] => 2007
                        )
 
                    [type] => High School
                )
 
            [1] => Array
                (
                    [school] => Array
                        (
                            [id] => 110260779004118
                            [name] => State University of Moldova
                        )
 
                    [year] => Array
                        (
                            [id] => 142963519060927
                            [name] => 2010
                        )
 
                    [concentration] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 189014467787633
                                    [name] => Прикладная информатика
                                )
 
                        )
 
                    [type] => College
                )
 
            [2] => Array
                (
                    [school] => Array
                        (
                            [id] => 110260779004118
                            [name] => State University of Moldova
                        )
 
                    [degree] => Array
                        (
                            [id] => 200940416612694
                            [name] => Магистр
                        )
 
                    [year] => Array
                        (
                            [id] => 115222815248992
                            [name] => 2012
                        )
 
                    [concentration] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 120214931322280
                                    [name] => сетевые технологии
                                )
 
                        )
 
                    [type] => Graduate School
                )
 
        )
 
    [gender] => male
    [email] => stanislav.protasevich@gmail.com
    [timezone] => 2
    [locale] => ru_RU
    [languages] => Array
        (
            [0] => Array
                (
                    [id] => 176015189120060
                    [name] => Russian
                )
 
            [1] => Array
                (
                    [id] => 106059522759137
                    [name] => English
                )
 
        )
 
    [verified] => 1
    [updated_time] => 2012-12-06T18:06:38+0000
)

Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    <title>Аутентификация через Facebook</title>
</head>
<body>
 
<?php
 
$client_id = '578516362116657'; // Client ID
$client_secret = 'eb1814bd3980ab9a306dc35073021fb3'; // Client secret
$redirect_uri = 'http://localhost/facebook-auth'; // Redirect URIs
 
$url = 'https://www.facebook.com/dialog/oauth';
 
$params = array(
    'client_id'     => $client_id,
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code',
    'scope'         => 'email,user_birthday'
);
 
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через Facebook</a></p>';
 
if (isset($_GET['code'])) {
    $result = false;
 
    $params = array(
        'client_id'     => $client_id,
        'redirect_uri'  => $redirect_uri,
        'client_secret' => $client_secret,
        'code'          => $_GET['code']
    );
 
    $url = 'https://graph.facebook.com/oauth/access_token';
 
    $tokenInfo = null;
    parse_str(file_get_contents($url . '?' . http_build_query($params)), $tokenInfo);
 
    if (count($tokenInfo) > 0 && isset($tokenInfo['access_token'])) {
        $params = array('access_token' => $tokenInfo['access_token']);
 
        $userInfo = json_decode(file_get_contents('https://graph.facebook.com/me' . '?' . urldecode(http_build_query($params))), true);
 
        if (isset($userInfo['id'])) {
            $userInfo = $userInfo;
            $result = true;
        }
    }
}
?>
 
</body>
</html>

Шаг 5. Извлечение информации о пользователе
Для просмотра большего количества полей загляните в содержание переменной $userInfo:
if ($result) {
        echo "Социальный ID пользователя: " . $userInfo['id'] . '<br />';
        echo "Имя пользователя: " . $userInfo['name'] . '<br />';
        echo "Email: " . $userInfo['email'] . '<br />';
        echo "Ссылка на профиль пользователя: " . $userInfo['link'] . '<br />';
        echo "Пол пользователя: " . $userInfo['gender'] . '<br />';
        echo "ДР: " . $userInfo['birthday'] . '<br />';
        echo '<img src="http://graph.facebook.com/' . $userInfo['id'] . '/picture?type=large" />'; echo "<br />";
    }

Шаг 6. И снова дело за вами
Тут всё как и в предыдущих случаях. Если у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить, не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.

После этого всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;

На странице выхода из системы просто удаляем сессию с помощью функции unset.

Итог
Итак, это последняя статья, где мы рассматривали создание аутентификации для отдельной социальной сети или сервиса. В следующем уроке я покажу вам, как построить систему аутентификации через несколько соц сетей, и как прикрутить всё это к БД. Удачи!

Добавлено: 02 Мая 2018 14:50:19 Добавил: Андрей Ковальчук

Аутентификация через ВКонтакте

С каждым днём влияние социальных сетей и сервисов только крепчает. Это означает, что нам, как веб разработчикам нужно это учитывать. Сегодня я расскажу и покажу, как создать аутентификацию ваших пользователей через социальную сеть ВКонтакте. Для этого мы не будем пользоваться какими-то сторонними библиотеками, а реализуем всё с нуля, собственными руками. Думаю, многие ждали подобного урока, так что томить не буду. Начнём!

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

Шаг 1. Регистрация нового приложения
Для начала нам необходимо создать новое приложение на сайте социальной сети ВКонтакте

В открывшейся форме введите название приложения; выберите тип “Веб-сайт”; В качестве адреса сайта введите путь к папке с проектом на вашем локальном сервере. В моём случае, это http://localhost/vk-auth. Базовый домен: localhost.

После нажатия на кнопку “Подключить сайт”, вам наверняка придётся ввести проверочный код, который придёт по смс. Если вы пройдёте проверку, то вам должна открыться следующая форма с настройками приложения.

Сразу же хочу предупредить, что настоящие данные, относящиеся к моему приложению, я заменил на фиктивные, т.к. публикация таких значений как “Защищённый ключ” карается удалением вашего приложения или учётной записи в целом.

Из данной формы нам понадобятся такие данные, как `ID приложения`, `Защищённый ключ`, `Адрес сайта`. Запишем их в специальные переменные в файле index.php:

<?php
 
$client_id = '3485070'; // ID приложения
$client_secret = 'lYjfUZwZmlJJlFIqQFAj'; // Защищённый ключ
$redirect_uri = 'http://localhost/vk-auth'; // Адрес сайта
Шаг 2. Генерация ссылки для аутентификации
Для генерации ссылки нам потребуется адрес аутентификации и специальные параметры:

$url = 'http://oauth.vk.com/authorize';
 
$params = array(
    'client_id'     => $client_id,
    'redirect_uri'  => $redirect_uri,
    'response_type' => 'code'
);

С помощью функции http_build_query, передав туда массив параметров, получим чередование ключей и значений, как в url адресе. Итак, генерируем ссылку и выводим на экран:
echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через ВКонтакте</a></p>';

Также тут я воспользовался функцией urldecode. Если этого не сделать, то в сгенерированной ссылке могут появиться закодированные символы слешей, знаков двоеточия и так далее. Что-то вроде этого:
http://oauth.vk.com/authorize?client_id=3485070&redirect_uri=http%3A%2F%2Flocalhost%2Fvk-auth&response_type=code

Если же мы пропустим данную строку через функцию urldecode, то получим:
http://oauth.vk.com/authorize?client_id=3485070&redirect_uri=http://localhost/vk-auth&response_type=code

Итак, ссылка для аутентификации у нас готова. Если мы сформировали все параметры правильным образом и получили верный url, то пройдя по ссылке, будем перенаправлены по адресу, указанному в настройках приложения ('http://localhost/vk-auth'). Только теперь к этому адресу будет прикреплён специальный параметр code:
// Пример. В вашем случае код будет другой
http://localhost/vk-auth/?code=f30621b146115b3bad

Шаг 3. Получение токена
Начинать процедуру аутентификации мы можем тогда и только тогда, когда к нам пришёл параметр code. Он нам нужен для того, чтобы получить специальный токен доступа, с помощью которого, в дальнейшем, мы достанем информацию о пользователе.

В первую очередь, снова сформируем нужные нам параметры для этого запроса:
if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $>clientId,
        'client_secret' => $this->clientSecret,
        'code' => $_GET['code'],
        'redirect_uri' => $this->redirectUri
    );
}

Далее нам нужно отправить GET запрос на адрес https://oauth.vk.com/access_token, передав перечисленные параметры. В PHP выполнить GET запрос по какому-то адресу можно несколькими способами. Для данного урока я воспользуюсь функцией file_get_contents.
if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );
 
    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
}

В результате, при успешном выполнении запроса в переменную $token будет записан ответ от ВКонтакте в JSON формате. Данная строка содержит 3 параметра: access_token, который мы будем использовать в следующих запросах для извлечения информации о пользователе, expires_in - время жизни токена, user_id - id пользователя, который прошёл аутентификацию.
{"access_token":"2c6276b767b5e2f35f908e89d61416beea17b6d1ebcd3d14e20ac910281d306bb506ec78e75518ed614e9","expires_in":86399,"user_id":14966712}

Для того чтобы мы далее могли работать с данными параметрами, декодируем JSON строку с помощью функции json_decode и помещаем данные в массив, передав в качестве второго аргумента true.

Шаг 4. Получение информации о пользователе
Итак, теперь когда у нас есть параметры access_token и user_id, мы можем сделать запрос к ВКонтакте API и получить информацию о пользователе. Для начала снова подготовим массив с параметрами, которые в последствии превратим в фрагмент url строки.
if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );
 
    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
 
    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );
    }
}

В параметр uids записываем id пользователя; в fields перечисляем через запятую поля, которые хотим извлечь (uid - id пользователя, first_name - имя, last_name - фамилию, screen_name - имя отображаемое на страницах VK, sex - пол, bdate - дату рождения, photo_big - фотографию). Для доступа к большему количеству полей обратитесь к ВКонтакте API users.get. В качестве последнего параметра передаём 'access_token'.

Для получения информации о пользователе сфомированные параметры нам нужно отправить GET запросом по адресу https://api.vk.com/method/users.get.
if (isset($_GET['code'])) {
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );
 
    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
 
    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );
 
        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
    }
}

В результате, если всё было сделано правильно, то получим JSON ответ следующего вида:
{"response":[{"uid":14966712,"first_name":"Стас","last_name":"Протасевич","screen_name":"stanislav.protasevich","sex":2,"bdate":"3.7.1988","photo_big":"http:\/\/cs307601.vk.me\/u14966712\/a_8234a279.jpg"}]}

Снова преобразуем JSON ответ в массив и обратимся к нулевому элементу, хранящемуся в массиве, доступному по ключу response:
if (isset($_GET['code'])) {
    $result = false;
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );
 
    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
 
    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );
 
        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['response'][0]['uid'])) {
            $userInfo = $userInfo['response'][0];
            $result = true;
        }
    }
}

Прошу обратить внимание, что в данном фрагменте, я добавил специальную переменную $result, равную изначально false сразу же после проверки наличия GET параметра code. Если нам удалось извлечь информацию о пользователе, то мы меняем значение этой переменной на true.

Полный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
    <title></title>
</head>
<body>
    <?php
 
    $client_id = '3485070'; // ID приложения
    $client_secret = 'lYjfUZwZmlJJlFIqQFAj'; // Защищённый ключ
    $redirect_uri = 'http://localhost/vk-auth'; // Адрес сайта
 
    $url = 'http://oauth.vk.com/authorize';
 
    $params = array(
        'client_id'     => $client_id,
        'redirect_uri'  => $redirect_uri,
        'response_type' => 'code'
    );
 
    echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через ВКонтакте</a></p>';
 
if (isset($_GET['code'])) {
    $result = false;
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );
 
    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
 
    if (isset($token['access_token'])) {
        $params = array(
            'uids'         => $token['user_id'],
            'fields'       => 'uid,first_name,last_name,screen_name,sex,bdate,photo_big',
            'access_token' => $token['access_token']
        );
 
        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['response'][0]['uid'])) {
            $userInfo = $userInfo['response'][0];
            $result = true;
        }
    }
 
    if ($result) {
        echo "Социальный ID пользователя: " . $userInfo['uid'] . '<br />';
        echo "Имя пользователя: " . $userInfo['first_name'] . '<br />';
        echo "Ссылка на профиль пользователя: " . $userInfo['screen_name'] . '<br />';
        echo "Пол пользователя: " . $userInfo['sex'] . '<br />';
        echo "День Рождения: " . $userInfo['bdate'] . '<br />';
        echo '<img src="' . $userInfo['photo_big'] . '" />'; echo "<br />";
    }
}
?>
</body>
</html>

Шаг 5. Извлечение информации о пользователе
Теперь извлекать информацию о пользователе мы можем из массива, хранящегося в переменной $userInfo по ключам uid, first_name, last_name, screen_name, sex, bdate, photo_big.
if ($result) {
    echo "Социальный ID пользователя: " . $userInfo['uid'] . '<br />';
    echo "Имя пользователя: " . $userInfo['first_name'] . '<br />';
    echo "Ссылка на профиль пользователя: ". 'http://vk.com/' . $userInfo['screen_name'] . '<br />';
    echo "Пол пользователя: " . $userInfo['sex'] . '<br />';
    echo "День Рождения: " . $userInfo['bdate'] . '<br />';
    echo '<img src="' . $userInfo['photo_big'] . '" />'; echo "<br />";
}

Шаг 6. Дело за вами
Теперь, когда у нас есть такая информация, как ID пользователя, в первую очередь, нам необходимо проверить его наличие в нашей базе данных. Если пользователя с таким ID не существует, то значит он авторизовался с нашего сайта впервые, и мы внесём его в базу. Если пользователь уже есть, можем проверить не изменились ли какие-то данные о нём, например, имя или ещё что-то. Если да, обновим запись.

После этого, всё что нам осталось сделать, так это создать сессию и поместить в неё информацию о нашем пользователе.
$_SESSION['user'] = $userInfo;

На странице выхода из системы просто удаляем сессию с помощью функции unset.

Итог
Вот мы и подошли к концу данного урока, и теперь в ваших руках есть решение, которого вы, возможно, долго ждали. Если вас интересует тема аутентификации через социальные сети, то пишите об этом в комментариях, и я с радостью расскажу и покажу, как работать с Одноклассниками, Google-ом, Facebook-ом и другими сервисами.

Добавлено: 02 Мая 2018 14:28:25 Добавил: Андрей Ковальчук