Thanh toán crypto cho cửa hàng bán sản phẩm số
Cửa hàng bán khóa, tài khoản, tệp tải về và gói đăng ký có thể nhận crypto thế nào: luồng giao hàng, thanh toán một phần, webhook lặp lại và nên hứa gì với khách.

Cửa hàng bán khóa bản quyền, tài khoản game, tệp tải về hay quyền truy cập có một đặc điểm hiếm gặp: sản phẩm được giao ngay khi tiền về, không cần ai can thiệp. Chính vì vậy crypto rất hợp, và cũng chính vì vậy các chi tiết của luồng thanh toán rất quan trọng. Bài này giải thích điều gì thay đổi, cách gắn việc giao hàng với trạng thái thanh toán và những lỗi khiến cửa hàng số mất hàng tồn.
Vì sao hàng hóa số và crypto hợp nhau
Ba đặc điểm của hàng hóa số khớp với cách thanh toán crypto vận hành:
- Giao hàng tức thì nên thanh toán cũng phải tức thì. Khách đang chờ khóa không muốn đợi ngân hàng đối soát. Thanh toán crypto được chốt ngay khi mạng xác nhận, và hệ thống của bạn có thể giao ngay.
- Khách hàng đã có sẵn. Người mua khóa phần mềm, vật phẩm game, VPN, hosting và các sản phẩm tương tự thường có stablecoin và thích trả bằng chúng, kể cả khách ở những nước mà thẻ của thị trường bạn không dùng được.
- Không có chargeback thẻ. Người gửi không thể hoàn tác một giao dịch crypto. Với cửa hàng từng chịu thiệt vì các khoản thanh toán thẻ bị khiếu nại cho hàng rẻ giao tức thì, đây là thay đổi thực sự. Điều đó cũng có nghĩa hoàn tiền là quyết định của bạn và là khoản chuyển bạn tự gửi, nên hãy viết chính sách hoàn tiền trước khi ra mắt.
Giá vẫn đơn giản: bạn đặt giá bằng đô la Mỹ và khách trả khoản tương đương bằng tài sản và mạng mà họ chọn trên trang thanh toán.
Luồng từ giỏ hàng đến sản phẩm đã giao
Đường đi của một đơn hàng như sau:
- Khách thêm sản phẩm và nhập email (hoặc đăng nhập).
- Ở bước thanh toán, khách chọn «Thanh toán bằng crypto». Máy chủ của bạn tạo một khoản thanh toán cho đơn và nhận liên kết tới trang thanh toán được lưu trữ.
- Bạn chuyển hướng khách tới trang đó. Khách chọn tài sản và mạng rồi trả đúng số tiền từ ví của mình.
- Khi thanh toán hoàn tất, cổng thanh toán gọi webhook của bạn.
- Máy chủ của bạn đánh dấu đơn là đã thanh toán, lấy một khóa hoặc cấp quyền truy cập và gửi qua email cũng như trên trang đơn hàng.
Cửa hàng của bạn không bao giờ tạo địa chỉ, theo dõi blockchain hay đối chiếu số tiền. Nó chỉ làm hai việc: tạo thanh toán và phản ứng với trạng thái cuối. Phiên bản từng bước có mã nằm trong cách nhận thanh toán crypto trên website.
Tạo thanh toán bằng số đơn hàng của chính bạn
Tạo thanh toán từ backend bằng một POST tới https://api.qvard.com/api/v1/payment. Yêu cầu mang khóa của bạn trong header Authorization: Bearer và một JSON có số đơn hàng làm id, price bằng đô la Mỹ và tùy chọn paymentSystemId nếu bạn muốn trang mở sẵn với một tài sản và mạng cụ thể. Phản hồi là 201 kèm redirectUrl.
Hãy dùng số đơn hàng đã tồn tại trong hệ thống trước khi có thanh toán, mỗi lần mua dùng một số riêng. Nếu yêu cầu hết thời gian chờ và bạn gửi lại với cùng id cho cùng phương thức thanh toán, bạn nhận lại khoản thanh toán hiện có thay vì khoản thứ hai, nên việc thử lại là an toàn.
Chỉ tạo thanh toán sau khi khách đã bấm thanh toán, không phải lúc dựng giỏ hàng. Nếu không, giỏ hàng bị bỏ dở sẽ hiện thành một đống thanh toán chưa trả.
Chỉ giao khi thanh toán đầy đủ, và chỉ một lần
Đây là quy tắc bảo vệ hàng tồn của bạn. Một khoản thanh toán có bốn trạng thái: wait (đã tạo), partial (khách gửi ít hơn yêu cầu), completed (đủ số tiền) và rejected. Qvard gọi webhook của bạn khi khoản thanh toán hoàn tất, kèm id bạn đã gửi và status.
Từ đó rút ra hai yêu cầu cho trình xử lý của bạn:
- Chỉ xử lý khi completed. Đừng bao giờ giao khóa chỉ vì khách quay lại website của bạn, hoặc khi mới nhận được một phần số tiền. Bằng chứng thanh toán là webhook, không phải trình duyệt.
- Phải idempotent. Webhook được gửi lại cho tới khi endpoint của bạn trả lời đúng HTTP 200 (năm lần trong khoảng sáu phút), và một lần gửi lại có thể đến sau khi lần đầu đã thành công. Hãy giao khóa và đánh dấu đơn đã giao trong một giao dịch cơ sở dữ liệu duy nhất, và bỏ qua các đơn đã giao. Nếu không, một khoản thanh toán có thể khiến bạn mất hai khóa.
Xác minh chữ ký X-Qvard-Signature của mỗi webhook: HMAC-SHA256 bằng khóa bí mật của bạn, so sánh theo thời gian không đổi và từ chối những cái không khớp. Xem thêm cách bảo mật webhook thanh toán crypto.
// Called from the Qvard webhook handler after the X-Qvard-Signature check.
async function onQvardEvent({ id, status }) {
const order = await db.orders.findById(id);
if (!order) return; // unknown order: ignore
if (status !== 'completed') return; // deliver only on a full payment
if (order.deliveredAt) return; // the webhook can arrive twice
// One transaction: take a key and mark the order, so a retry cannot take a second key.
await db.transaction(async (tx) => {
const key = await tx.licenseKeys.takeFree(order.productId);
await tx.orders.update(order.id, { state: 'paid', deliveredAt: new Date(), keyId: key.id });
await mailer.send(order.email, 'Your purchase', 'Key: ' + key.value);
});
}Cho khách thấy chuyện gì đang xảy ra
Chưa có URL quay lại sau khi thanh toán, nên khách đã trả tiền tự quay lại website của bạn, thường vài giây trước khi webhook được xử lý. Hãy chuẩn bị cho khoảnh khắc đó:
- Cho mỗi đơn một trang hiển thị trạng thái hiện tại: đang chờ thanh toán, đã thanh toán và đã giao, hoặc có vấn đề.
- Để trang tự làm mới khi trạng thái còn đang chờ, để khóa hiện ra mà khách không phải tải lại.
- Gửi khóa qua email nữa. Mọi người đóng tab, và email là bản sao họ sẽ tìm sau này.
- Nếu đơn chưa được đánh dấu đã thanh toán, hãy nói rõ và đề nghị khách đừng trả hai lần.
Phần lớn yêu cầu hỗ trợ ở cửa hàng số là «tôi đã trả tiền mà không nhận được gì». Trang trạng thái và email giúp giảm số này nhiều nhất.
Thanh toán thiếu và đơn hết hạn
Khách crypto đôi khi gửi ít hơn một chút so với yêu cầu, vì phí rút của sàn bị trừ khỏi số tiền, hoặc họ trả muộn hơn dự định. Hãy quyết định trước phải làm gì.
- Thanh toán một phần. Trạng thái là
partial. Đừng giao hàng. Cách thường gặp là giữ đơn mở và đề nghị khách gửi phần còn lại, hoặc hoàn tiền và hủy đơn. Chọn một cách và báo cho khách trên trang đơn hàng. - Tỷ giá và thời gian. Tỷ giá trên trang thanh toán được cố định trong một giờ, nên số tiền không đổi khi khách đang trả. Giữ hàng cho đơn ít nhất bằng thời gian đó và giải phóng nếu đơn không bao giờ được trả.
- Hàng tồn có hạn. Nếu chỉ còn một khóa, hãy giữ chỗ khi tạo thanh toán và giải phóng khi hết hạn; nếu không, hai khách có thể cùng trả tiền cho một khóa.
Giữ logic ngắn gọn. Cửa hàng chỉ có đúng ba kết quả (đã trả, một phần, chưa trả) dễ vận hành hơn cửa hàng có cả chục trường hợp đặc biệt.
Nên nói gì với khách hàng
Một trang thanh toán rõ ràng có tỷ lệ chuyển đổi cao hơn một trang cầu kỳ. Gần nút bấm, hãy nêu:
- bạn nhận những tài sản và mạng nào (xem các đồng được hỗ trợ) và khách phải trả trên mạng đã chọn ở trang thanh toán;
- việc giao hàng là tự động sau khi thanh toán hoàn tất, và khóa sẽ xuất hiện ở đâu;
- quy tắc hoàn tiền của bạn trong một câu, vì khách không thể hoàn tác thanh toán crypto.
Hãy nêu cả giá bằng đô la và để trang thanh toán hiển thị số tiền chính xác bằng tài sản đã chọn. Đừng tự ghi số lượng crypto trên trang sản phẩm; nó thay đổi theo tỷ giá.
Hiện Qvard đã có gì và chưa có gì
Hãy thực tế về thứ bạn đang tích hợp. Qvard hoạt động qua API: cửa hàng của bạn tạo thanh toán và nhận webhook. Chưa có plugin dựng sẵn cho các nền tảng cửa hàng, liên kết thanh toán và sandbox riêng đang được phát triển, và khách tự quay lại website của bạn sau khi trả tiền. Với cửa hàng có lập trình viên, hoặc một giờ làm việc của freelancer, đó là một đoạn mã nhỏ. Xem tài liệu dành cho lập trình viên và tổng quan tích hợp, rồi mở một hóa đơn demo để xem khách của bạn sẽ thấy gì.
Về tiền, khoản thu nằm trong số dư Qvard của bạn và bạn rút về ví của mình; việc rút chỉ tốn phí mạng, và không có phí đăng ký. Rút về tài khoản ngân hàng bằng tiền pháp định không khả dụng.
FAQ
Tôi có thể giao sản phẩm tự động sau khi thanh toán crypto không?
Có. Qvard gọi webhook của bạn khi thanh toán hoàn tất, rồi máy chủ của bạn có thể lấy khóa hoặc cấp quyền truy cập và gửi cho khách. Chỉ giao khi trạng thái là completed và làm cho trình xử lý an toàn khi chạy hai lần.
Điều gì xảy ra nếu khách gửi ít hơn số tiền đầy đủ?
Khoản thanh toán nhận trạng thái partial và webhook hoàn tất không được gửi. Đừng giao hàng. Hãy đề nghị khách gửi phần còn lại hoặc hoàn tiền, tùy chính sách của bạn.
Thanh toán crypto có chargeback không?
Không. Người gửi không thể hoàn tác một giao dịch crypto. Điều đó bảo vệ bạn khỏi các khoản thanh toán thẻ bị khiếu nại, nhưng cũng có nghĩa hoàn tiền do bạn tự gửi, nên hãy xác định chính sách hoàn tiền ngay từ đầu.
Tôi có thể đặt giá bằng đô la không?
Có, giá được đặt bằng đô la Mỹ. Khách trả khoản tương đương bằng tài sản và mạng họ chọn trên trang thanh toán, theo tỷ giá cố định trong một giờ.
Có plugin cho nền tảng cửa hàng của tôi không?
Chưa có. Hiện tại tích hợp qua API: một yêu cầu để tạo thanh toán và một webhook để nhận kết quả.

