Короткий ответ: Payum предоставляет такой же функционал, как и Omnipay, а также некоторые дополнительные функции.
Payum работает лучше всего, когда вы совмещаете модель оплаты и действие конверсии. Модель не обязательно должна быть только Payum, можно использовать свою или одну из тех, что предоставляют платформы для электронной торговли. Идея проста: вы отправляете запрос в Payum для захвата вашей модели. В action вы конвертируете модель оплаты в конкретный формат шлюза, чаще всего, в массив. Удобство такого подхода заключается в том, что ваш код никогда не изменяется и выглядит так:
$gateway->execute(new Capture($payment) );
Все различия между платёжными системами скрыты внутри шлюза. Payum поддерживает специальный формат шлюза или платежную модель Payum. В случае Omnipay вы не можете просто заменить Stripe шлюз на Paypal, потому что они ведут себя по-разному, и что более важно, они требуют разных данных. Stripe требует предоставить данные кредитной карты, а Paypal не заботится об этом, вместо этого хочет вернуть и отменить настройки URL. Вы должны учитывать все эти различия в своем коде, но где тогда абстракция? Кстати, Payum генерирует cancel и return ссылки, и они безопасны (об этом мы поговорим позже).
Иногда вам нужно получить более подробную информацию о платёжной операции или плательщике или узнать больше об ошибке. Payum предоставляет вам доступ ко всем данным, которые участвуют в обмене данными между вашим кодом и платёжным шлюзом. Формат данных является специфическим для платежа, поэтому, если вы знакомы с протоколом Paypal (например), вам будет легко понять, что там происходит. Другим хорошим примером является Klarna Checkout. Он возвращает shipping\billing адреса, пол и дату рождения. С Payum вы можете легко получить данные из платежа и использовать для своих нужд.
Payum позволяет более удобно обрабатывать статусы. Omnipay обеспечивает только два состояния: успех или провал, но этого недостаточно. Например, Paypal иногда возвращает ожидающий статус из-за проблем связанных с валютами. В этом случае Omnipay говорит, что платёж потерпел неудачу, но на самом деле это не так. Или пользователь может отменить платёж на стороне Paypal, Omnipay сообщит вам что платёж завершился ошибкой, но это не так. Если вам нужен статус, который не предоставляется Payum по умолчанию, его можно легко добавить. Если у вас уже есть статусы оплаты из вашей платформы, и вы хотите их повторно использовать, Payum без проблем может быть настроен на их использование.
Иногда пользователи могут пытаться вас обмануть или заплатить меньше чем нужно. Как разработчик, вы должны думать об этом и проверять все данные. Что видит пользователю? Может ли пользователь что-то перехватить и изменить? Вы не можете полагаться на сумму, указанную в URL-адресе, пока вы её не проверите. Например, Paypal отправляет вам уведомление на callback-адрес, который вы привязали к своему аккаунту. Payum генерирует для вас такой URL-адрес, и когда уведомление возвращается, проверяет его.
Вы получаете уникальные защищённые URL-адреса из коробки. Платёж, внутренне связанный с этим URL-адресом, и после удаления\недействительности пользователь URL-адреса не может получить доступ к оплате позади него. Omnipay не предоставляет ничего, чтобы помочь вам решить проблемы безопасности. Существует один хороший побочный эффект с защищенными URL-адресами. Защищенные URL-адреса недействительны\удаляются, когда они не нужны. Это удобно когда пользователь нажимает кнопку «Назад» в браузере. Он не сможет оплатить один и то же счёт дважды потому что URL-адрес покупки больше не существует, вместо этого он увидит ошибку 404.
Плохая идея хранить данные кредитных карт на вашей стороне. Нет никакого оправдания даже для случайного хранения всего на несколько секунд. Payum имеет специальный объект с данными, который гарантирует, что ничего не будет сохранено случайно. Вы всё ещё можете его хранить, но при этом вы берёте всю ответственность за безопасность пользовательских данных на себя.
Omnipay поддерживает только платёжные системы, которые перенаправляют на платёжную систему или требуют ввода кредитной карты. Но есть множество других платёжных систем, и они действуют по-другому. Например, для Klarna Checkout требуется отображения блока через iframe, Stripe.js требует, чтобы их javascript выполнялся на странице покупки. Stripe Checkout отображает собственное всплывающее окно. Payum поддерживает их все, и вы можете переключиться с одного шлюза на другой без изменений в вашем коде.
Payum не поддерживает шлюз, который вам нужен? Реализация с ноля каждого шлюза слишком утомительно! Поэтому существует адаптер для шлюзов Omnipay. Это позволяет использовать Omnipay-шлюзы в стиле Payum. Вы можете посмотреть пример из официальной документации Omnipay, но сделанный с помощью Payum. Такое же количество кода, но гораздо больше возможностей.
Payum пытается стандартизировать обработку платежей. Есть три шага, подготовка, захват\авторизация и выполнение. Первый из них «подготовка», и на этом этапе необходимо подготовить платёж, рассчитать общие цены, налоги, получить информацию о пользователях или доставке и так далее. Теперь можно перенаправить пользователя на шаг захвата\авторизации, отсюда пользователь может быть перенаправлен на страницу шлюза или будут запрошены данные кредитной карты или что-то ещё. Это зависит от того, какой шлюз вы выбрали. На шаге «выполнения» вы получите статус платежа и можете действовать в соответствии с ним. Omnipay лишь частично решает эту задачу.
С фабриками шлюзов вы можете легко перезаписать\заменить любые части функционала шлюза или добавить пользовательские действия и расширения.
Payum имеет официальные пакеты для большинства современных фреймворков, таких как Symfony, Laravel, Silex, Yii, Zend.
В конце давайте сравним интерфейсы предоставляемые Payum и Omnipay.
* Payum GatewayInterface и Omnipay GatewayInterface
* Payum GatewayFactoryInterface и Omnipay GatewayFactory без интерфейса.