Thông báo
thong baoCài đặt thông báo cá nhân và quy tắc định tuyến của tổ chức, push token, Web Push, liên kết Zalo, hộp thư trong app và widget. cai dat thong bao ca nhan va quy tac dinh tuyen cua to chuc, push token, web push, lien ket zalo, hop thu trong app va widget.Cài đặt thông báo cá nhân và quy tắc định tuyến của tổ chức, push token, Web Push, liên kết Zalo, hộp thư trong app và widget.
Endpoint
Phần tiêu đề “Endpoint”| Method | Path | Tóm tắt | Quyền | Nhóm tốc độ | Tương tác |
|---|---|---|---|---|---|
GET | /v1/me/push-tokens | Danh sách thiết bị nhận push của tôi | notify.pref.self | read | Scalar |
POST | /v1/me/push-tokens | Đăng ký push token thiết bị | notify.pref.self | write | Scalar |
DELETE | /v1/me/push-tokens/{install_id} | Thu hồi push token thiết bị | notify.pref.self | write | Scalar |
GET | /v1/me/widget-summary | Tóm tắt dữ liệu cho Widget màn hình khoá / Home | notify.pref.self | read | Scalar |
GET | /v1/me/zalo-link | Trạng thái liên kết Zalo | notify.pref.self | read | Scalar |
POST | /v1/me/zalo:link | Liên kết tài khoản Zalo OA | notify.pref.self | write | Scalar |
POST | /v1/me/zalo:verify | Xác thực liên kết Zalo | notify.pref.self | write | Scalar |
GET | /v1/notification-prefs | Cài đặt thông báo của cá nhân | notify.pref.self | read | Scalar |
PUT | /v1/notification-prefs | Cập nhật cài đặt thông báo của cá nhân | notify.pref.self | write | Scalar |
GET | /v1/notification-rules | Quy tắc định tuyến thông báo của tổ chức | notify.org_rule.manage | read | Scalar |
PUT | /v1/notification-rules | Cập nhật quy tắc định tuyến thông báo của tổ chức | notify.org_rule.manage | write | Scalar |
GET | /v1/notifications | Hộp thư thông báo trong app | notify.pref.self | read | Scalar |
POST | /v1/notifications:mark-read | Đánh dấu đã đọc thông báo | notify.pref.self | write | Scalar |
POST | /v1/webpush/subscriptions | Đăng ký Web Push subscription | notify.pref.self | write | Scalar |
GET | /v1/webpush/vapid-key | Lấy VAPID public key cho Web Push | notify.pref.self | read | Scalar |
Chi tiết endpoint
Phần tiêu đề “Chi tiết endpoint”GET /v1/me/push-tokens
Phần tiêu đề “GET /v1/me/push-tokens”Danh sách thiết bị nhận push của tôi
Các cài đặt đang đăng ký push của chính người dùng (APNs, FCM, Web Push), chưa bị thu hồi. Token không bao giờ được trả lại: device_install_id là mã dùng cho DELETE /v1/me/push-tokens/{install_id}.
- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách push token của người dùng. —object,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/me/push-tokens" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/me/push-tokens");import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import list_push_tokens
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_push_tokens.sync(client=dt.client)POST /v1/me/push-tokens
Phần tiêu đề “POST /v1/me/push-tokens”Đăng ký push token thiết bị
Lưu token APNs, FCM hoặc WebPush cho tài khoản người dùng hiện tại (token được mã hoá trên server).
Quyền: notify.pref.self Idempotency-Key: tuỳ chọn- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json, bắt buộc) - Phản hồi thành công
200: Kết quả đăng ký token. —object,application/json - Mã lỗi riêng của endpoint:
conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X POST "https://api.dongtien.pro/v1/me/push-tokens" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "device_install_id": "7b1f3c52-9d4e-4a6b-8e21-5c0f9a3d7e44", "platform": "apns", "environment": "production", "token": "fcm:APA91bHun4MxP5kXz0sT3yQeLrVn8wAd2c", "locale": "vi"}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/me/push-tokens", { body: { "device_install_id": "7b1f3c52-9d4e-4a6b-8e21-5c0f9a3d7e44", "platform": "apns", "environment": "production", "token": "fcm:APA91bHun4MxP5kXz0sT3yQeLrVn8wAd2c", "locale": "vi" },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import register_push_token
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = register_push_token.sync( client=dt.client, body={ "device_install_id": "7b1f3c52-9d4e-4a6b-8e21-5c0f9a3d7e44", "platform": "apns", "environment": "production", "token": "fcm:APA91bHun4MxP5kXz0sT3yQeLrVn8wAd2c", "locale": "vi", }, )DELETE /v1/me/push-tokens/{install_id}
Phần tiêu đề “DELETE /v1/me/push-tokens/{install_id}”Thu hồi push token thiết bị
Huỷ đăng ký push token của thiết bị khi đăng xuất.
Quyền: notify.pref.self- Nhóm tốc độ:
write - Phản hồi thành công
200: Đã thu hồi token. —object,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
install_id | path | Có | string | — |
curl -sS -X DELETE "https://api.dongtien.pro/v1/me/push-tokens/$INSTALL_ID" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.DELETE("/v1/me/push-tokens/{install_id}", { params: { path: { "install_id": "<install_id>" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import delete_push_token
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = delete_push_token.sync(install_id="<install_id>", client=dt.client)GET /v1/me/widget-summary
Phần tiêu đề “GET /v1/me/widget-summary”Tóm tắt dữ liệu cho Widget màn hình khoá / Home
Cung cấp số dư tài khoản (tách xác thực và tạm tính), thu/chi hôm nay và số việc chờ duyệt mà không lộ STK hay PII.
Quyền: notify.pref.self- Nhóm tốc độ:
read - Phản hồi thành công
200: Dữ liệu tóm tắt widget. —object,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/me/widget-summary" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/me/widget-summary");import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import get_widget_summary
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_widget_summary.sync(client=dt.client)GET /v1/me/zalo-link
Phần tiêu đề “GET /v1/me/zalo-link”Trạng thái liên kết Zalo
Trạng thái liên kết Zalo của người dùng hiện tại: chưa liên kết, đang chờ mã hay đã xác thực.
Quyền: notify.pref.self- Nhóm tốc độ:
read - Phản hồi thành công
200: Trạng thái liên kết Zalo. —object,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/me/zalo-link" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/me/zalo-link");import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import get_zalo_link
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_zalo_link.sync(client=dt.client)POST /v1/me/zalo:link
Phần tiêu đề “POST /v1/me/zalo:link”Liên kết tài khoản Zalo OA
Tạo liên kết với Zalo ID để nhận thông báo ZBS.
Quyền: notify.pref.self- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json, bắt buộc) - Phản hồi thành công
200: Đã tạo liên kết Zalo. —object,application/json - Mã lỗi riêng của endpoint:
conflict
curl -sS -X POST "https://api.dongtien.pro/v1/me/zalo:link" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "zalo_user_id": "2512345678901234567"}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/me/zalo:link", { body: { "zalo_user_id": "2512345678901234567" },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import link_zalo
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = link_zalo.sync( client=dt.client, body={ "zalo_user_id": "2512345678901234567", }, )POST /v1/me/zalo:verify
Phần tiêu đề “POST /v1/me/zalo:verify”Xác thực liên kết Zalo
Xác nhận mã OTP hoặc callback xác thực Zalo OA.
Quyền: notify.pref.self- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json, bắt buộc) - Phản hồi thành công
200: Xác thực hoàn tất. —object,application/json - Mã lỗi riêng của endpoint:
conflict
curl -sS -X POST "https://api.dongtien.pro/v1/me/zalo:verify" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "code": "482913"}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/me/zalo:verify", { body: { "code": "482913" },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import verify_zalo
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = verify_zalo.sync( client=dt.client, body={ "code": "482913", }, )GET /v1/notification-prefs
Phần tiêu đề “GET /v1/notification-prefs”Cài đặt thông báo của cá nhân
Lấy tuỳ chọn kênh, ngưỡng tiền vào, giờ yên lặng theo từng loại sự kiện của người dùng đang đăng nhập.
Quyền: notify.pref.self- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách thiết lập thông báo. —object,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/notification-prefs" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/notification-prefs");import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import get_notification_prefs
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_notification_prefs.sync(client=dt.client)PUT /v1/notification-prefs
Phần tiêu đề “PUT /v1/notification-prefs”Cập nhật cài đặt thông báo của cá nhân
Lưu tuỳ chọn kênh, ngưỡng số tiền, giờ yên lặng của người dùng.
Quyền: notify.pref.self Idempotency-Key: tuỳ chọn- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json, bắt buộc) - Phản hồi thành công
200: Thiết lập sau khi lưu. —object,application/json - Mã lỗi riêng của endpoint:
conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X PUT "https://api.dongtien.pro/v1/notification-prefs" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prefs": [ { "zalo": false, "email": true, "push": true, "min_amount": "10000000", "include_provisional": true, "quiet_start": "22:00", "quiet_end": "06:00", "timezone": "Asia/Ho_Chi_Minh", "params": {} } ]}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PUT("/v1/notification-prefs", { body: { "prefs": [ { "zalo": false, "email": true, "push": true, "min_amount": "10000000", "include_provisional": true, "quiet_start": "22:00", "quiet_end": "06:00", "timezone": "Asia/Ho_Chi_Minh", "params": {} } ] },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import put_notification_prefs
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = put_notification_prefs.sync( client=dt.client, body={ "prefs": [ { "zalo": False, "email": True, "push": True, "min_amount": "10000000", "include_provisional": True, "quiet_start": "22:00", "quiet_end": "06:00", "timezone": "Asia/Ho_Chi_Minh", "params": {}, }, ], }, )GET /v1/notification-rules
Phần tiêu đề “GET /v1/notification-rules”Quy tắc định tuyến thông báo của tổ chức
Lấy người nhận thông báo theo loại sự kiện và quyền của tổ chức.
Quyền: notify.org_rule.manage- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách quy tắc. —object,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
company_id | query | Có | OrgId | Mã công ty / tổ chức (org_…). |
curl -sS -X GET "https://api.dongtien.pro/v1/notification-rules?company_id=org_0f5k2m9q4h7t3n8r6v1w0x5yz0" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/notification-rules", { params: { query: { "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import get_notification_rules
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_notification_rules.sync(client=dt.client, company_id="org_0f5k2m9q4h7t3n8r6v1w0x5yz0")PUT /v1/notification-rules
Phần tiêu đề “PUT /v1/notification-rules”Cập nhật quy tắc định tuyến thông báo của tổ chức
Chỉ Admin và Owner có quyền thay đổi danh sách người nhận thông báo theo sự kiện.
Quyền: notify.org_rule.manage Idempotency-Key: tuỳ chọn- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json, bắt buộc) - Phản hồi thành công
200: Quy tắc sau khi cập nhật. —object,application/json - Mã lỗi riêng của endpoint:
conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X PUT "https://api.dongtien.pro/v1/notification-rules" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", "rules": [ { "enabled": true } ]}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PUT("/v1/notification-rules", { body: { "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", "rules": [ { "enabled": true } ] },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import put_notification_rules
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = put_notification_rules.sync( client=dt.client, body={ "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", "rules": [ { "enabled": True, }, ], }, )GET /v1/notifications
Phần tiêu đề “GET /v1/notifications”Hộp thư thông báo trong app
Lấy danh sách thông báo in-app của người dùng, hỗ trợ lọc chưa đọc và phân trang cursor.
Quyền: notify.pref.self- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách thông báo. —object,application/json - Mã lỗi riêng của endpoint:
invalid_cursor
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
unread | query | Không | string | — |
cursor | query | Không | string | — |
limit | query | Không | integer | — |
curl -sS -X GET "https://api.dongtien.pro/v1/notifications" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/notifications");import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import list_notifications
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_notifications.sync(client=dt.client)POST /v1/notifications:mark-read
Phần tiêu đề “POST /v1/notifications:mark-read”Đánh dấu đã đọc thông báo
Đánh dấu một số ID hoặc tất cả thông báo của người dùng là đã đọc.
Quyền: notify.pref.self- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json) - Phản hồi thành công
200: Số lượng thông báo đã cập nhật. —object,application/json - Mã lỗi riêng của endpoint:
conflict
curl -sS -X POST "https://api.dongtien.pro/v1/notifications:mark-read" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ids": [ "0199f564-b530-734b-834b-cd5cb38fe3f7", "0199f564-b531-7a2c-9f10-2d6e8a41b3c5" ]}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/notifications:mark-read", { body: { "ids": [ "0199f564-b530-734b-834b-cd5cb38fe3f7", "0199f564-b531-7a2c-9f10-2d6e8a41b3c5" ] },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import mark_notifications_read
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = mark_notifications_read.sync( client=dt.client, body={ "ids": [ "0199f564-b530-734b-834b-cd5cb38fe3f7", "0199f564-b531-7a2c-9f10-2d6e8a41b3c5", ], }, )POST /v1/webpush/subscriptions
Phần tiêu đề “POST /v1/webpush/subscriptions”Đăng ký Web Push subscription
Lưu thông tin PushSubscription từ trình duyệt web.
Quyền: notify.pref.self Idempotency-Key: tuỳ chọn- Nhóm tốc độ:
write - Nội dung yêu cầu:
object(application/json, bắt buộc) - Phản hồi thành công
200: Đã đăng ký Web Push. —object,application/json - Mã lỗi riêng của endpoint:
conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X POST "https://api.dongtien.pro/v1/webpush/subscriptions" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "endpoint": "https://fcm.googleapis.com/fcm/send/dQw4w9WgXcQ:APA91bHun4MxP5", "keys": { "p256dh": "BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM", "auth": "tBHItJI5svbpez7KI4CCXg" }}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/webpush/subscriptions", { body: { "endpoint": "https://fcm.googleapis.com/fcm/send/dQw4w9WgXcQ:APA91bHun4MxP5", "keys": { "p256dh": "BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM", "auth": "tBHItJI5svbpez7KI4CCXg" } },});import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import register_web_push_subscription
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = register_web_push_subscription.sync( client=dt.client, body={ "endpoint": "https://fcm.googleapis.com/fcm/send/dQw4w9WgXcQ:APA91bHun4MxP5", "keys": { "p256dh": "BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM", "auth": "tBHItJI5svbpez7KI4CCXg", }, }, )GET /v1/webpush/vapid-key
Phần tiêu đề “GET /v1/webpush/vapid-key”Lấy VAPID public key cho Web Push
Client web dùng public key này để đăng ký pushManager subscription.
Quyền: notify.pref.self- Nhóm tốc độ:
read - Phản hồi thành công
200: VAPID key. —object,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/webpush/vapid-key" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/webpush/vapid-key");import os
from dongtien import DongTienfrom dongtien_api.api.thong_bao import get_web_push_vapid_key
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_web_push_vapid_key.sync(client=dt.client)Lưu ý về từ "đã xác thực": đây là xác thực nguồn, không phải ngân hàng xác nhận quyết toán.
dat dinh do dang danh da doc duoc de doi day