Прием наличных в вашем интернет-магазине через Qiwi
В этой статье речь пойдет о приеме оплаты в интернет-магазине через сеть платежных терминалов Qiwi.
Заранее хочу сказать: я не имею никакого отношения к компании Qiwi, а также они мне не платят :-) Статья только для блага сообщества. Эта платежная система позволила мне поднять конверсию и доходность моего магазина. Может быть, она поможет и вам.
Терминалы по приему наличных уже довольно прочно вошли в нашу жизнь(жаль, что не кредитные карты, как в большинстве стран). Через них можно оплачивать телефон, оплачивать интернет, даже погашать кредиты и платить за воду. Больше интернет-магазины уже давно прописались в меню терминалов. Однако, что делать маленьким магазинам, которые, часто в начале своей деятельности имеют небольшой оборот, а их владелец работает без ИП или ООО, но хотят принимать оплату через терминалы удобным способом? Ни одна платежная система не разместит в своем меню такой магазин.
Можно принимать платежи вручную. Т.е., вы сообщаете пользователю номер своего Яндекс.Деньги кошелька, после чего он переводит на него оговоренную сумму. Но тут есть главный минус и несколько побочных. Главный: процесс оплаты происходит вручную. Пользователь должен перевести денежку, потом сообщить вам, а вы, посмотрев был ли такой перевод пометить заказ, как оплаченный. А что, если у вас, 50-100 заказов в день? Необходима некая автоматизация процесса…
Некоторые время назад компания Элекснет представляла решение этой проблемы: после покупки покупатель должен был ввести на специальном сайте дату, время, номер терминала и еще кучу цифр с чека. После этого Элекснет отсылал сайту уведомление об оплате. Однако, для пользователя это довольно сложный способ. Я то путался, а что можно сказать о среднестатистическом пользователе, который хочет купить у вас кружку с надписью «Я блондинко»?
На помощь приходит платежная система Qiwi, а также ее XML-интерфейсы.
Вкратце, не вникая, пока в технические подробности алгоритм таков:
1. Пользователь, после выбора товара, составления счета и выбора способа оплаты «Qiwi» вводит свой номер телефона (предварительно создав cчет в системе Qiwi, но также возможна регистрация через XML) в специальном поле на вашем сайте.
2. Ваш сайт посылает XML-запрос серверу Qiwi, создавая счет на указанную сумму для этого пользователя.
3. Пользователь, воспользовавшись терминалом по приему наличных Qiwi или личным кабинетом на сайте Qiwi, оплачивает счет. Средства переводятся на ваш счет.
4. Ваш сайт время от времени специальным XML запросом время от времени проверяет(у меня, к примеру, раз в 15 минут по cron'у), выполнен ли счет. Если счет выполнен — совершает с ним необходимые действия.
Спорен лишь 4й пункт. Интерфейс Qiwi в этом месте довольно убог:
Необходимо отправлять их серверу список всех счетов, с которых ожидается оплата, а он в ответ возвращает список выполненных счетов, из запрошенных. В моем случае я вынимаю из базы все не оплаченные счета за последние 5 дней и скармливаю их киви. И так раз в 15 минут.
Qiwi предоставляет достаточно обширный XML-интерфейс. Однако, вам, скорее всего, понадобится лишь 2 его функции — выставление счета и проверка состояния счета.
Отправка запроса на создание счета производится отправкой XML-запроса на адрес http://www.mobw.ru/term2/xmlutf.jsp, в POST запроса передаем следующий XML:
Поэксперементировать с отправкой XML запросов вы можете прямо в личном кабинете Qiwi(меню Сервис-Протокол).
В случае успеха сервер вернет:
Проверять нужно значение, которое возвращено в result-code: в случае, если оно не равно 0, выводить пользователю ошибку: например, может быть не соблюден формат номера телефона, или же пользователь вовсе не зарегистрирован в системе Qiwi.
Следующий пример на PHP отправляет XML-запрос на сервер Qiwi и получает ответ:
Более подробный пример в виде контроллера для CakePHP.
Для начала немного теории. Я думаю, если вас заинтересовала эта статья, вы уже сталкивались с другими системами по приему платежей, например, Webmoney или Roboxchange. Обе эти системы при оплате счета умею вызывать определенную страничку вашего сайта, сообщая, таким образом, об оплате счета покупателем. С Qiwi ситуация другая: при оплате протокол не предусматривает вызов какой либо страницы вашего сайта. Однако, есть интерфейс, при обращении к которому с помощью XML можно определить статус счета.
Алгоритм в этом случае прост:
1. При выставлении счета ставим максимальное время жизни счета 5 дней.
2. Создаем скрипт, который будет вынимать из вашей базы данных все неоплаченные счета qiwi за последние 5 дней, запрашивать у Qiwi их статус, а если они оплачены — ставить им в базе данных статус «оплачен», а также выполнять другие действия, предусмотренные бизнес-логикой движка вашего интернет-магазина.
3. В cron добавляем задание выполнять этот скрипт каждые 15 минут.
Теперь к практике. Скрипт для проверки статуса счета должен вытаскивать из вашей базы номера неоплаченных счетов и подставлять их в XML, приведенный ниже.
XML-запрос на проверку статуса заказов представляет из себя:
В этом примере мы запрашиваем сервер на статус выполнения счетов 1, 2, 3
Адрес, на который следует слать запрос, а также способ его отправки не отличается от примера, представленного в первой части статьи для выставления счета
В ответ сервер возвращает, чтото, вроде:
В ответе необходимо проверять поле status. 60 — означает, что счет оплачен. Можно также сравнить сумму с суммой в базе данных.
Это все, что я хотел рассказать. Я сознательно не очень подробно описывал протокол Qiwi. Уверен, читателю будет просто разобраться в нем самому. Цель статьи — рассказать о довольно новой и, главное, удобной платежной системе на берегах рунета.
Подробное описание протокола Qiwi в pdf
Регистрация в качестве магазина
Компонент для CakePHP для работы с Qiwi (Описание работы с компонентом содержится в комментариях к коду.)
UPD: Перенес в блог «Электронная коммерция»
UPD2: Эта же статья в моем блоге
Заранее хочу сказать: я не имею никакого отношения к компании Qiwi, а также они мне не платят :-) Статья только для блага сообщества. Эта платежная система позволила мне поднять конверсию и доходность моего магазина. Может быть, она поможет и вам.
Терминалы по приему наличных уже довольно прочно вошли в нашу жизнь(жаль, что не кредитные карты, как в большинстве стран). Через них можно оплачивать телефон, оплачивать интернет, даже погашать кредиты и платить за воду. Больше интернет-магазины уже давно прописались в меню терминалов. Однако, что делать маленьким магазинам, которые, часто в начале своей деятельности имеют небольшой оборот, а их владелец работает без ИП или ООО, но хотят принимать оплату через терминалы удобным способом? Ни одна платежная система не разместит в своем меню такой магазин.
Можно принимать платежи вручную. Т.е., вы сообщаете пользователю номер своего Яндекс.Деньги кошелька, после чего он переводит на него оговоренную сумму. Но тут есть главный минус и несколько побочных. Главный: процесс оплаты происходит вручную. Пользователь должен перевести денежку, потом сообщить вам, а вы, посмотрев был ли такой перевод пометить заказ, как оплаченный. А что, если у вас, 50-100 заказов в день? Необходима некая автоматизация процесса…
Некоторые время назад компания Элекснет представляла решение этой проблемы: после покупки покупатель должен был ввести на специальном сайте дату, время, номер терминала и еще кучу цифр с чека. После этого Элекснет отсылал сайту уведомление об оплате. Однако, для пользователя это довольно сложный способ. Я то путался, а что можно сказать о среднестатистическом пользователе, который хочет купить у вас кружку с надписью «Я блондинко»?
На помощь приходит платежная система Qiwi, а также ее XML-интерфейсы.
Вкратце, не вникая, пока в технические подробности алгоритм таков:
1. Пользователь, после выбора товара, составления счета и выбора способа оплаты «Qiwi» вводит свой номер телефона (предварительно создав cчет в системе Qiwi, но также возможна регистрация через XML) в специальном поле на вашем сайте.
2. Ваш сайт посылает XML-запрос серверу Qiwi, создавая счет на указанную сумму для этого пользователя.
3. Пользователь, воспользовавшись терминалом по приему наличных Qiwi или личным кабинетом на сайте Qiwi, оплачивает счет. Средства переводятся на ваш счет.
4. Ваш сайт время от времени специальным XML запросом время от времени проверяет(у меня, к примеру, раз в 15 минут по cron'у), выполнен ли счет. Если счет выполнен — совершает с ним необходимые действия.
Спорен лишь 4й пункт. Интерфейс Qiwi в этом месте довольно убог:
Необходимо отправлять их серверу список всех счетов, с которых ожидается оплата, а он в ответ возвращает список выполненных счетов, из запрошенных. В моем случае я вынимаю из базы все не оплаченные счета за последние 5 дней и скармливаю их киви. И так раз в 15 минут.
Техническая сторона дела
Qiwi предоставляет достаточно обширный XML-интерфейс. Однако, вам, скорее всего, понадобится лишь 2 его функции — выставление счета и проверка состояния счета.
Выставление счета
Отправка запроса на создание счета производится отправкой XML-запроса на адрес http://www.mobw.ru/term2/xmlutf.jsp, в POST запроса передаем следующий XML:
<?xml version="1.0" encoding="utf-8"?>
<request>
<protocol-version>4.00</protocol-version>
<request-type>30</request-type>
<extra name="password">Ваш пароль</extra>
<terminal-id>Ваш номер в системе киви</terminal-id>
<extra name="serial">Ван пароль №2</extra>
<extra name="comment">Комментарий</extra>
<extra name="to-account">Номер телефона покупателя</extra>
<extra name="amount">Сумма</extra>
<extra name="trm-id">Номер заказа</extra>
<extra name="ALARM_SMS">0</extra>
<extra name="ACCEPT_CALL">0</extra>
<extra name="ltime">60</extra>
</request>Поэксперементировать с отправкой XML запросов вы можете прямо в личном кабинете Qiwi(меню Сервис-Протокол).
В случае успеха сервер вернет:
<response>
<result-code>0</result-code>
</response>Проверять нужно значение, которое возвращено в result-code: в случае, если оно не равно 0, выводить пользователю ошибку: например, может быть не соблюден формат номера телефона, или же пользователь вовсе не зарегистрирован в системе Qiwi.
Следующий пример на PHP отправляет XML-запрос на сервер Qiwi и получает ответ:
$xml = "<?xml version="1.0" encoding="utf-8"?>
<request>
<protocol-version>4.00</protocol-version>
<request-type>30</request-type>
<extra name="password">Ваш пароль</extra>
<terminal-id>Ваш номер в системе киви</terminal-id>
<extra name="serial">Ван пароль №2</extra>
<extra name="comment">Комментарий</extra>
<extra name="to-account">Номер телефона покупателя</extra>
<extra name="amount">Сумма</extra>
<extra name="trm-id">Номер заказа</extra>
<extra name="ALARM_SMS">0</extra>
<extra name="ACCEPT_CALL">0</extra>
<extra name="ltime">60</extra>
</request>";
$opts = array('http' =>
array(
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
."Content-Length: " . strlen($xml) . "\r\n",
'content' => $xml
)
);
//Создаем stream context
$context = stream_context_create($opts);
//Отправляем запрос серверу. В качестве 3го параметра указываем созданный stream context
$result = file_get_contents("http://www.mobw.ru/term2/xmlutf.jsp", FALSE, $context);
//Обрабатываем xml и проверяем возвращенное значение.
Более подробный пример в виде контроллера для CakePHP.
Проверка оплаты счета
Для начала немного теории. Я думаю, если вас заинтересовала эта статья, вы уже сталкивались с другими системами по приему платежей, например, Webmoney или Roboxchange. Обе эти системы при оплате счета умею вызывать определенную страничку вашего сайта, сообщая, таким образом, об оплате счета покупателем. С Qiwi ситуация другая: при оплате протокол не предусматривает вызов какой либо страницы вашего сайта. Однако, есть интерфейс, при обращении к которому с помощью XML можно определить статус счета.
Алгоритм в этом случае прост:
1. При выставлении счета ставим максимальное время жизни счета 5 дней.
2. Создаем скрипт, который будет вынимать из вашей базы данных все неоплаченные счета qiwi за последние 5 дней, запрашивать у Qiwi их статус, а если они оплачены — ставить им в базе данных статус «оплачен», а также выполнять другие действия, предусмотренные бизнес-логикой движка вашего интернет-магазина.
3. В cron добавляем задание выполнять этот скрипт каждые 15 минут.
Теперь к практике. Скрипт для проверки статуса счета должен вытаскивать из вашей базы номера неоплаченных счетов и подставлять их в XML, приведенный ниже.
XML-запрос на проверку статуса заказов представляет из себя:
<?xml version="1.0" encoding="utf-8"?>
<request>
<protocol-version>4.00</protocol-version>
<request-type>33</request-type>
<extra name="password">пароль</extra>
<terminal-id>логин</terminal-id>
<extra name="serial">логин2</extra>
<bills-list>
<bill id="1"/>
<bill id="2"/>
<bill id="3"/>
...
</bills-list></request>В этом примере мы запрашиваем сервер на статус выполнения счетов 1, 2, 3
Адрес, на который следует слать запрос, а также способ его отправки не отличается от примера, представленного в первой части статьи для выставления счета
В ответ сервер возвращает, чтото, вроде:
<response>
<result-code fatal="false">0</result-code>
<bills-list>
<bill id="1" status ="60" sum="193.00" />
<bill id="2" status ="60" sum="1032.00" />
<bill id="3" status ="50" sum="393.00" />
</bills-list>
</response>В ответе необходимо проверять поле status. 60 — означает, что счет оплачен. Можно также сравнить сумму с суммой в базе данных.
Это все, что я хотел рассказать. Я сознательно не очень подробно описывал протокол Qiwi. Уверен, читателю будет просто разобраться в нем самому. Цель статьи — рассказать о довольно новой и, главное, удобной платежной системе на берегах рунета.
Подробное описание протокола Qiwi в pdf
Регистрация в качестве магазина
Компонент для CakePHP для работы с Qiwi (Описание работы с компонентом содержится в комментариях к коду.)
UPD: Перенес в блог «Электронная коммерция»
UPD2: Эта же статья в моем блоге



комментарии (36)