Деловые люди сталкивающиеся с интернетом хотят заработать денег, поэтому paypal позволяющий делать оплату кредитными картами по всему миру - ценнейшая услуга для интеграции на свой сайт. Примерные цены за услугу: 2-4% от суммы + 0,3$ за транзакцию зависит от типа оплаты.
У Paypal есть несколько возможностей оплаты товара, но к счастью они едины тем что это делается HTML-формой в которой просто разные входы обозначают разные процессы оплаты. Вот некоторые процессы которые можно сделать..
Покупка в "один клик"
С передачей данных об оплате (Payment
Data Transfer) - в обычном варианте процесс похож на
pangalink. В качестве расширения можно включить авторедирект
пользователя после оплаты.
Buy Now Hosted Button - упрощённая форма где все данные оплаты уже вбиты в paypal-админке. Хороший вариант для оплачиваемого хобби - например если вы продаёте например свой компакт-диск который один единственный для всего сайта.
C межсерверным оповещением (Instant Payment Notification)
Корзина
Подписка
Ниже я покажу процесс IPN. Для тестирования оплаты есть Sandbox-режим. Для более детального описания этого и других процессов почитайте старенькую но актуальную статью в phpclub
Процесс
В моём случае пользователь покупает "кредиты" (виртуальную валюту сайта) которую может потратить на разные внутренние услуги. Соответсвенно он может выбрать сколько денег он хочет потратить обычным radio-полем
При открытии этой страницы в БД сразу регистрируется новый заказ со статусом "adding". Старые заказы с таким статусом удаляются.
Пользователю показывается форма
При её подтверждении пользователь переносится на сайт paypal где оплачивает услугу со всеми проверками
При удачной оплате Paypal в фоновом режиме говорит серверу по notify_url о состоянии оплаты и именно в это время меняется статус заказа
Пользователь перенаправляется на return URL где ему показывается состояние заказа
Большинство систем оплат работают по принципу ворот (gateway) - передал данные, они обработались и вернулись. С клиентом или без него. Сегодня на devclub я рассказывал об эстонских pangalink'ах, но на самом деле я в последнее время интересовался кредитками. О них сегодня тоже рассказывали, перескажу коротко.
Kaardikeskus - эстонский сервис. Договор заключается с отчислениями сервису в районе 3% (наверняка с фиксированной минимальной платой) и минимальной суммарной платой в месяц 200 крон. Протокол самодельный, документация даётся при заключении договора, работает тоже по принципу pangalink-ов. На основе данных делается подпись, клиент переходит на сайт kaardikeskus'а и там уже вбивает данные о кредитке, а возвращаясь надо проверить подписи.
DIBS - датский сервис, с которым я работал. Детально расписана документация. В плане безопасности - используется симметричная подпись. Позволяет как с помощью POST-запросов (у них называется flexwin) обмениваться инфой, так и в состоянии server-to-server. Однако поскольку хранение кредиток на сайте считается очень опасным (и требующим аудита по безопасности), то для последнего типа оплаты создаётся ID транзакции, т.н. ticket. Протокол общения с сервером в этом случае - SOAP
Cybersource - американский сервис, многоплатформенный и с шестью вариантами оплаты в том числе SOAP, криптование с помощью php-расширения, оплата на их сайте (как в Dibs), или же наиболее нормальный вариант с POST'ом на их гейт, который редиректит отбратно с конкретными ошибками. В этом случае ассиметричное шифрование по sha1
Также непроверенные, но любопытные сайты и сервисы по теме:
Я недавно ходил в одну контору устраиваться на работу и первый вопрос который я получил это "что такое DOCTYPE" и "расскажи про Strict, Transitional, Quirks". Само собой вопрос не совсем по моей специальности - я не верстальщик, но всё равно я любопытный. В год назад такая же история была со Skype - в итоге я тесно познакомился с Postgre. Так что не долго думая я решил блог по возможности привести к правильному XHTML 1.1, хотя продвигать или уж тем более требовать то же самое от своих коллег я не собираюсь - каждый сам решает уровень своей дисциплинированности.
XHTML приближен по к XML, парсер не должен гадать как то было в Transitional-mode правильно ли автор расставил порядок тэгов. Более того, это передний фронт развития стандарта, следующая фаза будет в версии 2.0. Параллельно с XHTML развивается HTML 5, но почему-то я ему не доверился, наверно интуиция. XHTML советуется объявлять при помощи MIME application/xhtml+xml, но IE как всегда тормозит и не понимает. Приведу некоторые стандартные ошибки, которые я заметил у себя в процессе стандартизации.
Незакрытые тэги, < и &
Я давно уже привык закрывать <br />, но многие input и img на автомате остались без моего внимания. До этого я часто замечал в чужом коде что внутри ссылок параметры разделяются не просто символом &, а кодом амперсанда &. Как оказалось то же обстоит и с символами тэгов. Все параметры тэгов так-же обязаны быть помещены в кавычки. Очевидно это нужно что-бы ускорить работу парсера. Хотя помоему это чуть излишне.
Всё есть object
Embed это нестандартный тэг часто используемый для вставки видео с youtube (а я советую vimeo), который по всей видимости начал использоватся как совместимость с перекупленным у Netscape движком IE для внедрения объектов внутрь страницы. Он уже отжил своё и его использование в XHTML невозможно. Советы от Elisabeth Castro, Bernie Zimmerman подтверждают это и советуют использовать нечто подобное:
Но проблема в том, что даже если использовать версию без embed, то по крайней мере у моей версии tinymce-редактора (а она без wordpress и без плагина) возникает проблема редактирования и повторного открытия - объект начинает играть сразу в редакторе. Благо при переходе на tinymce 3 объект остаётся спрятанным в коде.
Iframe тоже оказывается пережитком прошлого, его как и svg надо использовать через object-тэг.
CDATA в inline script и style
Character Data активно используется в XML что-бы представить символьные данные, на которые не должны накладываться законы формирования документа - знаки обозначения тэгов и амперсандов. В XHTML использовать такая открывающая и закрывающая строка просто необходима для обозначения CSS и Javascript, иначе всякое упоминание & и < будет считаться параметрами или тэгами.
//<![CDATA[
alert "Для javascript добавляются ещё знаки комментирования" //]]>
Обязательные и не существующие элементы
Не существующие тэги и параметры
img.border
img.align
ol.start
a.name раньше использовался для навигации по якорям в ссылках (добавляется символ решётки, например #top), теперь заменен на использование параметра id.
center
И наоборот, некоторые параметры и вложенные тэги стали строго обязательными
ul li - раньше я просто оставлял пустой список, если он заполняется ajax'ом, теперь надо прятать и добавлять пустой li-элемент
head title
textarea.cols
img.alt - приучает развивать фантазию на случай если картинки отключены или грузятся. Глядишь - и print-версию css напишешь.
Я уже писал про XML-RPC и использование его с livejournal.
Месяца 4 назад я зарегистрировался для продвижения блога наtechnorati - англоязычном аналоге яндекс.блогов, но обнаружил отсутсвие обновления. Как оказалось, всё дело в том что technorati пошло как раз по тому пути о котором я говорил чуть ранее про Google.
Technorati конечно имеет своих пауков, но обновление происходит пользователем. И что-бы не лазить каждый раз после добавления статьи я решил использовать немного изменённую функцию для движка b2 и всё ту же библиотеку для XML-RPC.
function pingTechnorati() { require_once('xml-rpc/xmlrpc.inc'); $siteurl=sys_url; $blogname=sys_title;
$client = new xmlrpc_client("/rpc/ping", "rpc.technorati.com", 80); $message = new xmlrpcmsg("weblogUpdates.ping", array( new xmlrpcval($blogname), new xmlrpcval($siteurl))); $result = $client->send($message);
if (!$result || $result->faultCode()) return(false);
return(true); }
В результате получаем - flerror0messageThanks for the ping, всё работает
Абсолютно такая же история и с feedburner - обновление происходит каждые 30 минут, но можно вручную пропинговать функцией
function ping_feedburner() { require_once('xml-rpc/xmlrpc.inc'); $siteurl=sys_url; $blogname=sys_title;
$client = new xmlrpc_client("", "ping.feedburner.com", 80); $message = new xmlrpcmsg("weblogUpdates.ping", array(new xmlrpcval($blogname), new xmlrpcval($siteurl ))); $result = $client->send($message);
if (!$result || $result->faultCode()) return(false); return(true); }
Теперь если вы заметили закономерность, то вам может стать интересно пинговать любой сервис, поэтому читайте так же..
А не по теме - вчера купил куртку в reserved, где кстати очень грамотно всё сделано - цены не слишком высокие как в monton, сразу женщина подошла и помогла выбрать, освещение, размещение, музыка - всё оптимально и не броско. Видел сегодня Андрея и Катю, на работе переезд, а офис ещё не найден.