@warriorteam/redai-zalo-sdk 1.1.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/LICENSE +21 -0
- package/README.md +448 -0
- package/dist/clients/base-client.d.ts +67 -0
- package/dist/clients/base-client.d.ts.map +1 -0
- package/dist/clients/base-client.js +297 -0
- package/dist/clients/base-client.js.map +1 -0
- package/dist/clients/zalo-client.d.ts +131 -0
- package/dist/clients/zalo-client.d.ts.map +1 -0
- package/dist/clients/zalo-client.js +215 -0
- package/dist/clients/zalo-client.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/services/article.service.d.ts +144 -0
- package/dist/services/article.service.d.ts.map +1 -0
- package/dist/services/article.service.js +518 -0
- package/dist/services/article.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +55 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +269 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/consultation.service.d.ts +73 -0
- package/dist/services/consultation.service.d.ts.map +1 -0
- package/dist/services/consultation.service.js +208 -0
- package/dist/services/consultation.service.js.map +1 -0
- package/dist/services/general-message.service.d.ts +85 -0
- package/dist/services/general-message.service.d.ts.map +1 -0
- package/dist/services/general-message.service.js +248 -0
- package/dist/services/general-message.service.js.map +1 -0
- package/dist/services/group-management.service.d.ts +220 -0
- package/dist/services/group-management.service.d.ts.map +1 -0
- package/dist/services/group-management.service.js +562 -0
- package/dist/services/group-management.service.js.map +1 -0
- package/dist/services/group-message.service.d.ts +102 -0
- package/dist/services/group-message.service.d.ts.map +1 -0
- package/dist/services/group-message.service.js +233 -0
- package/dist/services/group-message.service.js.map +1 -0
- package/dist/services/message-management.service.d.ts +135 -0
- package/dist/services/message-management.service.d.ts.map +1 -0
- package/dist/services/message-management.service.js +237 -0
- package/dist/services/message-management.service.js.map +1 -0
- package/dist/services/oa.service.d.ts +67 -0
- package/dist/services/oa.service.d.ts.map +1 -0
- package/dist/services/oa.service.js +223 -0
- package/dist/services/oa.service.js.map +1 -0
- package/dist/services/promotion.service.d.ts +114 -0
- package/dist/services/promotion.service.d.ts.map +1 -0
- package/dist/services/promotion.service.js +247 -0
- package/dist/services/promotion.service.js.map +1 -0
- package/dist/services/tag.service.d.ts +144 -0
- package/dist/services/tag.service.d.ts.map +1 -0
- package/dist/services/tag.service.js +184 -0
- package/dist/services/tag.service.js.map +1 -0
- package/dist/services/transaction.service.d.ts +110 -0
- package/dist/services/transaction.service.d.ts.map +1 -0
- package/dist/services/transaction.service.js +231 -0
- package/dist/services/transaction.service.js.map +1 -0
- package/dist/services/user-management.service.d.ts +117 -0
- package/dist/services/user-management.service.d.ts.map +1 -0
- package/dist/services/user-management.service.js +239 -0
- package/dist/services/user-management.service.js.map +1 -0
- package/dist/services/user.service.d.ts +84 -0
- package/dist/services/user.service.d.ts.map +1 -0
- package/dist/services/user.service.js +323 -0
- package/dist/services/user.service.js.map +1 -0
- package/dist/services/video-upload.service.d.ts +83 -0
- package/dist/services/video-upload.service.d.ts.map +1 -0
- package/dist/services/video-upload.service.js +267 -0
- package/dist/services/video-upload.service.js.map +1 -0
- package/dist/services/zns.service.d.ts +116 -0
- package/dist/services/zns.service.d.ts.map +1 -0
- package/dist/services/zns.service.js +234 -0
- package/dist/services/zns.service.js.map +1 -0
- package/dist/types/article.d.ts +352 -0
- package/dist/types/article.d.ts.map +1 -0
- package/dist/types/article.js +70 -0
- package/dist/types/article.js.map +1 -0
- package/dist/types/auth.d.ts +233 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +39 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/common.d.ts +237 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +42 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/group.d.ts +523 -0
- package/dist/types/group.d.ts.map +1 -0
- package/dist/types/group.js +6 -0
- package/dist/types/group.js.map +1 -0
- package/dist/types/message.d.ts +333 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +17 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/oa.d.ts +285 -0
- package/dist/types/oa.d.ts.map +1 -0
- package/dist/types/oa.js +25 -0
- package/dist/types/oa.js.map +1 -0
- package/dist/types/social.d.ts +427 -0
- package/dist/types/social.d.ts.map +1 -0
- package/dist/types/social.js +6 -0
- package/dist/types/social.js.map +1 -0
- package/dist/types/user-management.d.ts +280 -0
- package/dist/types/user-management.d.ts.map +1 -0
- package/dist/types/user-management.js +6 -0
- package/dist/types/user-management.js.map +1 -0
- package/dist/types/user.d.ts +365 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +17 -0
- package/dist/types/user.js.map +1 -0
- package/dist/types/webhook.d.ts +1972 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +419 -0
- package/dist/types/webhook.js.map +1 -0
- package/dist/types/zns.d.ts +277 -0
- package/dist/types/zns.d.ts.map +1 -0
- package/dist/types/zns.js +6 -0
- package/dist/types/zns.js.map +1 -0
- package/dist/zalo-sdk.d.ts +228 -0
- package/dist/zalo-sdk.d.ts.map +1 -0
- package/dist/zalo-sdk.js +307 -0
- package/dist/zalo-sdk.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ZaloClient } from "../clients/zalo-client";
|
|
2
|
+
import { SendMessageResponse, TransactionMessage, MessageRecipient } from "../types/message";
|
|
3
|
+
/**
|
|
4
|
+
* Service xử lý các API tin nhắn giao dịch của Zalo Official Account
|
|
5
|
+
*
|
|
6
|
+
* ĐIỀU KIỆN GỬI TIN GIAO DỊCH:
|
|
7
|
+
*
|
|
8
|
+
* 1. THỜI GIAN GỬI:
|
|
9
|
+
* - Chỉ được gửi trong vòng 24 giờ kể từ khi người dùng tương tác cuối cùng với OA
|
|
10
|
+
* - Tương tác bao gồm: gửi tin nhắn, nhấn button, gọi điện, truy cập website từ OA
|
|
11
|
+
*
|
|
12
|
+
* 2. NỘI DUNG TIN NHẮN:
|
|
13
|
+
* - Phải liên quan trực tiếp đến giao dịch thực tế
|
|
14
|
+
* - Bao gồm: xác nhận đơn hàng, thông báo thanh toán, cập nhật trạng thái giao hàng
|
|
15
|
+
* - Không được chứa nội dung quảng cáo, khuyến mãi
|
|
16
|
+
*
|
|
17
|
+
* 3. TẦN SUẤT GỬI:
|
|
18
|
+
* - Tối đa 3 tin nhắn giao dịch/ngày cho mỗi người dùng
|
|
19
|
+
* - Phải có khoảng cách ít nhất 1 giờ giữa các tin nhắn
|
|
20
|
+
*
|
|
21
|
+
* 4. ĐỊNH DẠNG:
|
|
22
|
+
* - Phải sử dụng template được Zalo phê duyệt trước
|
|
23
|
+
* - Template phải tuân thủ format chuẩn của tin giao dịch
|
|
24
|
+
*
|
|
25
|
+
* 5. NGƯỜI DÙNG:
|
|
26
|
+
* - Người dùng phải đã follow OA
|
|
27
|
+
* - Người dùng không được block OA
|
|
28
|
+
* - Người dùng phải có tương tác gần đây với OA
|
|
29
|
+
*
|
|
30
|
+
* 6. OFFICIAL ACCOUNT:
|
|
31
|
+
* - OA phải được xác minh (verified)
|
|
32
|
+
* - OA phải có quyền gửi tin giao dịch được Zalo cấp phép
|
|
33
|
+
* - OA không được vi phạm chính sách của Zalo
|
|
34
|
+
*
|
|
35
|
+
* LỖI THƯỜNG GẶP:
|
|
36
|
+
* - 1004: Người dùng chưa follow OA hoặc đã unfollow
|
|
37
|
+
* - 1005: Vượt quá thời gian 24 giờ từ lần tương tác cuối
|
|
38
|
+
* - 1006: Vượt quá giới hạn 3 tin/ngày
|
|
39
|
+
* - 1007: Template chưa được phê duyệt hoặc không hợp lệ
|
|
40
|
+
* - 1008: Nội dung tin nhắn vi phạm chính sách
|
|
41
|
+
*/
|
|
42
|
+
export declare class TransactionService {
|
|
43
|
+
private readonly client;
|
|
44
|
+
private readonly transactionApiUrl;
|
|
45
|
+
constructor(client: ZaloClient);
|
|
46
|
+
/**
|
|
47
|
+
* Gửi tin nhắn giao dịch
|
|
48
|
+
* @param accessToken Access token của Official Account
|
|
49
|
+
* @param recipient Thông tin người nhận
|
|
50
|
+
* @param message Nội dung tin nhắn giao dịch
|
|
51
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
52
|
+
*/
|
|
53
|
+
sendTransactionMessage(accessToken: string, recipient: MessageRecipient, message: TransactionMessage): Promise<SendMessageResponse>;
|
|
54
|
+
/**
|
|
55
|
+
* Gửi tin nhắn xác nhận đơn hàng
|
|
56
|
+
* @param accessToken Access token của Official Account
|
|
57
|
+
* @param recipient Thông tin người nhận
|
|
58
|
+
* @param orderInfo Thông tin đơn hàng
|
|
59
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
60
|
+
*/
|
|
61
|
+
sendOrderConfirmation(accessToken: string, recipient: MessageRecipient, orderInfo: {
|
|
62
|
+
orderId: string;
|
|
63
|
+
orderDate: string;
|
|
64
|
+
totalAmount: number;
|
|
65
|
+
items: Array<{
|
|
66
|
+
name: string;
|
|
67
|
+
quantity: number;
|
|
68
|
+
price: number;
|
|
69
|
+
}>;
|
|
70
|
+
customerInfo: {
|
|
71
|
+
name: string;
|
|
72
|
+
phone: string;
|
|
73
|
+
address: string;
|
|
74
|
+
};
|
|
75
|
+
}): Promise<SendMessageResponse>;
|
|
76
|
+
/**
|
|
77
|
+
* Gửi tin nhắn thông báo thanh toán
|
|
78
|
+
* @param accessToken Access token của Official Account
|
|
79
|
+
* @param recipient Thông tin người nhận
|
|
80
|
+
* @param paymentInfo Thông tin thanh toán
|
|
81
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
82
|
+
*/
|
|
83
|
+
sendPaymentNotification(accessToken: string, recipient: MessageRecipient, paymentInfo: {
|
|
84
|
+
orderId: string;
|
|
85
|
+
amount: number;
|
|
86
|
+
paymentMethod: string;
|
|
87
|
+
paymentDate: string;
|
|
88
|
+
status: "success" | "failed" | "pending";
|
|
89
|
+
}): Promise<SendMessageResponse>;
|
|
90
|
+
/**
|
|
91
|
+
* Gửi tin nhắn cập nhật trạng thái giao hàng
|
|
92
|
+
* @param accessToken Access token của Official Account
|
|
93
|
+
* @param recipient Thông tin người nhận
|
|
94
|
+
* @param shippingInfo Thông tin giao hàng
|
|
95
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
96
|
+
*/
|
|
97
|
+
sendShippingUpdate(accessToken: string, recipient: MessageRecipient, shippingInfo: {
|
|
98
|
+
orderId: string;
|
|
99
|
+
trackingNumber: string;
|
|
100
|
+
status: "preparing" | "shipped" | "in_transit" | "delivered";
|
|
101
|
+
estimatedDelivery?: string;
|
|
102
|
+
carrier?: string;
|
|
103
|
+
}): Promise<SendMessageResponse>;
|
|
104
|
+
/**
|
|
105
|
+
* Validate transaction message format
|
|
106
|
+
* @param message Transaction message to validate
|
|
107
|
+
*/
|
|
108
|
+
private validateTransactionMessage;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=transaction.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.service.d.ts","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAG1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CACsB;gBAE3B,MAAM,EAAE,UAAU;IAE/C;;;;;;OAMG;IACU,sBAAsB,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IAsC/B;;;;;;OAMG;IACU,qBAAqB,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;QACH,YAAY,EAAE;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,GACA,OAAO,CAAC,mBAAmB,CAAC;IAuC/B;;;;;;OAMG;IACU,uBAAuB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;KAC1C,GACA,OAAO,CAAC,mBAAmB,CAAC;IAiD/B;;;;;;OAMG;IACU,kBAAkB,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC;QAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,OAAO,CAAC,mBAAmB,CAAC;IAgD/B;;;OAGG;IACH,OAAO,CAAC,0BAA0B;CAmBnC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionService = void 0;
|
|
4
|
+
const common_1 = require("../types/common");
|
|
5
|
+
/**
|
|
6
|
+
* Service xử lý các API tin nhắn giao dịch của Zalo Official Account
|
|
7
|
+
*
|
|
8
|
+
* ĐIỀU KIỆN GỬI TIN GIAO DỊCH:
|
|
9
|
+
*
|
|
10
|
+
* 1. THỜI GIAN GỬI:
|
|
11
|
+
* - Chỉ được gửi trong vòng 24 giờ kể từ khi người dùng tương tác cuối cùng với OA
|
|
12
|
+
* - Tương tác bao gồm: gửi tin nhắn, nhấn button, gọi điện, truy cập website từ OA
|
|
13
|
+
*
|
|
14
|
+
* 2. NỘI DUNG TIN NHẮN:
|
|
15
|
+
* - Phải liên quan trực tiếp đến giao dịch thực tế
|
|
16
|
+
* - Bao gồm: xác nhận đơn hàng, thông báo thanh toán, cập nhật trạng thái giao hàng
|
|
17
|
+
* - Không được chứa nội dung quảng cáo, khuyến mãi
|
|
18
|
+
*
|
|
19
|
+
* 3. TẦN SUẤT GỬI:
|
|
20
|
+
* - Tối đa 3 tin nhắn giao dịch/ngày cho mỗi người dùng
|
|
21
|
+
* - Phải có khoảng cách ít nhất 1 giờ giữa các tin nhắn
|
|
22
|
+
*
|
|
23
|
+
* 4. ĐỊNH DẠNG:
|
|
24
|
+
* - Phải sử dụng template được Zalo phê duyệt trước
|
|
25
|
+
* - Template phải tuân thủ format chuẩn của tin giao dịch
|
|
26
|
+
*
|
|
27
|
+
* 5. NGƯỜI DÙNG:
|
|
28
|
+
* - Người dùng phải đã follow OA
|
|
29
|
+
* - Người dùng không được block OA
|
|
30
|
+
* - Người dùng phải có tương tác gần đây với OA
|
|
31
|
+
*
|
|
32
|
+
* 6. OFFICIAL ACCOUNT:
|
|
33
|
+
* - OA phải được xác minh (verified)
|
|
34
|
+
* - OA phải có quyền gửi tin giao dịch được Zalo cấp phép
|
|
35
|
+
* - OA không được vi phạm chính sách của Zalo
|
|
36
|
+
*
|
|
37
|
+
* LỖI THƯỜNG GẶP:
|
|
38
|
+
* - 1004: Người dùng chưa follow OA hoặc đã unfollow
|
|
39
|
+
* - 1005: Vượt quá thời gian 24 giờ từ lần tương tác cuối
|
|
40
|
+
* - 1006: Vượt quá giới hạn 3 tin/ngày
|
|
41
|
+
* - 1007: Template chưa được phê duyệt hoặc không hợp lệ
|
|
42
|
+
* - 1008: Nội dung tin nhắn vi phạm chính sách
|
|
43
|
+
*/
|
|
44
|
+
class TransactionService {
|
|
45
|
+
constructor(client) {
|
|
46
|
+
this.client = client;
|
|
47
|
+
this.transactionApiUrl = "https://openapi.zalo.me/v2.0/oa/message/transaction";
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Gửi tin nhắn giao dịch
|
|
51
|
+
* @param accessToken Access token của Official Account
|
|
52
|
+
* @param recipient Thông tin người nhận
|
|
53
|
+
* @param message Nội dung tin nhắn giao dịch
|
|
54
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
55
|
+
*/
|
|
56
|
+
async sendTransactionMessage(accessToken, recipient, message) {
|
|
57
|
+
try {
|
|
58
|
+
// Validate transaction message
|
|
59
|
+
this.validateTransactionMessage(message);
|
|
60
|
+
const request = {
|
|
61
|
+
recipient,
|
|
62
|
+
message,
|
|
63
|
+
};
|
|
64
|
+
const result = await this.client.apiPost(this.transactionApiUrl, accessToken, request);
|
|
65
|
+
if (result.error !== 0) {
|
|
66
|
+
throw new common_1.ZaloSDKError(result.message || "Failed to send transaction message", result.error, result);
|
|
67
|
+
}
|
|
68
|
+
if (!result.data) {
|
|
69
|
+
throw new common_1.ZaloSDKError("No response data received", -1);
|
|
70
|
+
}
|
|
71
|
+
return result.data;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error instanceof common_1.ZaloSDKError) {
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
throw new common_1.ZaloSDKError(`Failed to send transaction message: ${error.message}`, -1, error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Gửi tin nhắn xác nhận đơn hàng
|
|
82
|
+
* @param accessToken Access token của Official Account
|
|
83
|
+
* @param recipient Thông tin người nhận
|
|
84
|
+
* @param orderInfo Thông tin đơn hàng
|
|
85
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
86
|
+
*/
|
|
87
|
+
async sendOrderConfirmation(accessToken, recipient, orderInfo) {
|
|
88
|
+
try {
|
|
89
|
+
const message = {
|
|
90
|
+
type: "transaction",
|
|
91
|
+
attachment: {
|
|
92
|
+
type: "template",
|
|
93
|
+
payload: {
|
|
94
|
+
template_type: "transaction",
|
|
95
|
+
elements: [
|
|
96
|
+
{
|
|
97
|
+
title: `Xác nhận đơn hàng #${orderInfo.orderId}`,
|
|
98
|
+
subtitle: `Ngày đặt: ${orderInfo.orderDate}`,
|
|
99
|
+
default_action: {
|
|
100
|
+
type: "web_url",
|
|
101
|
+
url: `https://example.com/orders/${orderInfo.orderId}`,
|
|
102
|
+
},
|
|
103
|
+
buttons: [
|
|
104
|
+
{
|
|
105
|
+
type: "web_url",
|
|
106
|
+
title: "Xem chi tiết",
|
|
107
|
+
url: `https://example.com/orders/${orderInfo.orderId}`,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
return this.sendTransactionMessage(accessToken, recipient, message);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
throw new common_1.ZaloSDKError(`Failed to send order confirmation: ${error.message}`, -1, error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Gửi tin nhắn thông báo thanh toán
|
|
123
|
+
* @param accessToken Access token của Official Account
|
|
124
|
+
* @param recipient Thông tin người nhận
|
|
125
|
+
* @param paymentInfo Thông tin thanh toán
|
|
126
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
127
|
+
*/
|
|
128
|
+
async sendPaymentNotification(accessToken, recipient, paymentInfo) {
|
|
129
|
+
try {
|
|
130
|
+
const statusText = {
|
|
131
|
+
success: "Thành công",
|
|
132
|
+
failed: "Thất bại",
|
|
133
|
+
pending: "Đang xử lý",
|
|
134
|
+
};
|
|
135
|
+
const message = {
|
|
136
|
+
type: "transaction",
|
|
137
|
+
attachment: {
|
|
138
|
+
type: "template",
|
|
139
|
+
payload: {
|
|
140
|
+
template_type: "transaction",
|
|
141
|
+
elements: [
|
|
142
|
+
{
|
|
143
|
+
title: `Thông báo thanh toán - ${statusText[paymentInfo.status]}`,
|
|
144
|
+
subtitle: `Đơn hàng #${paymentInfo.orderId} - ${paymentInfo.amount.toLocaleString("vi-VN")} VNĐ`,
|
|
145
|
+
default_action: {
|
|
146
|
+
type: "web_url",
|
|
147
|
+
url: `https://example.com/payments/${paymentInfo.orderId}`,
|
|
148
|
+
},
|
|
149
|
+
buttons: [
|
|
150
|
+
{
|
|
151
|
+
type: "web_url",
|
|
152
|
+
title: "Xem chi tiết",
|
|
153
|
+
url: `https://example.com/payments/${paymentInfo.orderId}`,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
return this.sendTransactionMessage(accessToken, recipient, message);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
throw new common_1.ZaloSDKError(`Failed to send payment notification: ${error.message}`, -1, error);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Gửi tin nhắn cập nhật trạng thái giao hàng
|
|
169
|
+
* @param accessToken Access token của Official Account
|
|
170
|
+
* @param recipient Thông tin người nhận
|
|
171
|
+
* @param shippingInfo Thông tin giao hàng
|
|
172
|
+
* @returns Thông tin tin nhắn đã gửi
|
|
173
|
+
*/
|
|
174
|
+
async sendShippingUpdate(accessToken, recipient, shippingInfo) {
|
|
175
|
+
try {
|
|
176
|
+
const statusText = {
|
|
177
|
+
preparing: "Đang chuẩn bị hàng",
|
|
178
|
+
shipped: "Đã giao cho đơn vị vận chuyển",
|
|
179
|
+
in_transit: "Đang vận chuyển",
|
|
180
|
+
delivered: "Đã giao hàng thành công",
|
|
181
|
+
};
|
|
182
|
+
const message = {
|
|
183
|
+
type: "transaction",
|
|
184
|
+
attachment: {
|
|
185
|
+
type: "template",
|
|
186
|
+
payload: {
|
|
187
|
+
template_type: "transaction",
|
|
188
|
+
elements: [
|
|
189
|
+
{
|
|
190
|
+
title: `Cập nhật giao hàng - ${statusText[shippingInfo.status]}`,
|
|
191
|
+
subtitle: `Đơn hàng #${shippingInfo.orderId} - Mã vận đơn: ${shippingInfo.trackingNumber}`,
|
|
192
|
+
default_action: {
|
|
193
|
+
type: "web_url",
|
|
194
|
+
url: `https://example.com/tracking/${shippingInfo.trackingNumber}`,
|
|
195
|
+
},
|
|
196
|
+
buttons: [
|
|
197
|
+
{
|
|
198
|
+
type: "web_url",
|
|
199
|
+
title: "Theo dõi đơn hàng",
|
|
200
|
+
url: `https://example.com/tracking/${shippingInfo.trackingNumber}`,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
return this.sendTransactionMessage(accessToken, recipient, message);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
throw new common_1.ZaloSDKError(`Failed to send shipping update: ${error.message}`, -1, error);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Validate transaction message format
|
|
216
|
+
* @param message Transaction message to validate
|
|
217
|
+
*/
|
|
218
|
+
validateTransactionMessage(message) {
|
|
219
|
+
if (!message.attachment) {
|
|
220
|
+
throw new common_1.ZaloSDKError("Transaction message must have attachment", -1);
|
|
221
|
+
}
|
|
222
|
+
if (!message.attachment.payload) {
|
|
223
|
+
throw new common_1.ZaloSDKError("Transaction message attachment must have payload", -1);
|
|
224
|
+
}
|
|
225
|
+
if (message.attachment.payload.template_type !== "transaction") {
|
|
226
|
+
throw new common_1.ZaloSDKError("Transaction message must use transaction template type", -1);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
exports.TransactionService = TransactionService;
|
|
231
|
+
//# sourceMappingURL=transaction.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.service.js","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { ZaloClient } from "../clients/zalo-client";
|
|
2
|
+
import { UserProfile, UserList, UserTag, UserTagList, UserNote, UserInteraction } from "../types/user-management";
|
|
3
|
+
/**
|
|
4
|
+
* Service for managing Zalo OA users
|
|
5
|
+
* Provides comprehensive user management capabilities including:
|
|
6
|
+
* - User profile management
|
|
7
|
+
* - User tagging and segmentation
|
|
8
|
+
* - User notes and interactions
|
|
9
|
+
* - User analytics and insights
|
|
10
|
+
*/
|
|
11
|
+
export declare class UserManagementService {
|
|
12
|
+
private readonly client;
|
|
13
|
+
private readonly apiUrl;
|
|
14
|
+
constructor(client: ZaloClient);
|
|
15
|
+
/**
|
|
16
|
+
* Get user profile information
|
|
17
|
+
* @param accessToken OA access token
|
|
18
|
+
* @param userId User ID
|
|
19
|
+
* @returns User profile
|
|
20
|
+
*/
|
|
21
|
+
getUserProfile(accessToken: string, userId: string): Promise<UserProfile>;
|
|
22
|
+
/**
|
|
23
|
+
* Get list of users who follow the OA
|
|
24
|
+
* @param accessToken OA access token
|
|
25
|
+
* @param offset Offset for pagination
|
|
26
|
+
* @param count Number of users to retrieve
|
|
27
|
+
* @returns User list
|
|
28
|
+
*/
|
|
29
|
+
getFollowersList(accessToken: string, offset?: number, count?: number): Promise<UserList>;
|
|
30
|
+
/**
|
|
31
|
+
* Search users by phone number
|
|
32
|
+
* @param accessToken OA access token
|
|
33
|
+
* @param phoneNumber Phone number to search
|
|
34
|
+
* @returns User profile if found
|
|
35
|
+
*/
|
|
36
|
+
searchUserByPhone(accessToken: string, phoneNumber: string): Promise<UserProfile | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Get user tags
|
|
39
|
+
* @param accessToken OA access token
|
|
40
|
+
* @param userId User ID
|
|
41
|
+
* @returns User tags
|
|
42
|
+
*/
|
|
43
|
+
getUserTags(accessToken: string, userId: string): Promise<UserTag[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Tag user with specific tags
|
|
46
|
+
* @param accessToken OA access token
|
|
47
|
+
* @param userId User ID
|
|
48
|
+
* @param tagNames Array of tag names
|
|
49
|
+
* @returns Tag result
|
|
50
|
+
*/
|
|
51
|
+
tagUser(accessToken: string, userId: string, tagNames: string[]): Promise<{
|
|
52
|
+
success: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Remove tags from user
|
|
56
|
+
* @param accessToken OA access token
|
|
57
|
+
* @param userId User ID
|
|
58
|
+
* @param tagNames Array of tag names to remove
|
|
59
|
+
* @returns Untag result
|
|
60
|
+
*/
|
|
61
|
+
untagUser(accessToken: string, userId: string, tagNames: string[]): Promise<{
|
|
62
|
+
success: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Get all available tags
|
|
66
|
+
* @param accessToken OA access token
|
|
67
|
+
* @returns List of all tags
|
|
68
|
+
*/
|
|
69
|
+
getAllTags(accessToken: string): Promise<UserTagList>;
|
|
70
|
+
/**
|
|
71
|
+
* Create new tag
|
|
72
|
+
* @param accessToken OA access token
|
|
73
|
+
* @param tagName Tag name
|
|
74
|
+
* @returns Created tag
|
|
75
|
+
*/
|
|
76
|
+
createTag(accessToken: string, tagName: string): Promise<UserTag>;
|
|
77
|
+
/**
|
|
78
|
+
* Delete tag
|
|
79
|
+
* @param accessToken OA access token
|
|
80
|
+
* @param tagName Tag name to delete
|
|
81
|
+
* @returns Deletion result
|
|
82
|
+
*/
|
|
83
|
+
deleteTag(accessToken: string, tagName: string): Promise<{
|
|
84
|
+
success: boolean;
|
|
85
|
+
}>;
|
|
86
|
+
/**
|
|
87
|
+
* Add note to user
|
|
88
|
+
* @param accessToken OA access token
|
|
89
|
+
* @param userId User ID
|
|
90
|
+
* @param note Note content
|
|
91
|
+
* @returns Note result
|
|
92
|
+
*/
|
|
93
|
+
addUserNote(accessToken: string, userId: string, note: string): Promise<{
|
|
94
|
+
success: boolean;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Get user notes
|
|
98
|
+
* @param accessToken OA access token
|
|
99
|
+
* @param userId User ID
|
|
100
|
+
* @returns User notes
|
|
101
|
+
*/
|
|
102
|
+
getUserNotes(accessToken: string, userId: string): Promise<UserNote[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Get user interaction history
|
|
105
|
+
* @param accessToken OA access token
|
|
106
|
+
* @param userId User ID
|
|
107
|
+
* @param offset Offset for pagination
|
|
108
|
+
* @param count Number of interactions to retrieve
|
|
109
|
+
* @returns User interactions
|
|
110
|
+
*/
|
|
111
|
+
getUserInteractions(accessToken: string, userId: string, offset?: number, count?: number): Promise<{
|
|
112
|
+
data: UserInteraction[];
|
|
113
|
+
total: number;
|
|
114
|
+
}>;
|
|
115
|
+
private handleUserManagementError;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=user-management.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-management.service.d.ts","sourceRoot":"","sources":["../../src/services/user-management.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,QAAQ,EACR,OAAO,EACP,WAAW,EACX,QAAQ,EACR,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAE/B,MAAM,EAAE,UAAU;IAE/C;;;;;OAKG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IAgBvB;;;;;;OAMG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAU,EAClB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,QAAQ,CAAC;IAiBpB;;;;;OAKG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAgB9B;;;;;OAKG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAgB1E;;;;;;OAMG;IACG,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAiBhC;;;;;;OAMG;IACG,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAiBhC;;;;OAIG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAa3D;;;;;OAKG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvE;;;;;OAKG;IACG,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAgBhC;;;;;;OAMG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAiBhC;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgB5E;;;;;;;OAOG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAU,EAClB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC;QAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBtD,OAAO,CAAC,yBAAyB;CAWlC"}
|