@warriorteam/redai-zalo-sdk 1.22.0 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +128 -0
- package/dist/services/promotion.service.d.ts +34 -7
- package/dist/services/promotion.service.d.ts.map +1 -1
- package/dist/services/promotion.service.js +219 -6
- package/dist/services/promotion.service.js.map +1 -1
- package/dist/types/message.d.ts +101 -4
- package/dist/types/message.d.ts.map +1 -1
- package/docs/BUTTON_TYPES_GUIDE.md +283 -0
- package/docs/MULTIPLE_USERS_PROMOTION.md +210 -0
- package/docs/PROMOTION_API_V3_MIGRATION.md +121 -3
- package/examples/promotion-examples.ts +164 -7
- package/package.json +20 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# Button Types Guide - Zalo Promotion API v3.0
|
|
2
|
+
|
|
3
|
+
## Tổng quan
|
|
4
|
+
|
|
5
|
+
Zalo Promotion API v3.0 hỗ trợ 5 loại button với payload format khác nhau. Mỗi button type có cấu trúc payload riêng biệt và giới hạn cụ thể.
|
|
6
|
+
|
|
7
|
+
## Button Types được hỗ trợ
|
|
8
|
+
|
|
9
|
+
### 1. **Open URL Button** (`oa.open.url`)
|
|
10
|
+
|
|
11
|
+
Mở URL trong ứng dụng Zalo khi người dùng bấm vào.
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
interface OpenUrlButton {
|
|
15
|
+
title: string; // Max 100 characters
|
|
16
|
+
image_icon?: string;
|
|
17
|
+
type: "oa.open.url";
|
|
18
|
+
payload: {
|
|
19
|
+
url: string; // URL to open
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Example:**
|
|
25
|
+
```typescript
|
|
26
|
+
{
|
|
27
|
+
title: "Mua ngay",
|
|
28
|
+
type: "oa.open.url",
|
|
29
|
+
payload: {
|
|
30
|
+
url: "https://shop.example.com/product/123"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. **Query Show Button** (`oa.query.show`)
|
|
36
|
+
|
|
37
|
+
Gửi tin nhắn từ user đến OA, tin nhắn **hiển thị** trên chat.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
interface QueryShowButton {
|
|
41
|
+
title: string; // Max 100 characters
|
|
42
|
+
image_icon?: string;
|
|
43
|
+
type: "oa.query.show";
|
|
44
|
+
payload: string; // Max 1000 characters
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Example:**
|
|
49
|
+
```typescript
|
|
50
|
+
{
|
|
51
|
+
title: "Xem thêm sản phẩm",
|
|
52
|
+
type: "oa.query.show",
|
|
53
|
+
payload: "#xem_san_pham"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3. **Query Hide Button** (`oa.query.hide`)
|
|
58
|
+
|
|
59
|
+
Gửi tin nhắn từ user đến OA, tin nhắn **ẩn** trên chat.
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
interface QueryHideButton {
|
|
63
|
+
title: string; // Max 100 characters
|
|
64
|
+
image_icon?: string;
|
|
65
|
+
type: "oa.query.hide";
|
|
66
|
+
payload: string; // Max 1000 characters
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Example:**
|
|
71
|
+
```typescript
|
|
72
|
+
{
|
|
73
|
+
title: "Liên hệ tư vấn",
|
|
74
|
+
type: "oa.query.hide",
|
|
75
|
+
payload: "#tu_van"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 4. **Open SMS Button** (`oa.open.sms`)
|
|
80
|
+
|
|
81
|
+
Mở ứng dụng SMS với nội dung và số điện thoại có sẵn.
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
interface OpenSmsButton {
|
|
85
|
+
title: string; // Max 100 characters
|
|
86
|
+
image_icon?: string;
|
|
87
|
+
type: "oa.open.sms";
|
|
88
|
+
payload: {
|
|
89
|
+
content: string; // Max 160 characters
|
|
90
|
+
phone_code: string; // Phone number
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Example:**
|
|
96
|
+
```typescript
|
|
97
|
+
{
|
|
98
|
+
title: "Gửi SMS",
|
|
99
|
+
type: "oa.open.sms",
|
|
100
|
+
payload: {
|
|
101
|
+
content: "Tôi muốn tư vấn về sản phẩm",
|
|
102
|
+
phone_code: "84919018791"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 5. **Open Phone Button** (`oa.open.phone`)
|
|
108
|
+
|
|
109
|
+
Mở ứng dụng gọi điện với số điện thoại có sẵn.
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
interface OpenPhoneButton {
|
|
113
|
+
title: string; // Max 100 characters
|
|
114
|
+
image_icon?: string;
|
|
115
|
+
type: "oa.open.phone";
|
|
116
|
+
payload: {
|
|
117
|
+
phone_code: string; // Phone number
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Example:**
|
|
123
|
+
```typescript
|
|
124
|
+
{
|
|
125
|
+
title: "Gọi ngay",
|
|
126
|
+
type: "oa.open.phone",
|
|
127
|
+
payload: {
|
|
128
|
+
phone_code: "84919018791"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Union Type cho TypeScript
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
type PromotionButton =
|
|
137
|
+
| OpenUrlButton
|
|
138
|
+
| QueryShowButton
|
|
139
|
+
| QueryHideButton
|
|
140
|
+
| OpenSmsButton
|
|
141
|
+
| OpenPhoneButton;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Flexible Input Interface
|
|
145
|
+
|
|
146
|
+
Để dễ sử dụng, SDK cung cấp interface linh hoạt:
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
interface PromotionButtonInput {
|
|
150
|
+
title: string; // Max 100 characters
|
|
151
|
+
imageIcon?: string; // camelCase style
|
|
152
|
+
type: "oa.open.url" | "oa.query.show" | "oa.query.hide" | "oa.open.sms" | "oa.open.phone";
|
|
153
|
+
payload: any; // Flexible payload, will be converted internally
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Cách sử dụng trong SDK
|
|
158
|
+
|
|
159
|
+
### Basic Usage
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const buttons: PromotionButtonInput[] = [
|
|
163
|
+
{
|
|
164
|
+
title: "Mua ngay",
|
|
165
|
+
type: "oa.open.url",
|
|
166
|
+
payload: { url: "https://shop.example.com" }
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
title: "Tư vấn",
|
|
170
|
+
type: "oa.query.hide",
|
|
171
|
+
payload: "#tu_van"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
title: "Gọi hotline",
|
|
175
|
+
type: "oa.open.phone",
|
|
176
|
+
payload: { phone_code: "1900123456" }
|
|
177
|
+
}
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
await promotionService.sendCustomPromotion(
|
|
181
|
+
accessToken,
|
|
182
|
+
{ user_id: "user_id" },
|
|
183
|
+
{
|
|
184
|
+
// ... other promotion data
|
|
185
|
+
buttons
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### All Button Types Example
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
const allButtonTypes: PromotionButtonInput[] = [
|
|
194
|
+
// Open URL
|
|
195
|
+
{
|
|
196
|
+
title: "Mở website",
|
|
197
|
+
type: "oa.open.url",
|
|
198
|
+
payload: { url: "https://example.com" }
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
// Query Show (visible message)
|
|
202
|
+
{
|
|
203
|
+
title: "Xem menu",
|
|
204
|
+
type: "oa.query.show",
|
|
205
|
+
payload: "#menu"
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
// Query Hide (hidden message)
|
|
209
|
+
{
|
|
210
|
+
title: "Liên hệ support",
|
|
211
|
+
type: "oa.query.hide",
|
|
212
|
+
payload: "#support"
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
// Open SMS
|
|
216
|
+
{
|
|
217
|
+
title: "Gửi SMS",
|
|
218
|
+
type: "oa.open.sms",
|
|
219
|
+
payload: {
|
|
220
|
+
content: "Tôi cần hỗ trợ",
|
|
221
|
+
phone_code: "84919018791"
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
// Open Phone
|
|
226
|
+
{
|
|
227
|
+
title: "Gọi điện",
|
|
228
|
+
type: "oa.open.phone",
|
|
229
|
+
payload: { phone_code: "84919018791" }
|
|
230
|
+
}
|
|
231
|
+
];
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Giới hạn và Lưu ý
|
|
235
|
+
|
|
236
|
+
### Giới hạn chung
|
|
237
|
+
- **Tối đa 4 buttons** per message
|
|
238
|
+
- **Title**: Tối đa 100 ký tự
|
|
239
|
+
- **Image icon**: URL, attachment_id, hoặc "default"
|
|
240
|
+
|
|
241
|
+
### Giới hạn theo type
|
|
242
|
+
- **Query payload**: Tối đa 1000 ký tự
|
|
243
|
+
- **SMS content**: Tối đa 160 ký tự
|
|
244
|
+
- **Phone code**: Format quốc tế (VD: 84919018791)
|
|
245
|
+
|
|
246
|
+
### Best Practices
|
|
247
|
+
|
|
248
|
+
1. **Button Order**: Đặt button quan trọng nhất đầu tiên
|
|
249
|
+
2. **Title Length**: Giữ title ngắn gọn, dễ hiểu
|
|
250
|
+
3. **Query Payload**: Sử dụng prefix # để dễ phân biệt
|
|
251
|
+
4. **Phone Format**: Luôn sử dụng mã quốc gia
|
|
252
|
+
5. **URL Validation**: Đảm bảo URL hợp lệ và accessible
|
|
253
|
+
|
|
254
|
+
### Error Handling
|
|
255
|
+
|
|
256
|
+
SDK tự động convert và validate button format. Các lỗi thường gặp:
|
|
257
|
+
|
|
258
|
+
- **Invalid type**: Type không được hỗ trợ
|
|
259
|
+
- **Missing payload**: Payload bị thiếu hoặc sai format
|
|
260
|
+
- **Length exceeded**: Title hoặc payload vượt quá giới hạn
|
|
261
|
+
- **Invalid URL**: URL không hợp lệ cho oa.open.url
|
|
262
|
+
|
|
263
|
+
## Migration từ Generic Button
|
|
264
|
+
|
|
265
|
+
Nếu bạn đang sử dụng generic button format:
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// Cũ (vẫn hoạt động)
|
|
269
|
+
{
|
|
270
|
+
title: "Button",
|
|
271
|
+
type: "oa.open.url",
|
|
272
|
+
payload: { url: "https://example.com" }
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Mới (recommended)
|
|
276
|
+
{
|
|
277
|
+
title: "Button",
|
|
278
|
+
type: "oa.open.url" as const, // Type assertion for better typing
|
|
279
|
+
payload: { url: "https://example.com" }
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
SDK sẽ tự động convert và validate tất cả button formats để đảm bảo tương thích với Zalo API v3.0.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Multiple Users Promotion - Gửi Promotion đến nhiều Users với Tracking
|
|
2
|
+
|
|
3
|
+
## Tổng quan
|
|
4
|
+
|
|
5
|
+
Method `sendCustomPromotionToMultipleUsers()` cho phép gửi promotion message đến nhiều user IDs cùng lúc với tính năng tracking real-time và error handling nâng cao.
|
|
6
|
+
|
|
7
|
+
## Tính năng chính
|
|
8
|
+
|
|
9
|
+
### 🚀 **Dual Sending Modes**
|
|
10
|
+
- **Sequential**: Gửi tuần tự với delay tùy chỉnh để tránh rate limit
|
|
11
|
+
- **Parallel**: Gửi song song để tối ưu tốc độ
|
|
12
|
+
|
|
13
|
+
### 📊 **Real-time Tracking**
|
|
14
|
+
- Progress callback theo thời gian thực
|
|
15
|
+
- Estimated time remaining
|
|
16
|
+
- Success/failure statistics
|
|
17
|
+
- Current user being processed
|
|
18
|
+
|
|
19
|
+
### 🛡️ **Error Handling**
|
|
20
|
+
- Error isolation - lỗi của 1 user không ảnh hưởng các user khác
|
|
21
|
+
- Continue on error option
|
|
22
|
+
- Detailed error information cho từng user
|
|
23
|
+
- Success rate calculation
|
|
24
|
+
|
|
25
|
+
### 📈 **Performance Metrics**
|
|
26
|
+
- Execution time tracking
|
|
27
|
+
- Success rate percentage
|
|
28
|
+
- Detailed results cho từng user
|
|
29
|
+
- Start/end timestamps
|
|
30
|
+
|
|
31
|
+
## Cách sử dụng
|
|
32
|
+
|
|
33
|
+
### Basic Usage
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { PromotionService } from './services/promotion.service';
|
|
37
|
+
|
|
38
|
+
const promotionService = new PromotionService(zaloClient);
|
|
39
|
+
|
|
40
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
41
|
+
accessToken,
|
|
42
|
+
["user1", "user2", "user3"],
|
|
43
|
+
{
|
|
44
|
+
attachmentId: "your_attachment_id",
|
|
45
|
+
headerContent: "🎉 Khuyến mãi đặc biệt!",
|
|
46
|
+
textContent: "Ưu đãi độc quyền dành riêng cho bạn",
|
|
47
|
+
tableData: [
|
|
48
|
+
{ key: "Mã giảm giá", value: "SAVE50" },
|
|
49
|
+
{ key: "Giảm giá", value: "50%" }
|
|
50
|
+
],
|
|
51
|
+
buttons: [
|
|
52
|
+
{
|
|
53
|
+
title: "Mua ngay",
|
|
54
|
+
type: "oa.open.url",
|
|
55
|
+
payload: { url: "https://shop.example.com" }
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
console.log(`Sent to ${result.successful}/${result.total} users`);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Advanced Usage với Tracking
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
68
|
+
accessToken,
|
|
69
|
+
userIds,
|
|
70
|
+
promotionData,
|
|
71
|
+
{
|
|
72
|
+
mode: "sequential",
|
|
73
|
+
delayMs: 2000,
|
|
74
|
+
continueOnError: true,
|
|
75
|
+
|
|
76
|
+
// Real-time progress tracking
|
|
77
|
+
onProgress: (progress) => {
|
|
78
|
+
const percent = Math.round((progress.completed / progress.total) * 100);
|
|
79
|
+
console.log(`📊 Progress: ${percent}% (${progress.completed}/${progress.total})`);
|
|
80
|
+
console.log(`✅ Success: ${progress.successful} | ❌ Failed: ${progress.failed}`);
|
|
81
|
+
|
|
82
|
+
if (progress.currentUserId) {
|
|
83
|
+
console.log(`🔄 Processing: ${progress.currentUserId}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (progress.estimatedTimeRemaining) {
|
|
87
|
+
const eta = Math.round(progress.estimatedTimeRemaining / 1000);
|
|
88
|
+
console.log(`⏱️ ETA: ~${eta}s`);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
// Callback cho từng user
|
|
93
|
+
onUserComplete: (userResult) => {
|
|
94
|
+
if (userResult.success) {
|
|
95
|
+
console.log(`✅ ${userResult.userId}: ${userResult.result?.message_id}`);
|
|
96
|
+
} else {
|
|
97
|
+
console.log(`❌ ${userResult.userId}: ${userResult.error?.message}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Parallel Mode
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
108
|
+
accessToken,
|
|
109
|
+
userIds,
|
|
110
|
+
promotionData,
|
|
111
|
+
{
|
|
112
|
+
mode: "parallel", // Gửi tất cả cùng lúc
|
|
113
|
+
continueOnError: true,
|
|
114
|
+
onProgress: (progress) => {
|
|
115
|
+
console.log(`⚡ Parallel: ${progress.completed}/${progress.total}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
console.log(`⚡ Completed in ${result.executionTime}ms`);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Options Parameters
|
|
124
|
+
|
|
125
|
+
### SendingOptions
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
interface SendingOptions {
|
|
129
|
+
mode?: "sequential" | "parallel"; // Chế độ gửi (default: "sequential")
|
|
130
|
+
delayMs?: number; // Delay giữa tin nhắn (default: 1000ms)
|
|
131
|
+
continueOnError?: boolean; // Tiếp tục khi có lỗi (default: true)
|
|
132
|
+
onProgress?: (progress: MultiplePromotionProgress) => void;
|
|
133
|
+
onUserComplete?: (result: PromotionUserResult) => void;
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Progress Tracking Interface
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
interface MultiplePromotionProgress {
|
|
141
|
+
total: number; // Tổng số users
|
|
142
|
+
completed: number; // Số users đã xử lý
|
|
143
|
+
successful: number; // Số users gửi thành công
|
|
144
|
+
failed: number; // Số users gửi thất bại
|
|
145
|
+
currentUserId: string | null; // User ID đang xử lý (sequential mode)
|
|
146
|
+
startTime: number; // Timestamp bắt đầu
|
|
147
|
+
estimatedTimeRemaining: number | null; // Thời gian còn lại (ms)
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Result Interface
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
interface MultiplePromotionResult {
|
|
155
|
+
total: number; // Tổng số users
|
|
156
|
+
successful: number; // Số users thành công
|
|
157
|
+
failed: number; // Số users thất bại
|
|
158
|
+
results: PromotionUserResult[]; // Chi tiết kết quả từng user
|
|
159
|
+
executionTime: number; // Thời gian thực hiện (ms)
|
|
160
|
+
mode: "sequential" | "parallel"; // Chế độ đã sử dụng
|
|
161
|
+
startTime: Date; // Thời gian bắt đầu
|
|
162
|
+
endTime: Date; // Thời gian kết thúc
|
|
163
|
+
successRate: number; // Tỷ lệ thành công (%)
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Best Practices
|
|
168
|
+
|
|
169
|
+
### 1. **Chọn Mode phù hợp**
|
|
170
|
+
- **Sequential**: Cho campaigns lớn, tránh rate limit
|
|
171
|
+
- **Parallel**: Cho urgent notifications, tối ưu tốc độ
|
|
172
|
+
|
|
173
|
+
### 2. **Delay Configuration**
|
|
174
|
+
- Minimum 1000ms để tránh rate limit
|
|
175
|
+
- Tăng delay nếu gặp rate limit errors
|
|
176
|
+
- Test với số lượng nhỏ trước khi scale
|
|
177
|
+
|
|
178
|
+
### 3. **Error Handling**
|
|
179
|
+
- Luôn set `continueOnError: true` cho campaigns lớn
|
|
180
|
+
- Log chi tiết errors để debug
|
|
181
|
+
- Retry failed users nếu cần
|
|
182
|
+
|
|
183
|
+
### 4. **Performance Monitoring**
|
|
184
|
+
- Sử dụng `onProgress` để monitor real-time
|
|
185
|
+
- Track success rate và adjust strategy
|
|
186
|
+
- Monitor execution time cho optimization
|
|
187
|
+
|
|
188
|
+
## Error Codes
|
|
189
|
+
|
|
190
|
+
- **2001**: Ngoài khung giờ cho phép (8:00-22:00)
|
|
191
|
+
- **2002**: User đã từ chối nhận tin truyền thông
|
|
192
|
+
- **2003**: Vượt quá giới hạn 1 tin/ngày
|
|
193
|
+
- **2004**: Template chưa được phê duyệt
|
|
194
|
+
- **2005**: Nội dung vi phạm chính sách
|
|
195
|
+
- **2006**: OA chưa có quyền gửi tin truyền thông
|
|
196
|
+
|
|
197
|
+
## Examples
|
|
198
|
+
|
|
199
|
+
Xem file `examples/promotion-examples.ts` để có ví dụ chi tiết về:
|
|
200
|
+
- Sequential sending với progress tracking
|
|
201
|
+
- Parallel sending cho tốc độ
|
|
202
|
+
- Error handling và retry logic
|
|
203
|
+
- Performance monitoring và optimization
|
|
204
|
+
|
|
205
|
+
## Rate Limits
|
|
206
|
+
|
|
207
|
+
- **Sending Time**: 8:00 - 22:00 hàng ngày
|
|
208
|
+
- **Frequency**: Tối đa 1 tin truyền thông/ngày/user
|
|
209
|
+
- **Concurrent**: Khuyến nghị sequential mode cho campaigns lớn
|
|
210
|
+
- **Delay**: Minimum 1000ms giữa các tin nhắn
|
|
@@ -110,11 +110,38 @@ buttons: [{
|
|
|
110
110
|
|
|
111
111
|
**Payload format theo type:**
|
|
112
112
|
- `oa.open.url`: `{ url: "https://..." }`
|
|
113
|
-
- `oa.query.show`: `"#callback_data"` (string)
|
|
114
|
-
- `oa.query.hide`: `"#callback_data"` (string)
|
|
115
|
-
- `oa.open.sms`: `{ content: "text", phone_code: "84xxx" }`
|
|
113
|
+
- `oa.query.show`: `"#callback_data"` (string, max 1000 chars)
|
|
114
|
+
- `oa.query.hide`: `"#callback_data"` (string, max 1000 chars)
|
|
115
|
+
- `oa.open.sms`: `{ content: "text", phone_code: "84xxx" }` (content max 160 chars)
|
|
116
116
|
- `oa.open.phone`: `{ phone_code: "84xxx" }`
|
|
117
117
|
|
|
118
|
+
**TypeScript Support:**
|
|
119
|
+
```typescript
|
|
120
|
+
// Typed button interfaces
|
|
121
|
+
interface OpenUrlButton {
|
|
122
|
+
title: string; // Max 100 characters
|
|
123
|
+
type: "oa.open.url";
|
|
124
|
+
payload: { url: string };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
interface QueryHideButton {
|
|
128
|
+
title: string; // Max 100 characters
|
|
129
|
+
type: "oa.query.hide";
|
|
130
|
+
payload: string; // Max 1000 characters
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Union type for all buttons
|
|
134
|
+
type PromotionButton = OpenUrlButton | QueryShowButton | QueryHideButton | OpenSmsButton | OpenPhoneButton;
|
|
135
|
+
|
|
136
|
+
// Flexible input interface
|
|
137
|
+
interface PromotionButtonInput {
|
|
138
|
+
title: string;
|
|
139
|
+
imageIcon?: string;
|
|
140
|
+
type: "oa.open.url" | "oa.query.show" | "oa.query.hide" | "oa.open.sms" | "oa.open.phone";
|
|
141
|
+
payload: any; // SDK auto-converts to proper format
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
118
145
|
### 🌐 Hỗ trợ đa ngôn ngữ
|
|
119
146
|
|
|
120
147
|
Thêm thuộc tính `language` trong payload:
|
|
@@ -127,6 +154,29 @@ Thêm thuộc tính `language` trong payload:
|
|
|
127
154
|
}
|
|
128
155
|
```
|
|
129
156
|
|
|
157
|
+
### 🚀 Tính năng mới: Multiple Users với Tracking
|
|
158
|
+
|
|
159
|
+
#### Gửi đến nhiều users cùng lúc
|
|
160
|
+
- **Sequential Mode**: Gửi tuần tự với delay tùy chỉnh
|
|
161
|
+
- **Parallel Mode**: Gửi song song để tối ưu tốc độ
|
|
162
|
+
- **Real-time Tracking**: Callback progress theo thời gian thực
|
|
163
|
+
- **Error Isolation**: Lỗi của 1 user không ảnh hưởng các user khác
|
|
164
|
+
- **Statistics**: Thống kê chi tiết success rate và execution time
|
|
165
|
+
|
|
166
|
+
#### Callback Tracking
|
|
167
|
+
```typescript
|
|
168
|
+
{
|
|
169
|
+
onProgress: (progress) => {
|
|
170
|
+
// Real-time progress: completed/total, success/failed
|
|
171
|
+
// Estimated time remaining, current user ID
|
|
172
|
+
},
|
|
173
|
+
onUserComplete: (userResult) => {
|
|
174
|
+
// Callback cho từng user hoàn thành
|
|
175
|
+
// Success/failure status, message ID, error details
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
130
180
|
## 📝 Cách sử dụng mới
|
|
131
181
|
|
|
132
182
|
### 1. Gửi Promotion theo format chuẩn docs
|
|
@@ -197,6 +247,74 @@ await promotionService.sendEventNotification(
|
|
|
197
247
|
);
|
|
198
248
|
```
|
|
199
249
|
|
|
250
|
+
### 4. Gửi Promotion đến nhiều Users với Tracking
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// Gửi tuần tự với tracking
|
|
254
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
255
|
+
accessToken,
|
|
256
|
+
["user1", "user2", "user3", "user4"],
|
|
257
|
+
{
|
|
258
|
+
attachmentId: "your_attachment_id",
|
|
259
|
+
headerContent: "🎉 Khuyến mãi đặc biệt!",
|
|
260
|
+
textContent: "Ưu đãi độc quyền dành riêng cho bạn",
|
|
261
|
+
tableData: [
|
|
262
|
+
{ key: "Mã giảm giá", value: "SAVE50" },
|
|
263
|
+
{ key: "Giảm giá", value: "50%" }
|
|
264
|
+
],
|
|
265
|
+
buttons: [
|
|
266
|
+
{
|
|
267
|
+
title: "Mua ngay",
|
|
268
|
+
type: "oa.open.url",
|
|
269
|
+
payload: { url: "https://shop.example.com" }
|
|
270
|
+
}
|
|
271
|
+
]
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
mode: "sequential", // hoặc "parallel"
|
|
275
|
+
delayMs: 2000, // Delay 2s giữa các tin
|
|
276
|
+
continueOnError: true,
|
|
277
|
+
|
|
278
|
+
// Real-time progress tracking
|
|
279
|
+
onProgress: (progress) => {
|
|
280
|
+
console.log(`Progress: ${progress.completed}/${progress.total}`);
|
|
281
|
+
console.log(`Success: ${progress.successful}, Failed: ${progress.failed}`);
|
|
282
|
+
},
|
|
283
|
+
|
|
284
|
+
// Callback cho từng user
|
|
285
|
+
onUserComplete: (userResult) => {
|
|
286
|
+
if (userResult.success) {
|
|
287
|
+
console.log(`✅ Sent to ${userResult.userId}`);
|
|
288
|
+
} else {
|
|
289
|
+
console.log(`❌ Failed to ${userResult.userId}: ${userResult.error?.message}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
console.log(`📊 Final Result:`);
|
|
296
|
+
console.log(`Total: ${result.total}, Success: ${result.successful}, Failed: ${result.failed}`);
|
|
297
|
+
console.log(`Success Rate: ${result.successRate}%, Time: ${result.executionTime}ms`);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 5. Gửi Song Song (Parallel Mode)
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
// Gửi song song để tối ưu tốc độ
|
|
304
|
+
const result = await promotionService.sendCustomPromotionToMultipleUsers(
|
|
305
|
+
accessToken,
|
|
306
|
+
userIds,
|
|
307
|
+
promotionData,
|
|
308
|
+
{
|
|
309
|
+
mode: "parallel", // Gửi tất cả cùng lúc
|
|
310
|
+
continueOnError: true,
|
|
311
|
+
onProgress: (progress) => {
|
|
312
|
+
console.log(`⚡ Parallel: ${progress.completed}/${progress.total}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
);
|
|
316
|
+
```
|
|
317
|
+
|
|
200
318
|
## ⚠️ Breaking Changes
|
|
201
319
|
|
|
202
320
|
1. **URL API**: Phải cập nhật từ v2.0 lên v3.0
|