Bỏ qua để đến nội dung
Beta · Đặc tả có thể còn thay đổi trước khi ra mắt chính thức. Tên miền API api.hensa.example là tạm thời. Xem thay đổi →

Bắt đầu nhanh

Mục tiêu: từ con số 0 tới webhook payment_request.paid đầu tiên trong 5 phút, hoàn toàn trong test mode – không cần liên hệ ai, không cần chuyển tiền thật.

  1. Vào Dashboard › Cài đặt › Developer › Tạo khóa, chọn Thử nghiệm. Khóa có dạng hk_test_… và chỉ hiện một lần – lưu vào biến môi trường:

    export HENSA_API_KEY="hk_test_..."
  2. Mỗi đơn hàng một yêu cầu. Gửi kèm Idempotency-Key để lỡ mạng chập chờn gửi lại cũng không tạo trùng.

    curl https://api.hensa.example/v1/payment_requests \
    -H "Authorization: Bearer $HENSA_API_KEY" \
    -H "Idempotency-Key: $(uuidgen)" \
    -H "Content-Type: application/json" \
    -d '{ "amount": 150000, "externalOrderRef": "DH-1024" }'

    Kết quả (201 Created):

    {
    "id": "prq_01JD7Q8M4K2X9V3T6B5N0R1W8Y",
    "amount": 150000,
    "currency": "VND",
    "referenceCode": "LK7F3K9",
    "status": "pending",
    "qrPayload": "00020101021238…",
    "receiver": { "name": "CA PHE MOC", "bankName": "MB Bank", "accountMasked": "•••• 6789" },
    "externalOrderRef": "DH-1024",
    "expiresAt": "2026-11-03T08:15:00Z",
    "createdAt": "2026-11-03T08:00:00Z"
    }
  3. Vẽ qrPayload thành mã QR bằng bất kỳ thư viện QR nào, kèm tên người nhận (receiver.name) và số tiền để khách yên tâm. Mã hết hạn lúc expiresAt (15 phút).

  4. Dashboard › Developer › Thêm endpoint → nhập URL HTTPS của bạn, chọn sự kiện payment_request.paid. Lưu secret ký whsec_… (chỉ hiện một lần).

    Chạy trên máy cá nhân? Dùng một công cụ tạo đường hầm HTTPS (vd. ngrok, Cloudflare Tunnel) để có URL công khai trỏ về localhost.

  5. server.js
    import express from 'express'
    import { verifyHensaSignature } from './verify-hensa-signature.js'
    const app = express()
    // Use the RAW body – parsing JSON first changes the bytes and breaks the signature.
    app.post('/webhooks/hensa', express.raw({ type: 'application/json' }), async (req, res) => {
    const raw = req.body.toString('utf8')
    if (!verifyHensaSignature(raw, req.get('Hensa-Signature'), process.env.HENSA_WEBHOOK_SECRET)) {
    return res.sendStatus(400)
    }
    const event = JSON.parse(raw)
    // Idempotent: the same event id can arrive more than once.
    if (await db.processedEvents.exists(event.id)) return res.sendStatus(200)
    if (event.type === 'payment_request.paid') {
    await orders.markPaid(event.data.externalOrderRef, event.data.id)
    }
    await db.processedEvents.insert(event.id)
    res.sendStatus(200) // answer within 10 s – do slow work in a queue
    })

    Hàm verifyHensaSignature ở Xác thực chữ ký.

  6. Trong test mode, bạn tự “chuyển tiền” bằng một lệnh – ghi mã tham chiếu vào nội dung để Hensa tự khớp:

    curl https://api.hensa.example/v1/test/bank_transfers \
    -H "Authorization: Bearer $HENSA_TEST_KEY" \
    -H "Idempotency-Key: $(uuidgen)" \
    -H "Content-Type: application/json" \
    -d '{ "amount": 150000, "description": "LK7F3K9 thanh toan don hang", "counterpartyName": "NGUYEN VAN AN" }'

    Trong vài giây, máy chủ của bạn nhận bank_transaction.created rồi payment_request.paid. Đơn DH-1024 đã được thanh toán.

  • Đổi sang khóa hk_live_… (biến môi trường riêng cho production)
  • Tạo endpoint webhook production với URL thật, lưu secret mới
  • Xử lý chống trùng theo event.id – xem Webhook
  • Chạy đối soát định kỳ làm lưới an toàn
  • Xử lý payment_request.expired (nhả hàng đang giữ)