# Kiểm tra chữ ký

> Dán nội dung yêu cầu hoặc nội dung webhook. Trang này tính chữ ký từng bước theo cách Cryptomus làm, so từng bước với kết quả của bạn và đánh dấu điểm khác biệt đầu tiên. Mọi thứ chạy trong trình duyệt của bạn: trang này hoàn toàn không thể gửi yêu cầu mạng, nên API key của bạn không bao giờ rời khỏi máy.
>
> HTML: https://blockwallets.io/docs/sign?lang=vi · English: https://blockwallets.io/docs/sign.md?lang=en

## Chữ ký yêu cầu (bạn gọi API của chúng tôi)

1. Văn bản được ký là chính xác nội dung yêu cầu bạn gửi, từng byte (kể cả dấu cách, xuống dòng và ký tự thoát).
2. base64 của các byte UTF-8 của nó.
3. sign = md5(bước 2 + API key), gửi trong header `sign`; header `merchant` mang UUID của merchant.

Khi chữ ký sai, API trả về 401, và `debug.body_base64` trong phản hồi chính là bước 2 tính từ nội dung chúng tôi nhận được, sẵn sàng để so với của bạn.

## Chữ ký webhook (chúng tôi gọi URL webhook của bạn)

1. Bỏ trường `sign` và mã hóa lại phần còn lại theo cách `json_encode` của PHP: gọn, `/` được thoát thành `\/`, ký tự không phải ASCII giữ nguyên.
2. base64 của các byte UTF-8 ở bước 1.
3. md5(bước 2 + API key) phải bằng `sign`. Dùng API key của cùng chế độ (Live / Test) với merchant.

## Nguyên nhân thường gặp

- API key của chế độ kia, hoặc khóa đã được đổi.
- Framework đã tuần tự hóa lại nội dung (định dạng đẹp, thứ tự khóa, định dạng số); hãy xác minh trên nội dung thô bạn nhận được.
- Không thoát `/` thành `\/` khi mã hóa lại webhook.

Công cụ chạy hoàn toàn trong trình duyệt của bạn và trang không thể gửi yêu cầu mạng, nên API key của bạn không bao giờ rời khỏi máy. Mã mẫu xác minh: https://blockwallets.io/docs/cryptomus?lang=vi#verify
