• Stars
    star
    5,813
  • Rank 6,986 (Top 0.2 %)
  • Language
    PHP
  • License
    MIT License
  • Created about 12 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A framework agnostic, multi-gateway payment processing library for PHP 5.6+

Omnipay

An easy to use, consistent payment processing library for PHP

Unit Tests Latest Stable Version Total Downloads

Omnipay is a payment processing library for PHP. It has been designed based on ideas from Active Merchant, plus experience implementing dozens of gateways for [CI Merchant]. It has a clear and consistent API, is fully unit tested, and even comes with an example application to get you started.

Why use Omnipay instead of a gateway's official PHP package/example code?

  • Because you can learn one API and use it in multiple projects using different payment gateways
  • Because if you need to change payment gateways you won't need to rewrite your code
  • Because most official PHP payment gateway libraries are a mess
  • Because most payment gateways have exceptionally poor documentation
  • Because you are writing a shopping cart and need to support multiple gateways

TL;DR

Just want to see some code?

use Omnipay\Omnipay;

$gateway = Omnipay::create('Stripe');
$gateway->setApiKey('abc123');

$formData = array('number' => '4242424242424242', 'expiryMonth' => '6', 'expiryYear' => '2030', 'cvv' => '123');
$response = $gateway->purchase(array('amount' => '10.00', 'currency' => 'USD', 'card' => $formData))->send();

if ($response->isRedirect()) {
    // redirect to offsite payment gateway
    $response->redirect();
} elseif ($response->isSuccessful()) {
    // payment was successful: update database
    print_r($response);
} else {
    // payment failed: display message to customer
    echo $response->getMessage();
}

As you can see, Omnipay has a consistent, well thought out API. We try to abstract as much as possible the differences between the various payments gateways.

Package Layout

Omnipay is a collection of packages which all depend on the omnipay/common package to provide a consistent interface. There are no dependencies on official payment gateway PHP packages - we prefer to work with the HTTP API directly. Under the hood, we use the popular and powerful PHP-HTTP library to make HTTP requests. A Guzzle adapter is required by default, when using league/omnipay.

New gateways can be created by cloning the layout of an existing package. When choosing a name for your package, please don't use the omnipay vendor prefix, as this implies that it is officially supported. You should use your own username as the vendor prefix, and prepend omnipay- to the package name to make it clear that your package works with Omnipay. For example, if your GitHub username was santa, and you were implementing the giftpay payment library, a good name for your composer package would be santa/omnipay-giftpay.

Installation

Omnipay is installed via Composer. For most uses, you will need to require league/omnipay and an individual gateway:

composer require league/omnipay:^3 omnipay/paypal

If you want to use your own HTTP Client instead of Guzzle (which is the default for league/omnipay), you can require omnipay/common and any php-http/client-implementation (see PHP Http)

composer require league/common:^3 omnipay/paypal php-http/buzz-adapter

Upgrade from v2 to v3

If your gateway is supported for v3, you can require that version. Make sure you require league/omnipay or a separate Http Adapter.

If there is no version for v3 yet, please raise an issue or upgrade the gateways yourself and create a PR. See the Upgrade guide for omnipay/common

Note: The package name has been changed from omnipay/omnipay to league/omnipay for v3

Payment Gateways

All payment gateways must implement GatewayInterface, and will usually extend AbstractGateway for basic functionality.

The following gateways are available:

Gateway 2.x 3.x Composer Package Maintainer
2c2p βœ“ βœ“ dilab/omnipay-2c2p Xu Ding
2Checkout βœ“ - omnipay/2checkout Omnipay
2Checkout Improved βœ“ - collizo4sky/omnipay-2checkout Agbonghama Collins
99Bill - βœ“ x-class/omnipay-99bill Laraveler
Acapture (PayVision) βœ“ - qup/omnipay-acapture Niels de Vries
Adyen - βœ“ academe/omnipay-adyen Jason Judge
Affirm βœ“ βœ“ eduardlleshi/omnipay-affirm Eduard Lleshi
Agms βœ“ - agmscode/omnipay-agms Maanas Royy
Alipay(Global) βœ“ βœ“ lokielse/omnipay-global-alipay Loki Else
Alipay βœ“ βœ“ lokielse/omnipay-alipay Loki Else
Allied Wallet βœ“ - delatbabel/omnipay-alliedwallet Del
Arca - βœ“ k3rnel/omnipay-arca Poghos Boyajyan
Authorize.Net βœ“ βœ“ omnipay/authorizenet Jason Judge
Authorize.Net API - βœ“ academe/omnipay-authorizenetapi Jason Judge
Authorize.Net Recurring Billing - βœ“ cimpleo/omnipay-authorizenetrecurring CimpleO
Bankart βœ“ βœ“ ampeco/omnipay-bankart Ampeco
Barclays ePDQ βœ“ - digitickets/omnipay-barclays-epdq DigiTickets
BlueOrange bank - βœ“ deh4eg/omnipay-blueorange Denis Smolakov
Beanstream βœ“ - lemonstand/omnipay-beanstream LemonStand
BitPay βœ“ βœ“ hiqdev/omnipay-bitpay HiQDev
BKM Express βœ“ - yasinkuyu/omnipay-bkm Yasin Kuyu
BlueSnap βœ“ - vimeo/omnipay-bluesnap Vimeo
Braintree βœ“ βœ“ omnipay/braintree Omnipay
Buckaroo βœ“ - omnipay/buckaroo Omnipay
CardGate βœ“ - cardgate/omnipay-cardgate CardGate
CardSave βœ“ - omnipay/cardsave Omnipay
CashBaBa βœ“ βœ“ omnipay/cashbaba Recursion Technologies Ltd
Checkout.com βœ“ - fotografde/checkoutcom fotograf.de
CloudBanking βœ“ - cloudbanking/omnipay-cloudbanking Cloudbanking
Coinbase βœ“ - omnipay/coinbase Omnipay
CoinGate βœ“ - coingate/omnipay-coingate CoinGate
CoinPayments βœ“ βœ“ InkedCurtis/omnipay-coinpayments InkedCurtis
Creditcall βœ“ - meebio/omnipay-creditcall John Jablonski
CSOB (GP WebPay) βœ“ - bileto/omnipay-csob
Cybersource βœ“ βœ“ dioscouri/omnipay-cybersource Dioscouri Design
Cybersource SOAP βœ“ - dabsquared/omnipay-cybersource-soap DABSquared
DataCash βœ“ - digitickets/omnipay-datacash DigiTickets
Datatrans βœ“ - w-vision/datatrans Dominik Pfaffenbauer
Datatrans βœ“ βœ“ academe/omnipay-datatrans Jason Judge
Docdata Payments βœ“ βœ“ uskur/omnipay-docdata-payments Uskur
Dummy βœ“ βœ“ omnipay/dummy Del
Ebanx - βœ“ descubraomundo/omnipay-ebanx Descubra o Mundo
eGHL - βœ“ e-ghl/omnipay Jawad Humayun
eGHL βœ“ βœ“ dilab/omnipay-eghl Xu Ding
eCoin βœ“ βœ“ hiqdev/omnipay-ecoin HiQDev
ecoPayz βœ“ - dercoder/omnipay-ecopayz Alexander Fedra
eSewa - βœ“ sudiptpa/omnipay-esewa Sujip Thapa
EgopayRu βœ“ - pinguinjkeke/omnipay-egopaymentru Alexander Avakov
Elavon βœ“ βœ“ lxrco/omnipay-elavon Korri
ePayments βœ“ βœ“ hiqdev/omnipay-epayments HiQDev
ePayService βœ“ βœ“ hiqdev/omnipay-epayservice HiQDev
eWAY βœ“ βœ“ omnipay/eway Del
Fasapay βœ“ - andreas22/omnipay-fasapay Andreas Christodoulou
Faspay βœ“ βœ“ David-Kurniawan/omnipay-faspay David
Fat Zebra βœ“ - delatbabel/omnipay-fatzebra Del
FreeKassa βœ“ βœ“ hiqdev/omnipay-freekassa HiQDev
Fibank - βœ“ ampeco/omnipay-fibank Ampeco
First Data βœ“ - omnipay/firstdata OmniPay
Flo2cash βœ“ - guisea/omnipay-flo2cash Aaron Guise
Free / Zero Amount βœ“ - colinodell/omnipay-zero Colin O'Dell
GiroCheckout βœ“ βœ“ academe/omnipay-girocheckout Jason Judge
Globalcloudpay βœ“ - dercoder/omnipay-globalcloudpay Alexander Fedra
GoCardless βœ“ - omnipay/gocardless Del
GoPay βœ“ - bileto/omnipay-gopay
GovPayNet βœ“ - omnipay/omnipay-govpaynet FlexCoders
GVP (Garanti) βœ“ - yasinkuyu/omnipay-gvp Yasin Kuyu
GVP (Garanti) - βœ“ emr/omnipay-gvp Emre Akinci
Helcim βœ“ - academe/omnipay-helcim Jason Judge
Icepay Payments - βœ“ superbrave/omnipay-icepay-payments SuperBrave
iDram - βœ“ ptuchik/omnipay-idram Avik Aghajanyan
iDeal - βœ“ deniztezcan/omnipay-ideal Deniz Tezcan
Ingenico ePayments - βœ“ deniztezcan/omnipay-ingenico-epayments Deniz Tezcan
iPay88 βœ“ βœ“ dilab/omnipay-ipay88 Xu Ding
IfthenPay βœ“ - ifthenpay/omnipay-ifthenpay Rafael Almeida
Ikajo βœ“ βœ“ hiqdev/omnipay-ikajo HiQDev
InterKassa βœ“ βœ“ hiqdev/omnipay-interkassa HiQDev
InovioPay βœ“ βœ“ mvestil/omnipay-inoviopay Mark Vestil
Iyzico βœ“ - yasinkuyu/omnipay-iyzico Yasin Kuyu
Judo Pay βœ“ - transportersio/omnipay-judopay Transporters.io
Klarna Checkout βœ“ βœ“ myonlinestore/omnipay-klarna-checkout MyOnlineStore
Laybuy βœ“ - mediabeastnz/omnipay-laybuy Myles Derham
Luminor Gateway - βœ“ deh4eg/omnipay-luminor Denis Smolakov
Komerci (Rede, former RedeCard) βœ“ - byjg/omnipay-komerci JoΓ£o Gilberto MagalhΓ£es
Komoju βœ“ - vink/omnipay-komoju Danny Vink
Midtrans βœ“ βœ“ dilab/omnipay-midtrans Xu Ding
MercadoPago - βœ“ lucassmacedo/omnipay-mercadopago Lucas Macedo
Magnius - βœ“ fruitcake/omnipay-magnius Fruitcake
Manual βœ“ - omnipay/manual Del
Migs βœ“ - omnipay/migs Omnipay
Mpesa βœ“ - wasksofts/omnipay-mpesa wasksofts
MTNCAM Mobile Money βœ“ βœ“ larrytech7/omnipay-momocm Akah Harvey
Mollie βœ“ βœ“ omnipay/mollie Barry vd. Heuvel
MOLPay βœ“ - leesiongchan/molpay Lee Siong Chan
MoMo - βœ“ phpviet/omnipay-momo PHPViet
Moneris - βœ“ unoapp-dev/omnipay-moneris UNOapp Dev
MultiCards βœ“ - incube8/omnipay-multicards Del
MultiSafepay βœ“ - omnipay/multisafepay Alexander Deruwe
MyCard βœ“ - xxtime/omnipay-mycard Joe Chu
MyFatoorah - βœ“ myfatoorah/omnipay MyFatoorah Plugins Team
National Australia Bank (NAB) Transact βœ“ βœ“ sudiptpa/omnipay-nabtransact Sujip Thapa
NestPay (EST) βœ“ - yasinkuyu/omnipay-nestpay Yasin Kuyu
NestPay (EST) - βœ“ uskur/omnipay-nestpay Uskur
Netaxept (BBS) βœ“ - omnipay/netaxept Omnipay
Netbanx βœ“ - omnipay/netbanx Maks Rafalko
Neteller βœ“ - dercoder/omnipay-neteller Alexander Fedra
NetPay βœ“ - netpay/omnipay-netpay NetPay
Network Merchants Inc. (NMI) βœ“ - mfauveau/omnipay-nmi Matthieu Fauveau
Nocks βœ“ βœ“ nocksapp/omnipay-nocks Nocks
Nuvei - βœ“ nmc9/omnipay-nuvei DiversifiedTech
OkPay βœ“ βœ“ hiqdev/omnipay-okpay HiQDev
OnePay βœ“ βœ“ dilab/omnipay-onepay Xu Ding
Openpay Australia βœ“ βœ“ sudiptpa/omnipay-openpay Sujip Thapa
Oppwa βœ“ βœ“ vdbelt/omnipay-oppwa Martin van de Belt
PAY. (Pay.nl & Pay.be) βœ“ βœ“ paynl/omnipay-paynl Andy Pieters
PayMongo - βœ“ oozman/omnipay-paymongo Oozman
Payoo βœ“ βœ“ dilab/omnipay-payoo Xu Ding
Pacnet βœ“ - mfauveau/omnipay-pacnet Matthieu Fauveau
Pagar.me βœ“ - descubraomundo/omnipay-pagarme Descubra o Mundo
Paratika (Asseco) βœ“ - yasinkuyu/omnipay-paratika Yasin Kuyu
PayFast βœ“ - omnipay/payfast Omnipay
PayGate - βœ“ mvnrsa/paygate Marnus van Niekerk
Payflow βœ“ - omnipay/payflow Del
PaymentExpress (DPS) βœ“ βœ“ omnipay/paymentexpress Del
PaymentExpress / DPS (A2A) βœ“ - onlinesid/omnipay-paymentexpress-a2a Sid
PaymentgateRu βœ“ βœ“ pinguinjkeke/omnipay-paymentgateru Alexander Avakov
PaymentSense βœ“ - digitickets/omnipay-paymentsense DigiTickets
PaymentWall βœ“ - incube8/omnipay-paymentwall Del
Paynow - βœ“ pay-now/omnipay-paynow Paynow
PayPal βœ“ βœ“ omnipay/paypal Del
PayPro βœ“ - paypronl/omnipay-paypro Fruitcake
PAYONE βœ“ βœ“ academe/omnipay-payone Jason Judge
Paysafecard βœ“ - dercoder/omnipay-paysafecard Alexander Fedra
Paysafecard - βœ“ worldstream-labs/omnipay-paysafecard Worldstream
Paysafe Payment Hub (Neteller) - βœ“ worldstream-labs/omnipay-paysafe-payment-hub Worldstream
Paysera βœ“ - povils/omnipay-paysera Povils
Paysera - βœ“ semyonchetvertnyh/omnipay-paysera Semyon Chetvertnyh
PaySimple βœ“ - dranes/omnipay-paysimple Dranes
PaySsion βœ“ - inkedcurtis/omnipay-payssion Curtis
PayTrace βœ“ - softcommerce/omnipay-paytrace Oleg Ilyushyn
PayU βœ“ - bileto/omnipay-payu
PayZen βœ“ - ubitransports/omnipay-payzen Ubitransport
Paxum βœ“ βœ“ hiqdev/omnipay-paxum HiQDev
Pelecard βœ“ βœ“ uskur/omnipay-pelecard Uskur
Pin Payments βœ“ - omnipay/pin Del
Ping++ βœ“ - phoenixg/omnipay-pingpp Huang Feng
POLi βœ“ - burnbright/omnipay-poli Sid
Portmanat βœ“ - dercoder/omnipay-portmanat Alexander Fedra
Posnet βœ“ - yasinkuyu/omnipay-posnet Yasin Kuyu
Postfinance βœ“ - bummzack/omnipay-postfinance Roman Schmid
Qiwi βœ“ βœ“ hiqdev/omnipay-qiwi HiQDev
QQ Wallet(QPay) - βœ“ kuangjy/omnipay-qpay Kuang Jiaye
Quickpay βœ“ - nobrainerweb/omnipay-quickpay Nobrainer Web
Rabobank βœ“ - omnipay/rabobank Barry vd. Heuvel
Razorpay βœ“ - razorpay/omnipay-razorpay razorpay
Realex βœ“ - digitickets/omnipay-realex DigiTickets
RedSys βœ“ - nazka/sermepa-omnipay Javier Sampedro
RentMoola βœ“ - rentmoola/omnipay-rentmoola Geoff Shaw
RoboKassa βœ“ βœ“ hiqdev/omnipay-robokassa HiQDev
RocketGate βœ“ βœ“ mvestil/omnipay-rocketgate Mark Vestil
Sage Pay βœ“ βœ“ omnipay/sagepay Jason Judge
Sberbank - βœ“ andrewnovikof/omnipay-sberbank Andrew Novikov
SecPay βœ“ - justinbusschau/omnipay-secpay Justin Busschau
SecurePay βœ“ βœ“ omnipay/securepay Omnipay
Secure Trading βœ“ - meebio/omnipay-secure-trading John Jablonski
Sisow βœ“ βœ“ fruitcakestudio/omnipay-sisow Fruitcake
Skrill βœ“ - alfaproject/omnipay-skrill JoΓ£o Dias
Sofort βœ“ - aimeoscom/omnipay-sofort Aimeos GmbH
Spreedly βœ“ - gregoriohc/omnipay-spreedly Gregorio HernΓ‘ndez Caso
Square βœ“ βœ“ transportersio/omnipay-square Transporters.io
Starkpay βœ“ βœ“ starkpay/omnipay Starkpay
Stripe βœ“ βœ“ omnipay/stripe Del
TargetPay βœ“ - omnipay/targetpay Alexander Deruwe
TatraBank βœ“ - omnipay-tatrabank
ToyyibPay - βœ“ sitehandy/omnipay-toyyibpay Amirol Zolkifli
Tpay βœ“ - omnipay/tpay Tpay.com
UnionPay βœ“ βœ“ lokielse/omnipay-unionpay Loki Else
Vantiv βœ“ - lemonstand/omnipay-vantiv LemonStand
Veritrans βœ“ - andylibrian/omnipay-veritrans Andy Librian
Vindicia βœ“ - vimeo/omnipay-vindicia Vimeo
VivaPayments βœ“ - delatbabel/omnipay-vivapayments Del
VR Payment - βœ“ antibodies-online/omnipay-vr-payment antibodies-online
WebMoney βœ“ βœ“ dercoder/omnipay-webmoney Alexander Fedra
WeChat βœ“ - labs7in0/omnipay-wechat 7IN0's Labs
WechatPay βœ“ βœ“ lokielse/omnipay-wechatpay Loki Else
WePay βœ“ - collizo4sky/omnipay-wepay Agbonghama Collins
Wirecard βœ“ βœ“ igaponov/omnipay-wirecard Igor Gaponov
Wirecard βœ“ - academe/omnipay-wirecard Jason Judge
Worldpay XML Direct Corporate Gateway βœ“ - teaandcode/omnipay-worldpay-xml Dave Nash
Worldpay XML Hosted Corporate Gateway βœ“ βœ“ catharsisjelly/omnipay-worldpay-cg-hosted Chris Lock
Worldpay Business Gateway βœ“ βœ“ omnipay/worldpay Omnipay
Yandex.Kassa βœ“ βœ“ hiqdev/omnipay-yandex-kassa HiQDev
Yandex.Money βœ“ - yandexmoney/omnipay Roman Ananyev
Yandex.Money for P2P payments βœ“ βœ“ hiqdev/omnipay-yandexmoney HiQDev
Yekpay - βœ“ nekofar/omnipay-yekpay Milad Nekofar
ZarinPal - βœ“ nekofar/omnipay-zarinpal Milad Nekofar

Gateways are created and initialized like so:

use Omnipay\Omnipay;

$gateway = Omnipay::create('PayPal_Express');
$gateway->setUsername('adrian');
$gateway->setPassword('12345');

Most settings are gateway specific. If you need to query a gateway to get a list of available settings, you can call getDefaultParameters():

$settings = $gateway->getDefaultParameters();
// default settings array format:
array(
    'username' => '', // string variable
    'testMode' => false, // boolean variable
    'landingPage' => array('billing', 'login'), // enum variable, first item should be treated as default
);

Generally most payment gateways can be classified as one of two types:

  • Off-site gateways such as PayPal Express, where the customer is redirected to a third party site to enter payment details
  • On-site (merchant-hosted) gateways such as PayPal Pro, where the customer enters their credit card details on your site

However, there are some gateways such as Sage Pay Direct, where you take credit card details on site, then optionally redirect if the customer's card supports 3D Secure authentication. Therefore, there is no point differentiating between the two types of gateway (other than by the methods they support).

Credit Card / Payment Form Input

User form input is directed to an CreditCard object. This provides a safe way to accept user input.

The CreditCard object has the following fields:

  • firstName
  • lastName
  • number
  • expiryMonth
  • expiryYear
  • startMonth
  • startYear
  • cvv
  • issueNumber
  • type
  • billingAddress1
  • billingAddress2
  • billingCity
  • billingPostcode
  • billingState
  • billingCountry
  • billingPhone
  • shippingAddress1
  • shippingAddress2
  • shippingCity
  • shippingPostcode
  • shippingState
  • shippingCountry
  • shippingPhone
  • company
  • email

Even off-site gateways make use of the CreditCard object, because often you need to pass customer billing or shipping details through to the gateway.

The CreditCard object can be initialized with untrusted user input via the constructor. Any fields passed to the constructor which are not recognized will be ignored.

$formInputData = array(
    'firstName' => 'Bobby',
    'lastName' => 'Tables',
    'number' => '4111111111111111',
);
$card = new CreditCard($formInputData);

You can also just pass the form data array directly to the gateway, and a CreditCard object will be created for you.

CreditCard fields can be accessed using getters and setters:

$number = $card->getNumber();
$card->setFirstName('Adrian');

If you submit credit card details which are obviously invalid (missing required fields, or a number which fails the Luhn check), InvalidCreditCardException will be thrown. You should validate the card details using your framework's validation library before submitting the details to your gateway, to avoid unnecessary API calls.

For on-site payment gateways, the following card fields are generally required:

  • firstName
  • lastName
  • number
  • expiryMonth
  • expiryYear
  • cvv

You can also verify the card number using the Luhn algorithm by calling Helper::validateLuhn($number).

Gateway Methods

The main methods implemented by gateways are:

  • authorize($options) - authorize an amount on the customer's card
  • completeAuthorize($options) - handle return from off-site gateways after authorization
  • capture($options) - capture an amount you have previously authorized
  • purchase($options) - authorize and immediately capture an amount on the customer's card
  • completePurchase($options) - handle return from off-site gateways after purchase
  • refund($options) - refund an already processed transaction
  • void($options) - generally can only be called up to 24 hours after submitting a transaction
  • acceptNotification() - convert an incoming request from an off-site gateway to a generic notification object for further processing
  • createCard - get a cardReference that can be used for future payments. This might be used in a monthly billing scenario, for example.

On-site gateways do not need to implement the completeAuthorize and completePurchase methods. Gateways that don't receive payment notifications don't need to implement acceptNotification. If any gateway does not support certain features (such as refunds), it will throw BadMethodCallException.

All gateway methods except acceptNotification take an $options array as an argument. The acceptNotification method does not take any parameters and will access the HTTP URL variables or POST data implicitly. Each gateway differs in which parameters are required, and the gateway will throw InvalidRequestException if you omit any required parameters. All gateways will accept a subset of these options:

  • card
  • token
  • amount
  • currency
  • description
  • transactionId
  • clientIp
  • returnUrl
  • cancelUrl

Pass the options through to the method like so:

$card = new CreditCard($formData);
$request = $gateway->authorize(array(
    'amount' => '10.00', // this represents $10.00
    'card' => $card,
    'returnUrl' => 'https://www.example.com/return',
));

When calling the completeAuthorize or completePurchase methods, the exact same arguments should be provided as when you made the initial authorize or purchase call (some gateways will need to verify for example the actual amount paid equals the amount requested). The only parameter you can omit is card.

To summarize the various parameters you have available to you:

  • Gateway settings (e.g. username and password) are set directly on the gateway. These settings apply to all payments, and generally you will store these in a configuration file or in the database.
  • Method options are used for any payment-specific options, which are not set by the customer. For example, the payment amount, currency, transactionId and returnUrl.
  • CreditCard parameters are data which the user supplies. For example, you want the user to specify their firstName and billingCountry, but you don't want a user to specify the payment currency or returnUrl.

The Payment Response

The payment response must implement ResponseInterface. There are two main types of response:

  • Payment was successful (standard response)
  • Website requires redirect to off-site payment form (redirect response)

Successful Response

For a successful responses, a reference will normally be generated, which can be used to capture or refund the transaction at a later date. The following methods are always available:

$response = $gateway->purchase(array('amount' => '10.00', 'card' => $card))->send();

$response->isSuccessful(); // is the response successful?
$response->isRedirect(); // is the response a redirect?
$response->getTransactionReference(); // a reference generated by the payment gateway
$response->getTransactionId(); // the reference set by the originating website if available.
$response->getMessage(); // a message generated by the payment gateway

In addition, most gateways will override the response object, and provide access to any extra fields returned by the gateway. If the payment authorization is re-usable the gateway will implement $response->getCardReference();. This method is always available (but may return NULL) from 3.1.1

Redirect Response

The redirect response is further broken down by whether the customer's browser must redirect using GET (RedirectResponse object), or POST (FormRedirectResponse). These could potentially be combined into a single response class, with a getRedirectMethod().

After processing a payment, the cart should check whether the response requires a redirect, and if so, redirect accordingly:

$response = $gateway->purchase(array('amount' => '10.00', 'card' => $card))->send();
if ($response->isSuccessful()) {
    // payment is complete
} elseif ($response->isRedirect()) {
    $response->redirect(); // this will automatically forward the customer
} else {
    // not successful
}

The customer isn't automatically forwarded on, because often the cart or developer will want to customize the redirect method (or if payment processing is happening inside an AJAX call they will want to return JS to the browser instead).

To display your own redirect page, simply call getRedirectUrl() on the response, then display it accordingly:

$url = $response->getRedirectUrl();
// for a form redirect, you can also call the following method:
$data = $response->getRedirectData(); // associative array of fields which must be posted to the redirectUrl

Error Handling

You can test for a successful response by calling isSuccessful() on the response object. If there was an error communicating with the gateway, or your request was obviously invalid, an exception will be thrown. In general, if the gateway does not throw an exception, but returns an unsuccessful response, it is a message you should display to the customer. If an exception is thrown, it is either a bug in your code (missing required fields), or a communication error with the gateway.

You can handle both scenarios by wrapping the entire request in a try-catch block:

try {
    $response = $gateway->purchase(array('amount' => '10.00', 'card' => $card))->send();
    if ($response->isSuccessful()) {
        // mark order as complete
    } elseif ($response->isRedirect()) {
        $response->redirect();
    } else {
        // display error to customer
        exit($response->getMessage());
    }
} catch (\Exception $e) {
    // internal error, log exception and display a generic message to the customer
    exit('Sorry, there was an error processing your payment. Please try again later.');
}

Test mode and developer mode

Most gateways allow you to set up a sandbox or developer account which uses a different url and credentials. Some also allow you to do test transactions against the live site, which does not result in a live transaction.

Gateways that implement only the developer account (most of them) call it testMode. Authorize.net, however, implements both and refers to this mode as developerMode.

When implementing with multiple gateways you should use a construct along the lines of the following:

if ($is_developer_mode) {
    if (method_exists($gateway, 'setDeveloperMode')) {
        $gateway->setDeveloperMode(TRUE);
    } else {
        $gateway->setTestMode(TRUE);
    }
}

Token Billing

Token billing allows you to store a credit card with your gateway, and charge it at a later date. Token billing is not supported by all gateways. For supported gateways, the following methods are available:

  • createCard($options) - returns a response object which includes a cardReference, which can be used for future transactions
  • updateCard($options) - update a stored card, not all gateways support this method
  • deleteCard($options) - remove a stored card, not all gateways support this method

Once you have a cardReference, (which should be available from the response object using getCardReference) you can use it instead of the card parameter when creating a charge:

$gateway->purchase(array('amount' => '10.00', 'cardReference' => 'abc'));

In many cases the createCard action will also process the initial payment at the same time. In these cases you should pass in the 'action' ('authorize' or 'purchase') in the createCard options.

Recurring Billing

At this stage, automatic recurring payments functionality is out of scope for this library. This is because there is likely far too many differences between how each gateway handles recurring billing profiles. Also in most cases token billing will cover your needs, as you can store a credit card then charge it on whatever schedule you like. Feel free to get in touch if you really think this should be a core feature and worth the effort.

Incoming Notifications

Some gateways (e.g. Cybersource, GoPay) offer HTTP notifications to inform the merchant about the completion (or, in general, status) of the payment. To assist with handling such notifications, the acceptNotification() method will extract the transaction reference and payment status from the HTTP request and return a generic NotificationInterface.

$notification = $gateway->acceptNotification();

$notification->getTransactionReference(); // A reference provided by the gateway to represent this transaction
$notification->getTransactionStatus(); // Current status of the transaction, one of NotificationInterface::STATUS_*
$notification->getMessage(); // Additional message, if any, provided by the gateway

// update the status of the corresponding transaction in your database

Note: some earlier gateways used the completeAuthorize and completePurchase messages to handle the incoming notifications. These are being converted and the complete* messages deprecated. They won't be removed in OmniPay 2.x, but it is advisable to switch to the acceptNotification message when convenient. An example is Sage Pay Server completeAuthorize which is now handled by acceptNotification.

Example Application

An example application is provided in the omnipay/example repo. You can run it using PHP's built in web server (PHP 5.4+):

$ php composer.phar update --dev
$ php -S localhost:8000

For more information, see the Omnipay example application.

Support

If you are having general issues with Omnipay, we suggest posting on Stack Overflow. Be sure to add the omnipay tag so it can be easily found.

If you want to keep up to date with release anouncements, discuss ideas for the project, or ask more detailed questions, there is also a mailing list which you can subscribe to.

If you believe you have found a bug, please report it using the GitHub issue tracker for the appropriate package, or better yet, fork the library and submit a pull request.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Feedback

Please provide feedback! We want to make this library useful in as many projects as possible. Please head on over to the mailing list and point out what you do and don't like, or fork the project and make suggestions. No issue is too small.

More Repositories

1

flysystem

Abstraction for local and remote filesystems
PHP
13,354
star
2

oauth2-server

A spec compliant, secure by default PHP OAuth 2.0 Server
PHP
6,362
star
3

fractal

Output complex, flexible, AJAX/RESTful data structures.
PHP
3,524
star
4

oauth2-client

Easy integration with OAuth 2.0 service providers.
PHP
3,508
star
5

csv

CSV data manipulation made easy in PHP
PHP
3,337
star
6

commonmark

Highly-extensible PHP Markdown parser which fully supports the CommonMark and GFM specs.
PHP
2,738
star
7

glide

Wonderfully easy on-demand image manipulation library with an HTTP based API.
PHP
2,550
star
8

climate

PHP's best friend for the terminal.
PHP
1,867
star
9

html-to-markdown

Convert HTML to Markdown with PHP
PHP
1,619
star
10

flysystem-aws-s3-v3

[READYONLY SUB-SPLIT]Flysystem Adapter for AWS SDK V3
PHP
1,557
star
11

skeleton

A skeleton repository for League Packages
PHP
1,525
star
12

event

Event package for your app and domain
PHP
1,519
star
13

plates

Native PHP template system
PHP
1,470
star
14

geotools

Geo-related tools PHP 7.3+ library built atop Geocoder and React libraries
PHP
1,366
star
15

color-extractor

Extract colors from an image like a human would do.
PHP
1,297
star
16

mime-type-detection

League Mime Type Detection
PHP
1,262
star
17

uri

[READ-ONLY] URI manipulation Library
PHP
1,032
star
18

pipeline

League\Pipeline
PHP
959
star
19

oauth1-client

OAuth 1 Client
PHP
936
star
20

tactician

A small, flexible command bus
PHP
858
star
21

container

Small but powerful dependency injection container
PHP
843
star
22

period

PHP's time range API
PHP
720
star
23

route

Fast PSR-7 based routing and dispatch component including PSR-15 middleware, built on top of FastRoute.
PHP
651
star
24

iso3166

A PHP library providing ISO 3166-1 data.
PHP
639
star
25

factory-muffin

Enables the rapid creation of objects for testing
PHP
533
star
26

openapi-psr7-validator

It validates PSR-7 messages (HTTP request/response) against OpenAPI specifications
PHP
525
star
27

config

Simple yet expressive schema-based configuration library for PHP apps
PHP
478
star
28

uri-interfaces

League URI Interfaces
PHP
459
star
29

shunt

[ABANDONED] PHP library for executing commands on multiple remote machines, via SSH
PHP
436
star
30

oauth2-google

Google Provider for the OAuth 2.0 Client
PHP
396
star
31

uri-parser

RFC3986/RFC3987 compliant URI parser
PHP
394
star
32

flysystem-bundle

Symfony bundle integrating Flysystem into Symfony applications
PHP
361
star
33

flysystem-cached-adapter

Flysystem Adapter Cache Decorator.
PHP
356
star
34

statsd

A library for working with StatsD
PHP
351
star
35

url

A simple PHP library to parse and manipulate URLs
PHP
347
star
36

booboo

A modern error handler capable of logging and formatting errors in a variety of ways.
PHP
338
star
37

omnipay-common

Core components for the Omnipay PHP payment processing library
PHP
330
star
38

monga

Simple and swift MongoDB abstraction.
PHP
328
star
39

flysystem-sftp

[READ-ONLY SUBSPLIT] Flysystem Adapter for SFTP
PHP
308
star
40

uri-components

[READ-ONLY] League URI components objects
PHP
307
star
41

omnipay-paypal

PayPal driver for the Omnipay PHP payment processing library
PHP
299
star
42

oauth2-facebook

Facebook Provider for the OAuth 2.0 Client
PHP
299
star
43

tactician-bundle

Bundle to integrate Tactician with Symfony projects
PHP
245
star
44

uri-schemes

Collection of URI Immutable Value Objects
PHP
216
star
45

uri-manipulations

Functions and Middleware to manipulate URI Objects
PHP
199
star
46

uri-hostname-parser

A lightweight hostname parser according to public suffix list ICANN section
PHP
197
star
47

omnipay-stripe

Stripe driver for the Omnipay PHP payment processing library
PHP
184
star
48

oauth2-server-bundle

Symfony bundle for the OAuth2 Server.
PHP
183
star
49

json-guard

Validation of json-schema.org compliant schemas.
PHP
175
star
50

flysystem-local

PHP
152
star
51

commonmark-ext-table

The table extension for CommonMark PHP implementation
PHP
128
star
52

glide-laravel

Glide adapter for Laravel
PHP
121
star
53

oauth2-github

GitHub Provider for the OAuth 2.0 Client
PHP
109
star
54

flysystem-ziparchive

Flysystem Adapter for ZipArchive's
PHP
101
star
55

omnipay-example

Example application for Omnipay PHP payments library
PHP
100
star
56

glide-symfony

Glide adapter for Symfony
PHP
96
star
57

oauth2-linkedin

LinkedIn Provider for the OAuth 2.0 Client
PHP
83
star
58

flysystem-memory

Flysystem Memory Adapter
PHP
75
star
59

tactician-container

Load Tactician handlers from any PSR-11/container-interop container
PHP
75
star
60

stack-attack

StackPHP Middleware based on Rack::Attack
PHP
74
star
61

flysystem-webdav

[READ ONLY] WebDAV adapter for Flysystem
PHP
70
star
62

flysystem-dropbox

Flysystem Adapter for Dropbox [ABANDONED] replacement: https://packagist.org/packages/spatie/flysystem-dropbox
PHP
67
star
63

stack-robots

StackPHP middleware providing robots.txt disallow for non-production environments
PHP
67
star
64

oauth2-instagram

Instagram Provider for the OAuth 2.0 Client
PHP
65
star
65

tactician-logger

Adds PSR-3 logging support to the Tactician Command Bus
PHP
62
star
66

omnipay-mollie

Mollie driver for the Omnipay PHP payment processing library
PHP
62
star
67

di

An Ultra-Fast Dependency Injection Container. DEPRECATED
PHP
58
star
68

tactician-doctrine

Tactician plugins for the Doctrine ORM, primarily transactions
PHP
57
star
69

omnipay-authorizenet

Authorize.Net driver for the Omnipay payment processing library
PHP
57
star
70

omnipay-sagepay

Sage Pay driver for the Omnipay PHP payment processing library
PHP
55
star
71

flysystem-azure-blob-storage

PHP
53
star
72

flysystem-aws-s3-v2

Flysystem Adapter for AWS SDK V2
PHP
50
star
73

DEPRECATED-squery

PHP wrapper for osquery
PHP
49
star
74

phpunit-coverage-listener

Report code coverage statistics to third-party services
PHP
48
star
75

thephpleague.github.io

The League of Extraordinary Packages website
SCSS
45
star
76

construct-finder

PHP code construct finder
PHP
42
star
77

factory-muffin-faker

A wrapper around faker for factory muffin
PHP
40
star
78

uri-query-parser

a parser and a builder to work with URI query string the right way in PHP
PHP
37
star
79

flysystem-rackspace

Flysystem Adapter for Rackspace
PHP
37
star
80

flysystem-azure

Flysystem adapter for the Windows Azure.
PHP
35
star
81

flysystem-sftp-v3

PHP
35
star
82

omnipay-braintree

Braintree Driver for Omnipay Gateway
PHP
34
star
83

json-reference

A library for working with JSON References.
PHP
33
star
84

uri-src

URI manipulation Library
PHP
29
star
85

commonmark-extras

Useful extensions for the league/commonmark parser
PHP
28
star
86

uploads

Receive, validate, and distribute uploaded files.
PHP
27
star
87

object-mapper

PHP
27
star
88

omnipay-dummy

Dummy driver for the Omnipay PHP payment processing library
PHP
26
star
89

flysystem-replicate-adapter

Flysystem Adapter Decorator for Replicating Filesystems.
PHP
24
star
90

omnipay-paymentexpress

PaymentExpress driver for the Omnipay PHP payment processing library
PHP
24
star
91

omnipay-worldpay

WorldPay driver for the Omnipay PHP payment processing library
PHP
23
star
92

flysystem-ftp

[SUB-SPLIT] Flysystem FTP Adapter
PHP
23
star
93

flysystem-async-aws-s3

PHP
22
star
94

omnipay-migs

MIGS driver for the Omnipay PHP payment processing library
PHP
21
star
95

omnipay-payfast

PayFast driver for the Omnipay PHP payment processing library
PHP
21
star
96

flysystem-google-cloud-storage

PHP
20
star
97

omnipay-firstdata

First Data driver for the Omnipay PHP payment processing library
PHP
20
star
98

omnipay-multisafepay

MultiSafepay driver for the Omnipay PHP payment processing library
PHP
19
star
99

flysystem-gridfs

GridFS Adapter for Flysystem
PHP
19
star
100

tactician-bernard

Tactician integration with the Bernard queueing library
PHP
19
star