quickpayge/laravel

Laravel integration package for the Quickpay.ge payment gateway

Maintainers

Package info

github.com/QuickPayGe/laravel-package

pkg:composer/quickpayge/laravel

Transparency log

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.1.0 2026-07-31 01:52 UTC

This package is auto-updated.

Last update: 2026-07-31 01:53:29 UTC


README

Laravel integration package for the Quickpay.ge payment gateway.

Provides a ServiceProvider, Facade, config publishing, webhook signature middleware, Laravel Events, and a Blade component. Built on top of quickpayge/php-sdk.

Requirements

  • PHP 8.2+
  • Laravel 11, 12, or 13

Install

composer require quickpayge/laravel

The package is auto-discovered — no manual provider registration needed.

Setup

1. Publish the config

php artisan vendor:publish --tag=quickpay-config

2. Add to .env

QUICKPAY_API_KEY=qpk_live_your_api_key_here
QUICKPAY_WEBHOOK_SECRET=your_webhook_secret
QUICKPAY_TEST_MODE=false
QUICKPAY_SITE_DOMAIN=https://yourstore.ge

Create a payment and redirect

use Quickpay\Laravel\Facades\Quickpay;

$payment = Quickpay::payments->create([
    'amount'            => 99.99,
    'currency'          => 'GEL',
    'description'       => 'Order #1234',
    'merchant_order_id' => 'order-1234',
    'idempotency_key'   => 'order-1234-attempt-1',
    'customer' => [
        'name'  => 'John Doe',
        'email' => 'john@example.com',
        'phone' => '+995599123456',
    ],
]);

return redirect($payment->paymentUrl);

Webhook routes

Option A — middleware only (handle manually)

// routes/web.php
Route::post('/webhook/quickpay', function (Request $request) {
    $event = $request->attributes->get('quickpay_event'); // \Quickpay\Webhook\WebhookEvent

    if ($event->type === 'payment.paid') {
        // mark order as paid
    }

    return response()->json(['ok' => true]);
})->middleware('quickpay.webhook');

Option B — auto-dispatch Laravel events

// routes/web.php
use Quickpay\Laravel\Http\Controllers\WebhookController;

Route::post('/webhook/quickpay', WebhookController::class)
    ->middleware('quickpay.webhook');

Listen for events

// app/Providers/EventServiceProvider.php
protected $listen = [
    \Quickpay\Laravel\Events\PaymentPaid::class     => [App\Listeners\HandlePaymentPaid::class],
    \Quickpay\Laravel\Events\PaymentFailed::class   => [App\Listeners\HandlePaymentFailed::class],
    \Quickpay\Laravel\Events\PaymentExpired::class  => [App\Listeners\HandlePaymentExpired::class],
    \Quickpay\Laravel\Events\PaymentRefunded::class => [App\Listeners\HandlePaymentRefunded::class],
    \Quickpay\Laravel\Events\LeadSubmitted::class   => [App\Listeners\HandleLeadSubmitted::class],
];
// app/Listeners/HandlePaymentPaid.php
use Quickpay\Laravel\Events\PaymentPaid;

class HandlePaymentPaid
{
    public function handle(PaymentPaid $event): void
    {
        $payment = $event->payment; // \Quickpay\DTO\Payment
        // Update your order, send confirmation email, etc.
    }
}

Blade component

{{-- Basic usage --}}
<x-quickpay-button :checkout-link="$link->uuid" />

{{-- With options --}}
<x-quickpay-button
    :checkout-link="$link->uuid"
    label="გადახდა"
    color="#10b981"
    text-color="#ffffff"
    size="lg"
    :full-width="true"
    target="_blank"
/>

Props:

Prop Type Default Description
checkout-link string required Checkout link UUID or full URL
label string Pay Now Button text
color string #2563eb Background color
text-color string #ffffff Text color
size string md sm / md / lg
full-width bool false Stretch to container width
radius string 8px Border radius
target string _self Link target (_blank etc.)

Error handling

use Quickpay\Exceptions\AuthException;
use Quickpay\Exceptions\ValidationException;
use Quickpay\Exceptions\RateLimitException;
use Quickpay\Exceptions\NotFoundException;
use Quickpay\Exceptions\QuickpayException;

try {
    $payment = Quickpay::payments->get('some-uuid');
} catch (AuthException $e) {
    // 401/403
} catch (ValidationException $e) {
    // 422 — field errors in $e->errors
} catch (RateLimitException $e) {
    // 429 — retry after $e->retryAfter() seconds
} catch (NotFoundException $e) {
    // 404
} catch (QuickpayException $e) {
    // catch-all
}

Test mode

Set QUICKPAY_TEST_MODE=true and use a qpk_test_... API key. Test keys only work in test mode and never reach real gateway APIs.