Đối tác cần cung cấp cho Alohub các thông tin sau:
Thông tin | Mô tả |
|---|---|
Webhook URL | URL nhận webhook (khuyến nghị HTTPS). Ví dụ: |
Method |
|
Authorization Key | Key xác thực — Alohub sẽ gửi trong header |
Content-Type |
|
Cách đăng ký: Liên hệ đội ngũ kỹ thuật Alohub, cung cấp URL nhận webhook và key xác thực. Alohub sẽ cấu hình gửi sự kiện đến URL của bạn.
Mỗi khi cuộc gọi kết thúc, Alohub gửi POST request với body JSON sau:
{
"call_id": "20240113150030xxxxxx",
"call_status": "answered",
"direction": "outbound",
"caller_number": "03899xxx",
"destination_number": "888",
"starttime": "2024-01-13 15:00:30",
"answertime": "2024-01-13 15:00:35",
"endtime": "2024-01-13 15:05:30",
"hangup_by": "customer",
"hotline": "",
"total_duration": "300",
"holding_duration": "0",
"recording_url": "https://domain:port/IPCCMedia/MP3Export.do?url=file.mp3&source=ipcc",
"objectId": 1,
"transactionID": "TRANSID_1111",
"userName": "adminxxx",
"eventType": "call"
}
Trường | Kiểu | Mô tả |
|---|---|---|
| string | Mã định danh duy nhất của cuộc gọi |
| string | Trạng thái cuộc gọi (xem bảng mã trạng thái bên dưới) |
| string | Hướng cuộc gọi: |
| string | Số điện thoại bên gọi (khách hàng) |
| string | Số extension tư vấn viên tiếp nhận |
| string | Thời điểm bắt đầu cuộc gọi ( |
| string | Thời điểm cuộc gọi được trả lời |
| string | Thời điểm kết thúc cuộc gọi |
| string | Bên ngắt máy: |
| string | Số hotline (đầu số tổng đài), rỗng nếu không có |
| string | Tổng thời lượng cuộc gọi (giây) |
| string | Thời gian giữ máy — hold (giây) |
| string | URL file ghi âm cuộc gọi (dùng để tải hoặc phát lại) |
| number | ID đối tượng liên quan (mặc định: |
| string | ID giao dịch (truyền khi gọi makeCall hoặc addCampaignCustomer) |
| string | Tên tài khoản agent xử lý cuộc gọi |
| string | Loại sự kiện, mặc định |
Giá trị call_status trong payload webhook:
Mã trạng thái | Mô tả | Ghi chú |
|---|---|---|
| Cuộc gọi đã được trả lời | Cuộc gọi thành công, có kết nối giữa 2 bên |
| Không trả lời | Đổ chuông nhưng bên nhận không nhấc máy |
| Máy bận | Bên nhận đang trong cuộc gọi khác hoặc từ chối |
| Cuộc gọi thất bại | Lỗi kỹ thuật: số không tồn tại, lỗi mạng, hết tài nguyên |
| Cuộc gọi bị hủy | Agent hoặc hệ thống hủy trước khi kết nối |
Respond nhanh: Endpoint nhận webhook nên trả về HTTP
200trong vòng 5 giây. Nếu timeout hoặc lỗi, Alohub sẽ retry tối đa 3 lần với khoảng cách tăng dần.
const express = require('express')
const app = express()
app.use(express.json())
app.post('/api/alohub/webhook', (req, res) => {
const { call_id, call_status, caller_number, direction, recording_url } = req.body
console.log(`Cuộc gọi ${call_id}: ${call_status}`)
console.log(`Hướng: ${direction}, SĐT: ${caller_number}`)
if (recording_url) {
console.log(`Ghi âm: ${recording_url}`)
}
// Xử lý logic nghiệp vụ tại đây
// VD: cập nhật CRM, gửi notification, lưu DB...
// Quan trọng: respond 200 ngay lập tức
res.status(200).json({ received: true })
})
app.listen(3000)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/alohub/webhook', methods=['POST'])
def webhook():
data = request.json
call_id = data.get('call_id')
call_status = data.get('call_status')
caller_number = data.get('caller_number')
recording_url = data.get('recording_url')
print(f"Cuộc gọi {call_id}: {call_status}, SĐT: {caller_number}")
if recording_url:
print(f"Ghi âm: {recording_url}")
# Xử lý logic nghiệp vụ tại đây
return jsonify({"received": True}), 200
if __name__ == '__main__':
app.run(port=3000)
Idempotency: Có thể nhận cùng 1 sự kiện nhiều lần (do retry). Dùng
call_idlàm key để kiểm tra trùng lặp trước khi xử lý.
Bảo mật: Verify header
Authorizationtrong request webhook khớp với key bạn đã cung cấp cho Alohub. Reject request không hợp lệ.
Best practice: Nhận webhook → respond 200 ngay → đẩy vào queue (Redis, RabbitMQ...) → xử lý async. Tránh xử lý nặng trong handler webhook.