paytabs / laravel-sdk
Official PayTabs Laravel SDK for Payment Gateway integrations
Requires
- php: ^8.1
- illuminate/support: ^11.0|^12.0|^13.19
- paytabs/php-sdk: ^3.2
Requires (Dev)
- illuminate/config: ^11.0|^12.0|^13.19
- illuminate/log: ^11.0|^12.0|^13.19
- illuminate/routing: ^11.0|^12.0|^13.19
- larastan/larastan: ^3.9
- laravel/pint: ^1.29
- phpunit/phpunit: ^11
README
Official PayTabs Laravel SDK for Payment Gateway integrations. This package provides a Laravel-friendly wrapper around the PayTabs PHP SDK, making it easy to integrate PayTabs payment services into your Laravel application.
Features
- Seamless Laravel Integration: Built as a proper Laravel package with Service Provider and Facade support
- Configuration Management: Environment-based configuration with sensible defaults
- IPN Handling: Built-in Instant Payment Notification (IPN) handling with idempotency support
- Profile Resolution: Support for multiple PayTabs profiles with custom resolvers
- Signature Validation: Automatic signature verification for callbacks
- Type Safety: Full PHP 8.1+ type hints and comprehensive PHPDoc blocks
- Idempotency: Cache-based duplicate delivery prevention for IPNs
Requirements
- PHP >= 8.1
- Laravel >= 11.0
- PayTabs PHP SDK v3
Installation
Install the package via Composer:
composer require paytabs/laravel-sdk
Publish the configuration file:
php artisan vendor:publish --tag=paytabs-config
Quick Start
1. Configure Environment Variables
Add the following to your .env file:
PAYTABS_ENDPOINT=ARE PAYTABS_PROFILE_ID=your_profile_id PAYTABS_SERVER_KEY=your_server_key
2. Create a Payment Request
use Paytabs\Laravel\Facades\Paytabs; use Paytabs\Sdk\Enums\TranClass; use Paytabs\Sdk\Enums\TranType; use Paytabs\Sdk\Request\Payload\PayloadsFactory; use Paytabs\Sdk\Request\Payload\Parts\CustomerDetails; use Paytabs\Sdk\Request\RequestsFactory; // Create the payload $payload = PayloadsFactory::createHostedPage(); // Add customer details $payload ->buildTransaction(TranType::Sale, TranClass::Ecom) ->buildCart('order-001', 'AED', 99.5, 'Order Payment') ->buildCustomerDetails( CustomerDetails::init('Fname Lname', '+971500000000', 'customer@example.com') ->setAddress('UAE', 'State', 'City', 'Street', '12345') ); // Create the request $request = RequestsFactory::createPaymentRequest($payload); // Submit and get response $response = Paytabs::submitRequest($request); if ($response->isFailure()) { echo $response->getFailure()->code . ' - ' . $response->getFailure()->message; exit; } if ($response->isRedirect()) { $paymentUrl = $response->getRedirect()->redirect_url; }
3. Handle IPN Callbacks
The package automatically registers an IPN route at /paytabs/ipn. Configure your IPN handler in config/paytabs.php:
'ipn_handler' => \App\Services\PaytabsIpnHandler::class,
Create your handler:
<?php namespace App\Services; use Paytabs\Laravel\Contracts\IpnHandlerInterface; use Paytabs\Sdk\Response\Responses\Webhook\AbstractTransactionResult; use Paytabs\Sdk\Response\Payload\Payloads\Callbacks\Ipn; class PaytabsIpnHandler implements IpnHandlerInterface { public function handleIpn( AbstractTransactionResult $transactionResult, Ipn $mappedPayload ): void { // Update your order status if ($mappedPayload->isPaymentSuccessful()) { // Payment successful // Fetch order by Tran Ref $order = Order::where('tran_ref', $mappedPayload->tran_ref)->first(); // Fetch order by Order id $order = Order::find($mappedPayload->cart_id); $order->update(['status' => 'paid']); } } }
Documentation
- Installation Guide - Detailed installation and configuration instructions
- Usage Guide - Comprehensive usage examples and patterns
- IPN Handling - Deep dive into IPN processing and customization
Configuration
The package configuration file config/paytabs.php includes the following options:
| Option | Description | Default |
|---|---|---|
endpoint |
PayTabs endpoint region code | ARE |
profile_id |
Your PayTabs profile ID | - |
server_key |
Your PayTabs server key | - |
auto_fill_plugin_info |
Automatically add Laravel SDK info to requests | true |
load_routes |
Load package routes automatically | true |
ipn_enabled |
Enable IPN handling | true |
ipn_route_path |
Custom IPN route path | paytabs/ipn |
ipn_route_middleware |
Middleware for IPN route | ['api'] |
ipn_handler |
Custom IPN handler class | - |
ipn_profile_resolver |
Custom profile resolver class | - |
ipn_idempotency_enabled |
Enable IPN idempotency checks | true |
ipn_idempotency_cache_store |
Cache store for idempotency | null (default) |
ipn_idempotency_key_prefix |
Cache key prefix | paytabs:ipn |
ipn_idempotency_ttl_seconds |
Idempotency lock TTL | 180 |
ack_on_handler_exception |
Acknowledge IPN even if handler fails | true |
ipn_time_guard_enabled |
Enable transaction time Guard | true |
ipn_time_guard_ttl_seconds |
Transaction time guard TTL (seconds) | 3600 |
Using Multiple Profiles
If you need to use different PayTabs profiles for different transactions:
use Paytabs\Laravel\Facades\Paytabs; use Paytabs\Sdk\Profile\Endpoints\Jordan; use Paytabs\Sdk\Profile\ProfilesFactory; use Paytabs\Sdk\Profile\EndpointsFactory; // Create a custom profile $profile = ProfilesFactory::createProfile( EndpointsFactory::getKsaEndpoint(), 12345, 'your_server_key' ); // Use the custom profile Paytabs::usingProfile($profile); // Or use credentials directly Paytabs::usingCredentials(12345, 'your_server_key', Jordan::CODE); // Reset to default configuration Paytabs::usingDefaults();
Security
- Signature Validation: All callbacks are automatically verified using PayTabs signature validation
- Idempotency: Duplicate IPN deliveries are prevented using cache-based locks
- Configuration: Sensitive credentials should be stored in environment variables
- Middleware: IPN endpoint supports custom middleware for additional security layers
Support
For issues and questions:
- GitHub Issues: PayTabs Laravel SDK
- PayTabs PHP SDK Documentation (Chat mode):
- PayTabs Official Documentation: PayTabs Docs
License
This package is open-source software licensed under the MIT license.