PHPackages                             ftech/laravel-azopay - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. ftech/laravel-azopay

ActiveLibrary[Payment Processing](/categories/payments)

ftech/laravel-azopay
====================

Laravel package for the AzoPay payment gateway (VietQR bank transfer with automatic reconciliation).

v1.0.0(1mo ago)01↓85.7%MITPHPPHP ^8.1

Since Jun 5Pushed 1mo agoCompare

[ Source](https://github.com/banam8910/laravel-azopay)[ Packagist](https://packagist.org/packages/ftech/laravel-azopay)[ Docs](https://azopay.vn)[ RSS](/packages/ftech-laravel-azopay/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (5)Versions (2)Used By (0)

Laravel AzoPay
==============

[](#laravel-azopay)

Tích hợp cổng thanh toán [AzoPay](https://azopay.vn) (chuyển khoản VietQR, tự động đối soát) cho Laravel.

Package cung cấp client gọi API, tạo đơn thanh toán + QR VietQR, và một webhook endpoint đã xác thực chữ ký để nhận sự kiện biến động giao dịch và bắn ra Laravel events.

- Laravel 10 / 11 / 12 · PHP 8.1+
- Tạo order, lấy QR + thông tin chuyển khoản
- Truy vấn trạng thái order
- Liệt kê tài khoản ngân hàng
- Webhook ký HMAC-SHA256 (`X-AzoPay-Signature`) + chống xử lý trùng (idempotency)

Cài đặt
-------

[](#cài-đặt)

```
composer require ftech/laravel-azopay
php artisan vendor:publish --tag=azopay-config
```

Cấu hình `.env`:

```
AZOPAY_API_KEY=your-api-key        # server tự nhận diện sandbox/live theo API key
AZOPAY_API_URL=https://api.azopay.vn
AZOPAY_BANK_ACCOUNT_ID=42          # ID tài khoản nhận tiền trên dashboard
AZOPAY_PAY_CODE_PREFIX=DH
AZOPAY_EXPIRES_IN=3600
AZOPAY_WEBHOOK_SECRET=whsec_xxx    # có thể nhiều secret, cách nhau bằng dấu phẩy
```

API URL mặc định: `https://api.azopay.vn`. Cả live lẫn sandbox đều dùng chung URL này, chỉ khác nhau ở API key (server tự nhận diện).

Tạo đơn thanh toán
------------------

[](#tạo-đơn-thanh-toán)

```
use Ftech\AzoPay\Facades\AzoPay;
use Ftech\AzoPay\Data\CreateOrderData;

$order = AzoPay::orders()->create(
    CreateOrderData::make()
        ->amount(100_000)                      // VND
        ->merchantOrderId('DH' . $order->id)   // mã đối soát, khớp prefix trên dashboard
        ->description('Đơn hàng #' . $order->id)
        ->metadata(['order_id' => $order->id])
        // ->bankAccount('42')                 // bỏ qua => dùng config mặc định
        // ->expiresIn(1800)
);

$order->id;             // id đơn trên AzoPay
$order->transferCode;   // nội dung chuyển khoản
$order->qrCodeUrl();    // ảnh QR VietQR
$order->checkoutUrl();  // trang thanh toán hosted
$order->paymentInfo->accountNumber;
```

Có thể truyền thẳng mảng thay cho `CreateOrderData`:

```
AzoPay::orders()->create([
    'amount'            => 100_000,
    'merchant_order_id' => 'DH123',
    'description'       => 'Đơn hàng #123',
]);
```

Truy vấn order &amp; tài khoản ngân hàng
----------------------------------------

[](#truy-vấn-order--tài-khoản-ngân-hàng)

```
$order = AzoPay::orders()->find('ord_123');
$order->isPaid();

$accounts = AzoPay::bankAccounts()->all();   // Collection
$account  = AzoPay::bankAccounts()->find('42');
```

Webhook
-------

[](#webhook)

Route `POST /azopay/webhook` được đăng ký tự động (đổi đường dẫn qua `AZOPAY_WEBHOOK_PATH`, hoặc tắt bằng `AZOPAY_WEBHOOK_ROUTE=false`). Endpoint sẽ:

1. Xác thực header `X-AzoPay-Signature` (`t=,v1=`), HMAC-SHA256 trên `"{timestamp}.{body}"`.
2. Chống trùng theo `X-AzoPay-Event-Id`.
3. Bắn Laravel events.

Lắng nghe sự kiện:

```
use Ftech\AzoPay\Events\OrderPaid;

class MarkOrderPaid
{
    public function handle(OrderPaid $event): void
    {
        $order = $event->order();                 // Ftech\AzoPay\Data\Order
        $moid  = $order->merchantOrderId;         // 'DH123'
        $paid  = $order->paidAmount;

        // ... cập nhật đơn hàng của bạn
    }
}
```

Các event có sẵn (đều extend `AzoPayWebhookReceived` — listen class này để nhận tất cả):

EventAzoPay type`OrderPaid``order.paid``OrderUnderpaid``order.underpaid``OrderOverpaid``order.overpaid``OrderCancelled``order.cancelled``OrderExpired``order.expired`Đăng ký trong `EventServiceProvider`:

```
protected $listen = [
    \Ftech\AzoPay\Events\OrderPaid::class => [
        \App\Listeners\MarkOrderPaid::class,
    ],
];
```

### Tự xử lý webhook

[](#tự-xử-lý-webhook)

Muốn tự làm route riêng, tắt route mặc định và dùng middleware xác thực chữ ký:

```
use Ftech\AzoPay\Http\Middleware\VerifyAzoPaySignature;

Route::post('/payments/azopay', PaymentWebhookController::class)
    ->middleware(VerifyAzoPaySignature::class);
```

Hoặc xác thực thủ công:

```
AzoPay::signature()->verify($request->getContent(), $request->header('X-AzoPay-Signature'));
```

Nội dung chuyển khoản (remark)
------------------------------

[](#nội-dung-chuyển-khoản-remark)

VietinBank và ABBANK yêu cầu thêm tiền tố `SEVQR`. Helper tự xử lý:

```
AzoPay::remark('DH123', $bankBin);   // "DH123" hoặc "SEVQR DH123"
```

Testing
-------

[](#testing)

```
composer install
vendor/bin/phpunit
```

Trong app của bạn, fake HTTP của Laravel để test:

```
Http::fake(['*/api/v1/orders' => Http::response(['status' => 'success', 'data' => [...]])]);
```

License
-------

[](#license)

MIT.

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance91

Actively maintained with recent releases

Popularity1

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

50d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/a3a644975e77ee2241c87d2b706823ad7264ed8e9eaaa918bf3a3655e7f57da5?d=identicon)[banam8910](/maintainers/banam8910)

---

Tags

laravelpaymentgatewaybank transfervietqrvietnamazopay

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/ftech-laravel-azopay/health.svg)

```
[![Health](https://phpackages.com/badges/ftech-laravel-azopay/health.svg)](https://phpackages.com/packages/ftech-laravel-azopay)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

77922.3M186](/packages/laravel-mcp)[api-platform/laravel

API Platform support for Laravel

58174.6k17](/packages/api-platform-laravel)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

813336.8k3](/packages/defstudio-telegraph)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5022.6k](/packages/simplestats-io-laravel-client)[linkxtr/laravel-qrcode

A clean, modern, and easy-to-use QR code generator for Laravel

3720.4k](/packages/linkxtr-laravel-qrcode)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
