Интеграция оплаты paypal

Деловые люди сталкивающиеся с интернетом хотят заработать денег, поэтому paypal позволяющий делать оплату кредитными картами по всему миру - ценнейшая услуга для интеграции на свой сайт. Примерные цены за услугу: 2-4% от суммы +  0,3$ за транзакцию зависит от типа оплаты.

У Paypal есть несколько возможностей оплаты товара, но к счастью они едины тем что это делается HTML-формой в которой просто разные входы обозначают разные процессы оплаты. Вот некоторые процессы которые можно сделать..

  •  Покупка в "один клик"
    • С передачей данных об оплате (Payment Data Transfer) - в обычном варианте процесс похож на pangalink. В качестве расширения можно включить авторедирект пользователя после оплаты.
    • Buy Now Hosted Button - упрощённая форма где все данные оплаты уже вбиты в paypal-админке. Хороший вариант для оплачиваемого хобби - например если вы продаёте например свой компакт-диск который один единственный для всего сайта.
    • C межсерверным оповещением (Instant Payment Notification)
  • Корзина
  • Подписка

Ниже я покажу процесс IPN. Для тестирования оплаты есть Sandbox-режим. Для более детального описания этого и других процессов почитайте старенькую но актуальную статью в phpclub

Процесс

В моём случае пользователь покупает "кредиты" (виртуальную валюту сайта) которую может потратить на разные внутренние услуги. Соответсвенно он может выбрать сколько денег он хочет потратить обычным radio-полем
  1. При открытии этой страницы в БД сразу регистрируется новый заказ со статусом "adding". Старые заказы с таким статусом удаляются.
  2. Пользователю показывается форма
  3. При её подтверждении пользователь переносится на сайт paypal где оплачивает услугу со всеми проверками
  4. При удачной оплате Paypal в фоновом режиме говорит серверу по notify_url о состоянии оплаты и именно в это время меняется статус заказа
  5. Пользователь перенаправляется на return URL где ему показывается состояние заказа

Оплата кредитной карточкой с php

Большинство систем оплат работают по принципу ворот (gateway) - передал данные, они обработались и вернулись. С клиентом или без него. Сегодня на devclub я рассказывал об эстонских pangalink'ах, но на самом деле я в последнее время интересовался кредитками. О них сегодня тоже рассказывали, перескажу коротко.

Kaardikeskus - эстонский сервис. Договор заключается с отчислениями сервису в районе 3% (наверняка с фиксированной минимальной платой) и минимальной суммарной платой в месяц 200 крон. Протокол самодельный, документация даётся при заключении договора, работает тоже по принципу pangalink-ов. На основе данных делается подпись, клиент переходит на сайт kaardikeskus'а и там уже вбивает данные о кредитке, а возвращаясь надо проверить подписи.

DIBS - датский сервис, с которым я работал. Детально расписана документация. В плане безопасности - используется симметричная подпись. Позволяет как с помощью POST-запросов (у них называется flexwin) обмениваться инфой, так и в состоянии server-to-server. Однако поскольку хранение кредиток на сайте считается очень опасным (и требующим аудита по безопасности), то для последнего типа оплаты создаётся ID транзакции, т.н. ticket. Протокол общения с сервером в этом случае - SOAP

Cybersource - американский сервис, многоплатформенный и с шестью вариантами оплаты в том числе SOAP, криптование с помощью php-расширения, оплата на их сайте (как в Dibs), или же наиболее нормальный вариант с POST'ом на их гейт, который редиректит отбратно с конкретными ошибками. В этом случае ассиметричное шифрование по sha1

Также непроверенные, но любопытные сайты и сервисы по теме:

 

Переходим на XHTML 1.1

Я недавно ходил в одну контору устраиваться на работу и первый вопрос который я получил это "что такое 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 подтверждают это и советуют использовать нечто подобное:

<object type="application/x-shockwave-flash" width="425" height="350" data="http://www.youtube.com/v/7_6B6vwE83U">
<param name="movie" value="http://www.youtube.com/v/7_6B6vwE83U" />
</object>

Но проблема в том, что даже если использовать версию без 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 напишешь.

Для тестирования я использовал как валидатор W3C, так и плагинами для браузеров.

Какой doctype вы используете?

  1. HTML4 (16 голосов)
  2. XHTML1 (24 голосов)
  3. Никакой - Лебедеву виднее (20 голосов)

Без комментариев

Пингуем technorati и feedburner по XML-RPC

 Я уже писал про 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, сразу женщина подошла и помогла выбрать, освещение, размещение, музыка - всё оптимально и не броско. Видел сегодня Андрея и Катю, на работе переезд, а офис ещё не найден.