Xác thực API popup
Nội dung Markdown đầy đủ của trang tài liệu.
# Xác thực API popup
Chỉ gọi API này từ backend. Dùng `partnerCode`, `accessKey`, `secretKey` hiện có của tài khoản hoặc cửa hàng. Không đặt secret trong trình duyệt, URL, log hay mã nguồn công khai.
## Header bắt buộc
| Header | Giá trị |
| --- | --- |
| Content-Type | application/json |
| X-Pay2S-Partner | partnerCode |
| X-Pay2S-Access-Key | accessKey của tài khoản/cửa hàng |
| X-Pay2S-Timestamp | Unix timestamp theo giây, lệch tối đa 300 giây |
| X-Pay2S-Signature | HMAC SHA256 dạng hex chữ thường |
Chuỗi ký gồm ba dòng, nối bằng ký tự LF (`\n`), không thêm dòng trống cuối:
```text
pay2s-card-popup-v1
<timestamp>
<SHA256 của nguyên văn body JSON UTF-8>
```
```js
import crypto from 'node:crypto';
const body = JSON.stringify(payload);
const timestamp = String(Math.floor(Date.now() / 1000));
const digest = crypto.createHash('sha256').update(body).digest('hex');
const signature = crypto.createHmac('sha256', process.env.PAY2S_SECRET_KEY)
.update('pay2s-card-popup-v1\n' + timestamp + '\n' + digest)
.digest('hex');
```
Gửi đúng chuỗi `body` đã ký. Đổi khoảng trắng, thứ tự khóa hoặc kiểu số sau khi ký làm chữ ký không còn khớp. Đồng bộ giờ server.
Khóa cửa hàng tự xác định phạm vi cửa hàng. Không có tham số cho phép chọn `user_id`, `store_id` hoặc merchant ePay của tài khoản khác. API backend không mở CORS để gọi bằng secret từ browser.
[Mở Playground](/playground/card-popup/) · [Tạo phiên](/docs/card-popup/create-session/)