Omnipay

适用于 PHP 5.6+ 的框架无关、多网关支付处理库。(A framework agnostic, multi-gateway payment processing library for PHP 5.6+.)

  • Owner: thephpleague/omnipay
  • Platform: Linux, Mac, Windows
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

Omnipay

一个易于使用、一致的PHP支付处理库。

Omnipay 是 PHP 的支付处理库。 它的设计基于 Active Merchant 的创意,以及为Active Merchant 实施数十个网关的经验。 它具有清晰一致的 API,经过全面的单元测试,甚至还带有一个示例应用程序,可帮助您入门。

为什么要使用 Omnipay 而不是网关的官方 PHP 包/示例代码?

  • 因为您可以学习一个API并在使用不同支付网关的多个项目中使用它
  • 因为如果您需要更改支付网关,则无需重写代码
  • 因为大多数官方的PHP支付网关库都是一团糟
  • 因为大多数支付网关的文档非常差
  • 因为您正在编写购物车并需要支持多个网关

TL; DR

只是想看一些代码?

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();
}

正如您所看到的,Omnipay 有一个一致的、经过深思熟虑的 API。我们试图尽可能抽象出不同支付网关之间的差异。

包布局

Omnipay 是一个包的集合,它们都依赖于 omnipay/common 包来提供一致的界面。 跟官方支付网关 PHP 包没有依赖关系 —— 我们更喜欢直接使用 HTTP API。 在幕后,我们使用流行且功能强大的 PHP-HTTP 库来发出 HTTP 请求。 使用 league/omnipay 时,默认情况下需要 Guzzle 适配器。

可以通过克隆现有包的布局来创建新网关。 在为您的包裹选择名称时,请不要使用 omnipay 供应商前缀,因为这意味着它是官方支持的。 您应该使用自己的用户名作为供应商前缀,并在包名称前加上 omnipay-,以明确您的包与 Omnipay一 起使用。 例如,如果您的 GitHub 用户名是 santa,并且您正在实施 giftpay 支付库,那么您的作曲家包的一个好名字将是 santa/omnipay-giftpay。

安装

Omnipay 通过 Composer 安装。 对于大多数用途,您需要要求 league/omnipay 和一个单独的网关:

composer require league/omnipay:^3 omnipay/paypal

如果你想使用你自己的 HTTP Client 而不是 Guzzle(这是 league/omnipay 的默认设置),你可以 require league/common 和任何 php-http/client-implementation(参见 PHP Http

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

Main metrics

Overview
Name With Ownerthephpleague/omnipay
Primary LanguagePHP
Program languagePHP (Language Count: 1)
PlatformLinux, Mac, Windows
License:MIT License
所有者活动
Created At2012-09-03 14:35:08
Pushed At2024-08-12 20:57:09
Last Commit At2023-12-06 19:49:16
Release Count31
Last Release Namev3.2.1 (Posted on )
First Release Namev0.6.0 (Posted on )
用户参与
Stargazers Count6k
Watchers Count244
Fork Count0.9k
Commits Count691
Has Issues Enabled
Issues Count342
Issue Open Count105
Pull Requests Count259
Pull Requests Open Count23
Pull Requests Close Count85
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private

Omnipay

An easy to use, consistent payment processing library for PHP

Build Status
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 league/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
Acapture (PayVision), ✓, -, qup/omnipay-acapture, Niels de Vries
Adyen, -, ✓, academe/omnipay-adyen, Jason Judge
Agms, ✓, -, agmscode/omnipay-agms, Maanas Royy
Alipay(Global), ✓, ✓, lokielse/omnipay-global-alipay, Loki Else
Alipay, ✓, ✓, lokielse/omnipay-alipay, Loki Else
99Bill, -, ✓, x-class/omnipay-99bill, Laraveler
Allied Wallet, ✓, -, delatbabel/omnipay-alliedwallet, Del
Authorize.Net, ✓, ✓, omnipay/authorizenet, Jason Judge
Authorize.Net API, -, ✓, academe/omnipay-authorizenetapi, Jason Judge
Authorize.Net Recurring Billing, -, ✓, cimpleo/omnipay-authorizenetrecurring, CimpleO
Barclays ePDQ, ✓, -, digitickets/omnipay-barclays-epdq, DigiTickets
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
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
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
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
MultiCards, ✓, -, incube8/omnipay-multicards, Del
MultiSafepay, ✓, -, omnipay/multisafepay, Alexander Deruwe
MyCard, ✓, -, xxtime/omnipay-mycard, Joe Chu
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
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
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
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
PayPal, ✓, ✓, omnipay/paypal, Del
PayPro, ✓, -, paypronl/omnipay-paypro, Fruitcake
PAYONE, ✓, ✓, academe/omnipay-payone, Jason Judge
Paysafecard, ✓, -, dercoder/omnipay-paysafecard, Alexander Fedra
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, ✓, -, omnipay/payu, efesaid
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
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
Stripe, ✓, ✓, omnipay/stripe, Del
TargetPay, ✓, -, omnipay/targetpay, Alexander Deruwe
TatraBank, ✓, -, omnipay-tatrabank, 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
Tpay, ✓, -, omnipay/tpay, Tpay.com
Faspay, ✓, ✓, David-Kurniawan/omnipay-faspay, David
Yekpay, -, ✓, nekofar/omnipay-yekpay, Milad Nekofar
ZarinPal, -, ✓, nekofar/omnipay-zarinpal, Milad Nekofar
Moneris, -, ✓, unoapp-dev/omnipay-moneris, UNOapp Dev

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

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.

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, you can use it instead of the card parameter when creating a charge:

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

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 barryvdh@gmail.com 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.