Chuyển tới nội dung chính

Bắt đầu nhanh

Một tích hợp thanh toán tối giản: tạo hóa đơn qua API và xử lý thông báo thanh toán. Phần cuối nói về giao hàng. Các ví dụ độc lập và đầy đủ; không dùng SDK.

mẹo

Bạn đang làm việc với một AI agent? Hãy đưa cho nó phiên bản markdown của trang này. Trang có đủ chi tiết để xây dựng tích hợp cho trang web hoặc cửa hàng của bạn.

Điều kiện tiên quyết

Giá trịLấy ở đâu
Khóa APIMục Tích hợp (Integrations)
ID dự ánMục Dự án (Projects)
Khóa bí mật webhookCài đặt dự án

Cũng trong cài đặt dự án đó, hãy đặt Webhook URL — địa chỉ của trình xử lý thông báo trên máy chủ của bạn. Chỉ HTTPS; dịch vụ không đi theo chuyển hướng.

Các ví dụ dùng giá trị thử nghiệm — hãy thay bằng giá trị của bạn.

Tạo hóa đơn

POST https://api.bitsby.app/invoices/create, khóa API truyền trong header Authorization.

Tham sốBắt buộcGiá trị
projectIdID dự án, UUID
amountFiatSố tiền hóa đơn
currencyFiatĐồng tiền: USD, EUR, RUB
timeToPayThời hạn thanh toán tính bằng giờ: 0.5, 1, 3, 6, 12
descriptionkhôngMô tả, hiển thị cho người mua trên trang thanh toán
serviceDatakhôngDữ liệu dịch vụ, không hiển thị cho người mua. Nên truyền số đơn hàng: giá trị này quay lại trong thông báo thanh toán
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

Phản hồi:

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

Lưu data.id cùng đơn hàng và đưa người mua đến data.url — trang thanh toán. Gửi liên kết theo cách bạn muốn: chuyển hướng, email hay tin nhắn bot. Hóa đơn có hiệu lực đến timeToPayDatetime (UTC).

Xử lý thông báo

Khi hóa đơn chuyển sang trạng thái Đã thanh toán (Paid), dịch vụ gửi một yêu cầu POST đến Webhook URL của dự án. Phần thân là JSON; chữ ký nằm trong các header:

HeaderGiá trị
X-TimestampThời điểm gửi, unix time tính bằng giây
X-Signaturesha256= + HMAC-SHA256 dạng hex của chuỗi <timestamp>.<request body>

Khóa ký là khóa bí mật webhook. Dịch vụ tính chữ ký trên phần thân yêu cầu thô, vì vậy hãy xác minh chữ ký trước khi phân tích JSON.

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

Phản hồi bằng mã 2xx trong vòng 10 giây. Mã khác, chuyển hướng hoặc hết thời gian chờ đều tính là gửi thất bại: dịch vụ thử lại với khoảng cách tăng dần từ 5 phút đến 24 giờ, rồi dừng. Đưa các xử lý dài vào hàng đợi: phản hồi 200 trước, rồi mới xử lý đơn hàng.

Định dạng thông báo đầy đủ và mô tả các trường nằm trong mục Webhook URL.

Giao hàng

Thông báo đã xác minh với trạng thái paid xác nhận khoản thanh toán. Các bước giao hàng:

  1. Tìm đơn hàng theo invoice.serviceData — giá trị đã truyền khi tạo hóa đơn (order-4172).
  2. Kiểm tra theo invoice.id xem hóa đơn này đã được giao hàng chưa. Thông báo với cùng invoice.id có thể đến nhiều lần — chỉ giao hàng một lần và lưu cờ đã xử lý.
  3. Xác minh số tiền và đồng tiền theo invoice.amountFiatinvoice.currencyFiat — đây là giá trị gốc của hóa đơn và không bao giờ thay đổi. amountFiatUSD bị ghi đè bằng số tiền thực nhận. So sánh số tiền dưới dạng số, không phải chuỗi: các số 0 cuối bị lược bỏ, nên 49.90 đến dưới dạng 49.9. Nếu các giá trị không khớp với đơn hàng, hãy chuyển hóa đơn sang xem xét thủ công thay vì giao hàng — những trường hợp này được trình bày trong Khớp thanh toán và chênh lệch số tiền.
  4. Giao hàng và đánh dấu đơn hàng đã xử lý.

Đừng kiểm tra thời hạn thanh toán khi giao hàng: khoản thanh toán có thể được xác nhận on-chain sau timeToPayDatetime, và người bán có thể khớp khoản thanh toán với hóa đơn theo cách thủ công. Bản thân thông báo đã xác nhận khoản thanh toán.

Tiếp theo