Webmoney expert - ney авторізуемся, виводимо із тіні
Матеріал для розробників і власників сайтів.
Принцип роботи сервісу Login.WebMoney
Натискаємо кнопку [Зберегти].
URL з'явився в списку. Сервіс присвоїв йому спеціальний urlid (перша колонка), що складається з безлічі букв і цифр. Для чого він потрібен - розберемося пізніше.
Додані URL можна редагувати (важливо: при цьому змінюється urlid!) Або видаляти. Редагування, по суті, рівнозначно видалення старого і додаванню нового URL.
Потрапивши на сайт Login.WebMoney, ваш користувач бачить наступне:
Як бачимо, ми отримуємо від системи багато інформації, але в класичному випадку (і в нашому прикладі теж) не вся ця інформація нам знадобиться. Найважливіше тут - параметри WmLogin_Ticket і WmLogin_WMID. Перший містить тікет (нагадаємо, тікет - це унікальний неповторяющийся сесійну пароль), а другий містить WMID користувача.
Зрозуміло, що будь-який зловмисник може зімітувати відправку на ваш URL такої форми з вигаданим тікети і WMID. Тому ви не повинні приймати все за чисту монету і повинні обов'язково перевіряти достовірність одержуваних тікетів. Але цим ми займемося трохи пізніше, а поки напишемо простий код на PHP, який буде за формальними ознаками відсікати хибні виклики, що надходять на наш URL, вже на цьому етапі.
Тут ми: 1) перевірили, що параметр WmLogin_UrlID, отриманий нашим скриптом, дійсно збігається з тим urlid, який видала нам система (див. Третій скріншот в статті); 2) переконалися, що тікет має правильний формат, тобто складається з 32 символів, серед яких можуть бути тільки латинські букви, цифри, символи $ і /. Якщо перевірки пройдено успішно - продовжуємо виконання скрипта; якщо немає, то виводимо повідомлення про помилку.
Як ми вже говорили, після отримання тікета потрібно обов'язково перевірити його справжність. Тільки коли ми переконаємося, що тікет справжній, ми можемо бути на 100% впевненими, що вірний і WMID користувача, яку ми здобули разом з даними тікети.
Перевіряти справжність тікета будемо в тому ж скрипті, який тільки що цей тікет і отримав. Так, швидше за все, буде і в вашому випадку. Перевірка займає 1-2 секунди, в цей час користувач буде чекати завантаження URL у браузері.
Запит повинен мати такий вигляд:
Що повинно передаватися в цих параметрах:
Запит потрібно відправляти методом POST, тому будемо використовувати бібліотеку libcurl (CURL). Як правило, вона включена в збірку PHP навіть на недорогих віртуальних хостингах. Перевірити, чи дозволені CURL на вашому сервері, можна за допомогою функції phpinfo () або так: echo function_exists ( "curl_init"); .
Помістимо цю функцію в самий кінець нашого поки що недописаний скрипта.
Зверніть увагу на наступні рядки:
Щоб (з метою безпеки і захисту від DNS-атак) під час сеансу CURL міг перевірити валідність сертифіката на сервері Login.WebMoney, ми використовуємо аргументи CURLOPT_CAINFO і CURLOPT_SSL_VERIFYPEER. Для цього нам потрібно помістити кореневий сертифікат Login.WebMoney куди-небудь на свій сервер і прописати шлях до нього (від кореня сервера) в аргументі CURLOPT_CAINFO.
Також зверніть увагу, що в разі виникнення помилок при роботі CURL в функції _GetAnswer () рядок
покаже номер і опис помилки.
Нагадаю, ми зупинилися на тому, що отримали відповідь від сервера Login.WebMoney і зберегли його в змінну $ resxml. XML-відповідь має формат:
Що означають атрибути єдиного параметра response:
- retval - код результату перевірки тікета. 0 - якщо тікет існує, достовірний і термін його дії не закінчився.
- sval - текстовий опис результату перевірки тікета.
- lastAccess - UTC час останнього доступу до перевіряється тікету.
- expires - UTC час, коли термін дії перевіряється тікета закінчиться.
З усіх атрибутів нас цікавить тільки retval. Якщо він дорівнює 0, то перевірка тікета завершена з позитивним результатом, сам тікет достовірний і, відповідно, отриманий разом з ним WMID можна вважати підтвердженим. Інші коди говорять або про помилки при перевірці тікета, або про те, що тікет не є справжнім.
Отже, нам залишилося доповнити код нашого php-скрипта розбором XML-відповіді і отриманням значення retval. Це можна зробити абсолютно по-різному, в залежності від ваших уподобань. У PHP багато інструментів для XML-парсинга. Більш того, оскільки відповідь має дуже просту і чітку структуру, витягнути значення retval з нього можна навіть за допомогою регулярних виразів. Однак, ми в своєму прикладі скористаємося звичної для нас і простий бібліотекою SimpleXML (підтримується тільки в PHP5, але не в PHP4):
А це, власне, і все. На даний момент ви отримали достовірний WMID користувача, а сам користувач знаходиться на вашому сайті. Як розпорядиться цим багатством - вирішувати тільки вам, залежно від вашої конкретної ситуації. Як правило, буває необхідно або 1) зберегти WMID користувача в базі даних і зробити якусь одноразове дію з користувачем на сайті, або 2) почати для цього відвідувача сесію, прив'язавши до неї WMID, для здійснення подальших дій.
Повністю код скрипта з нашого прикладу можна завантажити звідси. Як все це працює на практиці, можна перевірити тут.
Що ще потрібно знати