Đổi mã lấy token
Nội dung Markdown đầy đủ của trang tài liệu.
# Đổi mã lấy token
`POST https://api.pay2s.vn/api/v1/oauth/token`
## Xác thực
Client ID + Secret.
## Tham số
Định dạng: **application/x-www-form-urlencoded**.
| Trường | Kiểu nhập | Yêu cầu |
|---|---|---|
| `grant_type` | string | Bắt buộc |
| `client_id` | string | Bắt buộc |
| `client_secret` | string | Bắt buộc |
| `code` | string | Bắt buộc |
| `redirect_uri` | string | Bắt buộc |
| `code_verifier` | string | Bắt buộc |
Body application/x-www-form-urlencoded. Code có hiệu lực 120 giây, dùng một lần. code_verifier 43–128 ký tự phải khớp challenge của lần cấp quyền; redirect_uri phải giống lần authorize. Dùng lại code đã đổi thành công sẽ thu hồi kết nối.
## Cách thử
Mở Playground bằng nút đầu trang, nhập thông tin của ứng dụng hoặc Access Token đã được cấp. [Hướng dẫn toàn bộ luồng](/docs/oauth/quickstart/). Code mẫu cURL, Node.js và PHP nằm dưới form Playground.
## Lỗi cần xử lý
`invalid_client` hoặc `invalid_grant` khi thông tin ứng dụng/code/token không hợp lệ. Xem [bảng lỗi](/docs/oauth/errors/).
## Request và response tham khảo
Các mẫu dưới đây giữ cấu trúc trường và kiểu dữ liệu. Khóa, chữ ký, URL phiên đã được thay bằng placeholder; danh sách chỉ giữ tối đa hai phần tử và dữ liệu ảnh/PDF/XML dài được rút gọn. Không sao chép placeholder để gọi API thật.
### OAuth · Đổi mã lấy token
<div class="doc-api-actions" data-doc-api-actions><a class="try-button" data-doc-playground href="/playground/?api=oauth-token">Thử API trong Playground ↗</a><a class="try-button experience-button" data-doc-experience hidden>Trải nghiệm ↗</a></div>
**Đối chiếu mã nguồn backend; giá trị minh họa.** Body application/x-www-form-urlencoded. Code có hiệu lực 120 giây, dùng một lần. code_verifier 43–128 ký tự phải khớp challenge của lần cấp quyền; redirect_uri phải giống lần authorize. Dùng lại code đã đổi thành công sẽ thu hồi kết nối.
`POST /api/v1/oauth/token`
Các giá trị form-urlencoded (minh họa dạng object, không gửi JSON):
```json
{
"grant_type": "authorization_code",
"client_id": "",
"client_secret": "",
"code": "",
"redirect_uri": "",
"code_verifier": ""
}
```
HTTP 200. Response:
```json
{
"access_token": "ACCESS_TOKEN",
"token_type": "Bearer",
"expires_in": 900,
"refresh_token": "REFRESH_TOKEN",
"scope": "accounts:read transactions:read"
}
```