定制 ftech/laravel-azopay 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

ftech/laravel-azopay

Composer 安装命令:

composer require ftech/laravel-azopay

包简介

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

README 文档

README

Tích hợp cổng thanh toán AzoPay (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

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://app.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://app.azopay.vn. Server tự kiểm tra sandbox/live dựa trên API key nên không cần chọn môi trường.

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 & tài khoản ngân hàng

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

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

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=<ts>,v1=<hmac>), 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ả):

Event AzoPay 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

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)

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

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

MIT.

统计信息

  • 总下载量: 1
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 3
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-06-05