README.md

    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 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.

    Описание

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

    Конвейеры
    0 успешных
    0 с ошибкой