286 lines
5.5 KiB
Markdown
286 lines
5.5 KiB
Markdown
# Tài Liệu API
|
|
|
|
**Dịch vụ**: mkt-facebook-service-net
|
|
**Base URL**: `http://localhost/api/v1/mkt-facebook`
|
|
**Phiên bản API**: v1.0
|
|
|
|
## Xác Thực
|
|
|
|
Tất cả REST API endpoints (trừ webhooks) yêu cầu JWT Bearer token.
|
|
|
|
```http
|
|
Authorization: Bearer {jwt_token}
|
|
```
|
|
|
|
## Webhooks API
|
|
|
|
### Verify Facebook Webhook
|
|
|
|
Facebook dùng endpoint này để verify webhook trong quá trình setup.
|
|
|
|
```http
|
|
GET /api/v1/webhooks/facebook
|
|
```
|
|
|
|
**Query Parameters**:
|
|
| Parameter | Type | Mô Tả |
|
|
|-----------|------|-------|
|
|
| `hub.mode` | string | Phải là "subscribe" |
|
|
| `hub.verify_token` | string | Token được cấu hình trong Facebook App |
|
|
| `hub.challenge` | string | Chuỗi random từ Facebook |
|
|
|
|
**Response** (200 OK):
|
|
```
|
|
{hub.challenge}
|
|
```
|
|
|
|
---
|
|
|
|
### Nhận Facebook Messenger Events
|
|
|
|
Nhận messages, postbacks, và các events khác từ Facebook Messenger Platform.
|
|
|
|
```http
|
|
POST /api/v1/webhooks/facebook
|
|
```
|
|
|
|
**Headers**:
|
|
```
|
|
X-Hub-Signature-256: sha256={signature}
|
|
Content-Type: application/json
|
|
```
|
|
|
|
**Request Body** (Message Event):
|
|
```json
|
|
{
|
|
"object": "page",
|
|
"entry": [{
|
|
"id": "PAGE_ID",
|
|
"time": 1234567890,
|
|
"messaging": [{
|
|
"sender": { "id": "USER_ID" },
|
|
"recipient": { "id": "PAGE_ID" },
|
|
"timestamp": 1234567890,
|
|
"message": {
|
|
"mid": "MESSAGE_ID",
|
|
"text": "Hello chatbot!",
|
|
"quick_reply": {
|
|
"payload": "QUICK_REPLY_PAYLOAD"
|
|
}
|
|
}
|
|
}]
|
|
}]
|
|
}
|
|
```
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"success": true
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Conversations API
|
|
|
|
### Danh Sách Conversations
|
|
|
|
Lấy danh sách conversations có phân trang.
|
|
|
|
```http
|
|
GET /api/v1/conversations
|
|
```
|
|
|
|
**Query Parameters**:
|
|
| Parameter | Type | Required | Default | Mô Tả |
|
|
|-----------|------|----------|---------|-------|
|
|
| `shopId` | guid | Yes | - | Shop/Business ID |
|
|
| `status` | string | No | - | Lọc theo status (Active, Closed) |
|
|
| `skip` | int | No | 0 | Số records bỏ qua |
|
|
| `take` | int | No | 20 | Số records trả về |
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"conversations": [
|
|
{
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"customerId": "650e8400-e29b-41d4-a716-446655440001",
|
|
"customerName": "Nguyễn Văn A",
|
|
"pageId": "123456789",
|
|
"status": "Active",
|
|
"channel": "FacebookMessenger",
|
|
"lastMessageText": "Cảm ơn!",
|
|
"lastMessageAt": "2026-01-18T10:30:00Z",
|
|
"createdAt": "2026-01-18T09:00:00Z"
|
|
}
|
|
],
|
|
"totalCount": 150
|
|
},
|
|
"pagination": {
|
|
"page": 1,
|
|
"limit": 20,
|
|
"total": 150,
|
|
"totalPages": 8
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Lấy Conversation Theo ID
|
|
|
|
Lấy một conversation với toàn bộ lịch sử tin nhắn.
|
|
|
|
```http
|
|
GET /api/v1/conversations/{id}
|
|
```
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
"customer": {
|
|
"id": "650e8400-e29b-41d4-a716-446655440001",
|
|
"name": "Nguyễn Văn A",
|
|
"tags": ["VIP", "Khách hàng quay lại"]
|
|
},
|
|
"messages": [
|
|
{
|
|
"id": "msg-001",
|
|
"senderId": "1234567890",
|
|
"content": "Xin chào, tôi cần hỗ trợ",
|
|
"messageType": "Text",
|
|
"direction": "Incoming",
|
|
"sentAt": "2026-01-18T09:00:00Z"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Customers API
|
|
|
|
### Danh Sách Khách Hàng
|
|
|
|
Lấy danh sách khách hàng có phân trang.
|
|
|
|
```http
|
|
GET /api/v1/customers
|
|
```
|
|
|
|
**Query Parameters**:
|
|
| Parameter | Type | Required | Default | Mô Tả |
|
|
|-----------|------|----------|---------|-------|
|
|
| `shopId` | guid | Yes | - | Shop/Business ID |
|
|
| `tags` | string[] | No | - | Lọc theo tags |
|
|
| `search` | string | No | - | Tìm kiếm theo tên hoặc email |
|
|
| `skip` | int | No | 0 | Pagination offset |
|
|
| `take` | int | No | 20 | Page size |
|
|
|
|
---
|
|
|
|
## Chatbots API
|
|
|
|
### Danh Sách Automation Flows
|
|
|
|
Lấy tất cả automation flows của shop.
|
|
|
|
```http
|
|
GET /api/v1/chatbots/flows
|
|
```
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": [
|
|
{
|
|
"id": "flow-001",
|
|
"name": "Welcome Flow",
|
|
"shopId": "shop-123",
|
|
"triggerType": "GetStarted",
|
|
"isActive": true,
|
|
"nodeCount": 8
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Lấy AI Chatbot Config
|
|
|
|
Lấy cấu hình AI chatbot của shop.
|
|
|
|
```http
|
|
GET /api/v1/chatbots/ai-config?shopId={shopId}
|
|
```
|
|
|
|
**Response** (200 OK):
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"id": "ai-config-001",
|
|
"shopId": "shop-123",
|
|
"provider": "OpenAI",
|
|
"model": "gpt-4-turbo",
|
|
"systemPrompt": "Bạn là trợ lý AI...",
|
|
"temperature": 0.7,
|
|
"maxTokens": 500,
|
|
"isEnabled": true
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Phản Hồi Lỗi
|
|
|
|
### Format Lỗi Chuẩn
|
|
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Thông báo lỗi",
|
|
"errorCode": "ERROR_CODE",
|
|
"details": {
|
|
"field": "Lỗi cụ thể của field"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Mã Lỗi Thường Gặp
|
|
|
|
| Status Code | Error Code | Mô Tả |
|
|
|-------------|------------|-------|
|
|
| 400 | `INVALID_REQUEST` | Request parameters không hợp lệ |
|
|
| 401 | `UNAUTHORIZED` | Thiếu hoặc token không hợp lệ |
|
|
| 403 | `FORBIDDEN` | Không có quyền |
|
|
| 404 | `NOT_FOUND` | Không tìm thấy resource |
|
|
| 429 | `RATE_LIMIT_EXCEEDED` | Quá nhiều requests |
|
|
| 500 | `INTERNAL_ERROR` | Lỗi server |
|
|
|
|
---
|
|
|
|
## Giới Hạn Tỷ Lệ
|
|
|
|
Giới hạn API mỗi API key:
|
|
- **100 requests/phút** cho read operations (GET)
|
|
- **20 requests/phút** cho write operations (POST, PUT, DELETE)
|
|
|
|
---
|
|
|
|
## Tài Nguyên
|
|
|
|
- [Tài Liệu Kiến Trúc](./ARCHITECTURE.md)
|
|
- [Hướng Dẫn Setup Facebook](./FACEBOOK_SETUP.md)
|