Skip to content

Welcome to the Laravel Paystack Developer Package which you will use to build amazing payment experiences with the Paystack API.

License

Notifications You must be signed in to change notification settings

binkode/laravel-paystack

Repository files navigation

laravel-paystack

Use Paystack Apis in your laravel project.

There are other libraries but this was created to solve the issues such as flexibility and ability to call paystack apis in laravel Job scope.

Software License Travis Total Downloads Postman Collection

Install

composer require binkode/laravel-paystack

Setup

The package will automatically register a service provider.

You need to publish the configuration file:

php artisan vendor:publish --provider="Binkode\Paystack\PaystackServiceProvider"

Publish config

This is the default content of the config file paystack.php:

<?php

return [
    "public_key"    => env("PAYSTACK_PUBLIC_KEY"),
    "secret_key"    => env("PAYSTACK_SECRET_KEY"),
    "url"           => env("PAYSTACK_URL", 'https://api.paystack.co'),
    "merchant_email"           => env("PAYSTACK_MERCHANT_EMAIL"),

    "route" => [
        "middleware"        => ["paystack_route_disabled", "api"], // For injecting middleware to the package's routes
        "prefix"            => "api", // For injecting middleware to the package's routes
        "hook_middleware"   => ["validate_paystack_hook", "api"]
    ],
];

Update env

Update Your Projects .env with their credentials:

PAYSTACK_PUBLIC_KEY=XXXXXXXXXXXXXXXXXXXX
PAYSTACK_SECRET_KEY=XXXXXXXXXXXXXXXXXXXX
PAYSTACK_URL=https://api.paystack.co
PAYSTACK_MERCHANT_EMAIL=username@email.extension

Usage

Transaction

use Binkode\Paystack\Support\Transaction;

Transaction::list($params);

Transaction::initialize($params);

Transaction::verify($reference, $params);

Transaction::fetch($transaction, $params);

Transaction::charge_authorization($params);

Transaction::check_authorization($params);

Transaction::viewTimeline($id_or_reference, $params);

Transaction::totals($params);

Transaction::export($params);

Transaction::partial_debit($params);

Transaction Split

use Binkode\Paystack\Support\Split;

Split::create($params);

Split::list($params);

Split::fetch($split, $params);

Split::update($split, $params);

Split::add($split, $params);

Split::remove($split, $params);

Apple Pay

use Binkode\Paystack\Support\ApplePay;

ApplePay::createDomain($params);

ApplePay::listDomains($params);

ApplePay::removeDomain($params);

Subaccounts

use Binkode\Paystack\Support\SubAccount;

SubAccount::create($params);

SubAccount::list($params);

SubAccount::fetch($subaccount, $params);

SubAccount::update($subaccount, $params);

Customer

use Binkode\Paystack\Support\Customer;

Customer::create($params);

Customer::list($params);

Customer::fetch($customer, $params);

Customer::update($customer, $params);

Customer::identification($customer, $params);

Customer::set_risk_action($customer, $params);

Customer::deactivate_authorization($params);

Dedicated Virtual Accounts

use Binkode\Paystack\Support\DedicatedVirtualAccount;

DedicatedVirtualAccount::create($params);

DedicatedVirtualAccount::list($params);

DedicatedVirtualAccount::fetch($dedicated_account, $params);

DedicatedVirtualAccount::remove($dedicated_account, $params);

DedicatedVirtualAccount::split($params);

DedicatedVirtualAccount::removeSplit($params);

DedicatedVirtualAccount::providers($params);

Plans

use Binkode\Paystack\Support\Plan;

Plan::create($params);

Plan::list($params);

Plan::fetch($plan, $params);

Plan::update($plan, $params);

Subscriptions

use Binkode\Paystack\Support\Subscription;

Subscription::create($params);

Subscription::list($params);

Subscription::fetch($plan, $params);

Subscription::enable($params);

Subscription::disable($params);

Subscription::link($code, $params);

Subscription::sendUpdateSubscription($code, $params);

Products

use Binkode\Paystack\Support\Product;

Product::create($params);

Product::list($params);

Product::fetch($product, $params);

Product::update($product, $params);

Payment Pages

use Binkode\Paystack\Support\Page;

Page::create($params);

Page::list($params);

Page::fetch($page, $params);

Page::update($page, $params);

Page::checkSlug($slug, $params);

Page::addProduct($page, $params);

Invoices

use Binkode\Paystack\Support\Invoice;

Invoice::create($params);

Invoice::list($params);

Invoice::fetch($invoice, $params);

Invoice::update($invoice, $params);

Invoice::verify($code, $params);

Invoice::notify($code, $params);

Invoice::totals($params);

Invoice::finalize($code, $params);

Invoice::archive($code, $params);

Settlements

use Binkode\Paystack\Support\Settlement;

Settlement::list($params);

Settlement::transactions($settlement, $params);

Transfer Recipients

use Binkode\Paystack\Support\Recipient;

Recipient::create($params);

Recipient::bulkCreate($params);

Recipient::list($params);

Recipient::fetch($recipient, $params);

Recipient::update($recipient, $params);

Recipient::remove($recipient, $params);

Transfers

use Binkode\Paystack\Support\Transfer;

Transfer::initiate($params);

Transfer::finalize($params);

Transfer::bulkCreate($params);

Transfer::list($params);

Transfer::fetch($transfer, $params);

Transfer::fetch($reference, $params);

Transfers Control

use Binkode\Paystack\Support\TransferControl;

TransferControl::balance($params);

TransferControl::balanceLedger($params);

TransferControl::resendTransfersOTP($params);

TransferControl::disableTransfersOTP($params);

TransferControl::finalizeDisableOTP($params);

TransferControl::enableTransfersOTP($params);

Bulk Charges

use Binkode\Paystack\Support\BulkCharge;

BulkCharge::initiate($params);

BulkCharge::list($params);

BulkCharge::fetch($bulkcharge, $params);

BulkCharge::fetchChargesBatch($bulkcharge, $params);

BulkCharge::pauseChargesBatch($bulkcharge, $params);

BulkCharge::resumeChargesBatch($bulkcharge, $params);

Control Panel

use Binkode\Paystack\Support\ControlPanel;

ControlPanel::fetchPaymentSessionTimeout($params);

ControlPanel::updatePaymentSessionTimeout($params);

Charge

use Binkode\Paystack\Support\Charge;

Charge::create($params);

Charge::submitPin($params);

Charge::submitOtp($params);

Charge::submitPhone($params);

Charge::submitBirthday($params);

Charge::submitAddress($params);

Charge::checkPending($reference, $params);

Disputes

use Binkode\Paystack\Support\Dispute;

Dispute::list($params);

Dispute::fetch($dispute, $params);

Dispute::listTransaction($dispute, $params);

Dispute::update($dispute, $params);

Dispute::addEvidence($dispute, $params);

Dispute::getUploadURL($dispute, $params);

Dispute::resolve($dispute, $params);

Dispute::export($params);

Refunds

use Binkode\Paystack\Support\Refund;

Refund::create($params);

Refund::list($params);

Refund::fetch($refund, $params);

Verification

use Binkode\Paystack\Support\Verification;

Verification::resolve($params);

Verification::validateAccount($params);

Verification::resolveCardBIN($bin, $params);

Miscellaneous

use Binkode\Paystack\Support\Miscellaneous;

Miscellaneous::listBanks($params);

Miscellaneous::listProviders($params);

Miscellaneous::listCountries($params);

Miscellaneous::listStates($params);

Using WebHook route

Laravel paystack provides you a predefined endpoint that listens to and validates incoming paystack's webhook events. It emits Binkode\Paystack\Events\Hook on every incoming hooks which could be listened to. The hook request is validated with validate_paystack_hook middleware by using the paystack's config secret_key against the incoming request.

Setup Paystack Webhook

Check official page to read more about paystack webhook laravel-paystack exposes hooks api endpoint use the enddpoints url to for the paystack webhook url during the setup.

| POST      | /hooks                                |               | Binkode\Paystack\Http\Controllers\HookController@hook              | api            |

Listening to laravel-paystack Hook event

You may start listening to incoming paystack webhooks after setup by registering the event in your laravel project's EventServiceProvider file.

  • Create an event listener class

php artisan make:listener PaystackWebHookListener --event=Binkode\Paystack\Events\Hook
  • Handle paystack webhook events

<?php

namespace App\Listeners;

use Binkode\Paystack\Events\Hook;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;

class PaystackWebHookListener
{
    /**
     * Handle the event.
     *
     * @param  Binkode\Paystack\Events\Hook  $event
     * @return void
     */
    public function handle(Hook $event)
    {
        Log::debug($event->event);
        /* {
            "event":"charge.success",
            "data": {  
              "id":302961,
              "domain":"live",
              "status":"success",
              "reference":"qTPrJoy9Bx",
              "amount":10000,
              "message":null,
              "gateway_response":"Approved by Financial Institution",
              "paid_at":"2016-09-30T21:10:19.000Z",
              "created_at":"2016-09-30T21:09:56.000Z",
              "channel":"card",
              "currency":"NGN",
              "ip_address":"41.242.49.37",
              "metadata":0,
              "log":{  
                "time_spent":16,
                "attempts":1,
                "authentication":"pin",
                "errors":0,
                "success":false,
                "mobile":false,
                "input":[],
                "channel":null,
                "history":[  
                  {  
                    "type":"input",
                    "message":"Filled these fields: card number, card expiry, card cvv",
                    "time":15
                  },
                  {  
                    "type":"action",
                    "message":"Attempted to pay",
                    "time":15
                  },
                  {  
                    "type":"auth",
                    "message":"Authentication Required: pin",
                    "time":16
                  }
                ]
              },
              "fees":null,
              "customer":{  
                "id":68324,
                "first_name":"BoJack",
                "last_name":"Horseman",
                "email":"bojack@horseman.com",
                "customer_code":"CUS_qo38as2hpsgk2r0",
                "phone":null,
                "metadata":null,
                "risk_action":"default"
              },
              "authorization":{  
                "authorization_code":"AUTH_f5rnfq9p",
                "bin":"539999",
                "last4":"8877",
                "exp_month":"08",
                "exp_year":"2020",
                "card_type":"mastercard DEBIT",
                "bank":"Guaranty Trust Bank",
                "country_code":"NG",
                "brand":"mastercard",
                "account_name": "BoJack Horseman"
              },
              "plan":{}
            } 
          }
        */
    }
}
  • Register PaystackWebHookListener

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;

use Binkode\Paystack\Events\Hook;
use App\Listeners\PaystackWebHookListener;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        ...
        Hook::class => [
            PaystackWebHookListener::class,
        ],
    ];

Using built in routes

Enable the in built routes by removing paystack_route_disabled middleware from paystack's route config.

  POST            apple-pay/domain .............. Binkode\Paystack\Http\Controllers\ApplePayController@createDomain
  GET|HEAD        apple-pay/domain ............... Binkode\Paystack\Http\Controllers\ApplePayController@listDomains
  DELETE          apple-pay/domain .............. Binkode\Paystack\Http\Controllers\ApplePayController@removeDomain
  GET|HEAD        balance ..................... Binkode\Paystack\Http\Controllers\TransferControlController@balance
  GET|HEAD        balance/ledger ........ Binkode\Paystack\Http\Controllers\TransferControlController@balanceLedger
  GET|HEAD        bank ........................ Binkode\Paystack\Http\Controllers\MiscellaneousController@listBanks
  GET|HEAD        bank/resolve ................... Binkode\Paystack\Http\Controllers\VerificationController@resolve
  POST            bank/validate .......... Binkode\Paystack\Http\Controllers\VerificationController@validateAccount
  GET|HEAD        banks ................... Binkode\Paystack\Http\Controllers\MiscellaneousController@listProviders
  POST            bulkcharge ...................... Binkode\Paystack\Http\Controllers\BulkChargeController@initiate
  GET|HEAD        bulkcharge .......................... Binkode\Paystack\Http\Controllers\BulkChargeController@list
  GET|HEAD        bulkcharge/pause/{bulkcharge} Binkode\Paystack\Http\Controllers\BulkChargeController@pauseChargeGET|HEAD        bulkcharge/resume/{bulkcharge} Binkode\Paystack\Http\Controllers\BulkChargeController@resumeCharGET|HEAD        bulkcharge/{bulkcharge} ............ Binkode\Paystack\Http\Controllers\BulkChargeController@fetch
  GET|HEAD        bulkcharge/{bulkcharge}/charges Binkode\Paystack\Http\Controllers\BulkChargeController@fetchCharPOST            charge ................................ Binkode\Paystack\Http\Controllers\ChargeController@create
  POST            charge/submit_address .......... Binkode\Paystack\Http\Controllers\ChargeController@submitAddress
  POST            charge/submit_birthday ........ Binkode\Paystack\Http\Controllers\ChargeController@submitBirthday
  POST            charge/submit_otp .................. Binkode\Paystack\Http\Controllers\ChargeController@submitOtp
  POST            charge/submit_phone .............. Binkode\Paystack\Http\Controllers\ChargeController@submitPhone
  POST            charge/submit_pin .................. Binkode\Paystack\Http\Controllers\ChargeController@submitPin
  GET|HEAD        charge/{reference} .............. Binkode\Paystack\Http\Controllers\ChargeController@checkPending
  GET|HEAD        country ................. Binkode\Paystack\Http\Controllers\MiscellaneousController@listCountries
  POST            customer ............................ Binkode\Paystack\Http\Controllers\CustomerController@create
  GET|HEAD        customer .............................. Binkode\Paystack\Http\Controllers\CustomerController@list
  POST            customer/deactivate_authorization Binkode\Paystack\Http\Controllers\CustomerController@deactivatPOST            customer/set_risk_action ... Binkode\Paystack\Http\Controllers\CustomerController@set_risk_action
  GET|HEAD        customer/{customer} .................. Binkode\Paystack\Http\Controllers\CustomerController@fetch
  PUT             customer/{customer} ................. Binkode\Paystack\Http\Controllers\CustomerController@update
  POST            customer/{customer}/identification Binkode\Paystack\Http\Controllers\CustomerController@identifiGET|HEAD        decision/bin/{bin} ...... Binkode\Paystack\Http\Controllers\VerificationController@resolveCardBIN
  POST            dedicated_account .... Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountController@create
  GET|HEAD        dedicated_account ...... Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountController@list
  GET|HEAD        dedicated_account/available_providers Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountCPOST            dedicated_account/split Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountController@split
  DELETE          dedicated_account/split Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountController@remoGET|HEAD        dedicated_account/{dedicated_account} Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountCDELETE          dedicated_account/{dedicated_account} Binkode\Paystack\Http\Controllers\DedicatedVirtualAccountCGET|HEAD        dispute ................................ Binkode\Paystack\Http\Controllers\DisputeController@list
  GET|HEAD        dispute/transaction/{dispute} Binkode\Paystack\Http\Controllers\DisputeController@listTransaction
  GET|HEAD        dispute/{dispute} ..................... Binkode\Paystack\Http\Controllers\DisputeController@fetch
  PUT             dispute/{dispute} .................... Binkode\Paystack\Http\Controllers\DisputeController@update
  POST            dispute/{dispute}/evidence ...... Binkode\Paystack\Http\Controllers\DisputeController@addEvidence
  GET|HEAD        dispute/{dispute}/export ............. Binkode\Paystack\Http\Controllers\DisputeController@export
  PUT             dispute/{dispute}/resolve ........... Binkode\Paystack\Http\Controllers\DisputeController@resolve
  GET|HEAD        dispute/{dispute}/upload_url ... Binkode\Paystack\Http\Controllers\DisputeController@getUploadURL
  POST            hooks ..................................... Binkode\Paystack\Http\Controllers\HookController@hook
  GET|HEAD        integration/payment_session_timeout Binkode\Paystack\Http\Controllers\ControlPanelController@fetPUT             integration/payment_session_timeout Binkode\Paystack\Http\Controllers\ControlPanelController@updPOST            page .................................... Binkode\Paystack\Http\Controllers\PageController@create
  GET|HEAD        page ...................................... Binkode\Paystack\Http\Controllers\PageController@list
  GET|HEAD        page/check_slug_availability/{slug} .. Binkode\Paystack\Http\Controllers\PageController@checkSlug
  GET|HEAD        page/{page} .............................. Binkode\Paystack\Http\Controllers\PageController@fetch
  PUT             page/{page} ............................. Binkode\Paystack\Http\Controllers\PageController@update
  POST            page/{page}/product ................. Binkode\Paystack\Http\Controllers\PageController@addProduct
  POST            paymentrequest ....................... Binkode\Paystack\Http\Controllers\InvoiceController@create
  GET|HEAD        paymentrequest ......................... Binkode\Paystack\Http\Controllers\InvoiceController@list
  POST            paymentrequest/archive/{invoice_code} Binkode\Paystack\Http\Controllers\InvoiceController@archive
  POST            paymentrequest/finalize/{invoice_code} Binkode\Paystack\Http\Controllers\InvoiceController@finalPOST            paymentrequest/notify/{invoice_code} . Binkode\Paystack\Http\Controllers\InvoiceController@notify
  GET|HEAD        paymentrequest/totals ................ Binkode\Paystack\Http\Controllers\InvoiceController@totals
  GET|HEAD        paymentrequest/verify/{invoice_code} . Binkode\Paystack\Http\Controllers\InvoiceController@verify
  GET|HEAD        paymentrequest/{invoice} .............. Binkode\Paystack\Http\Controllers\InvoiceController@fetch
  PUT             paymentrequest/{invoice} ............. Binkode\Paystack\Http\Controllers\InvoiceController@update
  POST            plan .................................... Binkode\Paystack\Http\Controllers\PlanController@create
  GET|HEAD        plan ...................................... Binkode\Paystack\Http\Controllers\PlanController@list
  GET|HEAD        plan/{plan} .............................. Binkode\Paystack\Http\Controllers\PlanController@fetch
  PUT             plan/{plan} ............................. Binkode\Paystack\Http\Controllers\PlanController@update
  POST            product .............................. Binkode\Paystack\Http\Controllers\ProductController@create
  GET|HEAD        product ................................ Binkode\Paystack\Http\Controllers\ProductController@list
  GET|HEAD        product/{product} ..................... Binkode\Paystack\Http\Controllers\ProductController@fetch
  PUT             product/{product} .................... Binkode\Paystack\Http\Controllers\ProductController@update
  POST            refund ................................ Binkode\Paystack\Http\Controllers\RefundController@create
  GET|HEAD        refund .................................. Binkode\Paystack\Http\Controllers\RefundController@list
  GET|HEAD        refund/{refund} ........................ Binkode\Paystack\Http\Controllers\RefundController@fetch
  GET|HEAD        settlement .......................... Binkode\Paystack\Http\Controllers\SettlementController@list
  GET|HEAD        settlement/{settlement}/transactions Binkode\Paystack\Http\Controllers\SettlementController@tranPOST            split .................................. Binkode\Paystack\Http\Controllers\SplitController@create
  GET|HEAD        split .................................... Binkode\Paystack\Http\Controllers\SplitController@list
  GET|HEAD        split/{split} ........................... Binkode\Paystack\Http\Controllers\SplitController@fetch
  PUT             split/{split} .......................... Binkode\Paystack\Http\Controllers\SplitController@update
  POST            split/{split}/subaccount/add .............. Binkode\Paystack\Http\Controllers\SplitController@add
  POST            split/{split}/subaccount/remove ........ Binkode\Paystack\Http\Controllers\SplitController@remove
  POST            subaccount ........................ Binkode\Paystack\Http\Controllers\SubAccountController@create
  GET|HEAD        subaccount .......................... Binkode\Paystack\Http\Controllers\SubAccountController@list
  GET|HEAD        subaccount/{subaccount} ............ Binkode\Paystack\Http\Controllers\SubAccountController@fetch
  PUT             subaccount/{subaccount} ........... Binkode\Paystack\Http\Controllers\SubAccountController@update
  POST            subscription .................... Binkode\Paystack\Http\Controllers\SubscriptionController@create
  GET|HEAD        subscription ...................... Binkode\Paystack\Http\Controllers\SubscriptionController@list
  POST            subscription/disable ........... Binkode\Paystack\Http\Controllers\SubscriptionController@disable
  POST            subscription/enable ............. Binkode\Paystack\Http\Controllers\SubscriptionController@enable
  POST            subscription/{code}/manage/email Binkode\Paystack\Http\Controllers\SubscriptionController@sendUpGET|HEAD        subscription/{code}/manage/link ... Binkode\Paystack\Http\Controllers\SubscriptionController@link
  GET|HEAD        subscription/{subscription} ...... Binkode\Paystack\Http\Controllers\SubscriptionController@fetch
  GET|HEAD        transaction ........................ Binkode\Paystack\Http\Controllers\TransactionController@list
  POST            transaction/charge_authorization Binkode\Paystack\Http\Controllers\TransactionController@charge_POST            transaction/check_authorization Binkode\Paystack\Http\Controllers\TransactionController@check_auGET|HEAD        transaction/export ............... Binkode\Paystack\Http\Controllers\TransactionController@export
  POST            transaction/initialize ....... Binkode\Paystack\Http\Controllers\TransactionController@initialize
  POST            transaction/partial_debit . Binkode\Paystack\Http\Controllers\TransactionController@partial_debit
  GET|HEAD        transaction/timeline/{id_or_reference} Binkode\Paystack\Http\Controllers\TransactionController@vGET|HEAD        transaction/totals ............... Binkode\Paystack\Http\Controllers\TransactionController@totals
  GET|HEAD        transaction/verify/{reference} ... Binkode\Paystack\Http\Controllers\TransactionController@verify
  GET|HEAD        transaction/{transaction} ......... Binkode\Paystack\Http\Controllers\TransactionController@fetch
  POST            transfer .......................... Binkode\Paystack\Http\Controllers\TransferController@initiate
  GET|HEAD        transfer .............................. Binkode\Paystack\Http\Controllers\TransferController@list
  POST            transfer/bulk ................... Binkode\Paystack\Http\Controllers\TransferController@bulkCreate
  POST            transfer/disable_otp Binkode\Paystack\Http\Controllers\TransferControlController@disableTransferPOST            transfer/disable_otp_finalize Binkode\Paystack\Http\Controllers\TransferControlController@finaliPOST            transfer/enable_otp Binkode\Paystack\Http\Controllers\TransferControlController@enableTransfersOPOST            transfer/finalize_transfer ........ Binkode\Paystack\Http\Controllers\TransferController@finalize
  POST            transfer/resend_otp Binkode\Paystack\Http\Controllers\TransferControlController@resendTransfersOGET|HEAD        transfer/verify/{reference} ......... Binkode\Paystack\Http\Controllers\TransferController@verify
  GET|HEAD        transfer/{transfer} .................. Binkode\Paystack\Http\Controllers\TransferController@fetch
  POST            transferrecipient .................. Binkode\Paystack\Http\Controllers\RecipientController@create
  GET|HEAD        transferrecipient .................... Binkode\Paystack\Http\Controllers\RecipientController@list
  POST            transferrecipient/bulk ......... Binkode\Paystack\Http\Controllers\RecipientController@bulkCreate
  GET|HEAD        transferrecipient/{transferrecipient} Binkode\Paystack\Http\Controllers\RecipientController@fetch
  PUT             transferrecipient/{transferrecipient} Binkode\Paystack\Http\Controllers\RecipientController@updaDELETE          transferrecipient/{transferrecipient} Binkode\Paystack\Http\Controllers\RecipientController@remo

Changelog

Please see CHANGELOG for more information what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Credits

Security

If you discover any security-related issues, please email binkode1@hotmail.com instead of using the issue tracker.

License

The MIT License (MIT). Please see License File for more information.

About

Welcome to the Laravel Paystack Developer Package which you will use to build amazing payment experiences with the Paystack API.

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published

Languages