Webhook Tài liệu này giải thích cách thiết lập Webhook để thông báo cho bạn mỗi khi công ty của bạn có một sự kiện cụ thể xảy ra.
Lưu ý
Để thiết lập Webhook bất kỳ, bạn cần phải:
Tạo một điểm cuối trên máy chủ để xử lý các yêu cầu HTTP.
Tạo điểm cuối xử lý webhook
Điểm cuối của bạn phải có khả năng xử lý 2 loại yêu cầu HTTP: [Yêu cầu xác minh ] và [Thông báo sự kiện ].
Yêu cầu xác minh
Mỗi khi bạn cấu hình Webhooks tại trang Tích hợp , chúng tôi sẽ gửi yêu cầu GET
đến URL điểm cuối của bạn. Yêu cầu xác minh bao gồm các thông số chuỗi truy vấn sau đây, được thêm vào cuối URL điểm cuối của bạn. Các yêu cầu này sẽ có dạng như sau:
**Yêu cầu xác minh từ DooPage**
Copy GET https://your-domain.com/webhook-endpoint?
validation_key=<your_input_key>&
challenge_key=<random_string>
**Xác thực yêu cầu xác minh**
Mỗi khi nhận được yêu cầu xác minh, điểm cuối của bạn phải:
Xác minh rằng giá trị validation_key
khớp với chuỗi mà bạn đặt trong trường Validation key
khi cấu hình Webhooks trong trang Tích hợp .
Phản hồi với giá trị challenge_key
.
Thông báo sự kiện
Khi cấu hình Webhooks, bạn sẽ đăng ký các sự kiện cụ thể (Ví dụ: Tích vào Customer created
để nhận được thông tin mỗi khi có khách hàng mới được tạo trên DooPage). Mỗi khi có thay đổi cho một trong các trường này, chúng tôi sẽ gửi yêu cầu POST tới điểm cuối của bạn kèm theo JSON payload Ví dụ: Customer created
webhook payload.
Copy {
"company_id" : 1 ,
"event_type" : "customer_created" ,
"timestamp" : 1618118040123 ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage"
}
}
}
Cấu hình Webhooks
Sau khi điểm cuối đã sẵn sàng, hãy truy cập trang Tích hợp để cài đặt Webhooks.
Sau khi nhấn lưu
DooPage sẽ gửi tới điểm cuối của bạn một Yêu cầu xác minh mà bạn phải xác thực.
Webhook payload sample
Customer created
Copy {
"company_id" : 1 ,
"event_type" : "customer_created" ,
"timestamp" : 1618118040123 ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage"
}
}
}
Customer updated
Copy {
"company_id" : 1 ,
"event_type" : "customer_updated" ,
"timestamp" : 1618118040123 ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage"
}
}
}
Customer took
Copy {
"company_id" : 1 ,
"event_type" : "customer_took" ,
"timestamp" : 1618118040123 ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage"
} ,
"staff" : {
"id" : 1 ,
"name" : "Doopage staff"
}
}
}
Customer transferred
Copy {
"company_id" : 1 ,
"event_type" : "customer_transferred" ,
"timestamp" : 1618118040123 ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage"
} ,
"staff" : {
"id" : 1 ,
"name" : "Doopage staff"
} ,
"new_staff" : {
"id" : 1 ,
"name" : "Doopage staff 2"
}
}
}
Customer closed
Copy {
"company_id" : 1 ,
"event_type" : "customer_closed" ,
"timestamp" : 1618118040123 ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage"
} ,
"staff" : {
"id" : 1 ,
"name" : "Doopage staff"
}
}
}
Order created
Copy {
"company_id" : 1 ,
"event_type" : "order_created" ,
"timestamp" : 1618118040123 ,
"data" : {
"order_id" : 1 ,
"created_at" : 1618118040
}
}
Order update
Copy {
"company_id" : 1 ,
"event_type" : "order_updated" ,
"timestamp" : 1618118040123 ,
"data" : {
"order_id" : 1 ,
"created_at" : 1618118040 ,
"modified_at" : 1618118041 ,
"picking_status" : "pending" ,
"payment_status" : "paid"
}
}
Customer Tag set
Copy {
"company_id" : 1 ,
"event_type" : "customer_tags_set" ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage customer"
} ,
"staff" : {
"id" : 1 ,
"name" : "DooPage staff"
} ,
"tags" : [
{
"id" : 1 ,
"name" : "tag_name"
} ,
{
"id" : 2 ,
"name" : "tag 2"
}
]
}
}
Customer Tag unset
Copy {
"company_id" : 1 ,
"event_type" : "customer_tags_unset" ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage customer"
} ,
"staff" : {
"id" : 1 ,
"name" : "DooPage staff"
} ,
"tags" : [
{
"id" : 1 ,
"name" : "tag_name"
} ,
{
"id" : 2 ,
"name" : "tag 2"
}
]
}
}
Note changed
Copy {
"company_id" : 1 ,
"event_type" : "customer_note_changed" ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage customer"
} ,
"note" : "Customer note"
}
}
Customer Pipeline Updated
Copy {
"company_id" : 1 ,
"event_type" : "pipeline_updated" ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage customer"
} ,
"staff" : {
"id" : 1 ,
"name" : "DooPage staff"
} ,
"pipeline" : {
"id" : 1 ,
"name" : "Re-target"
}
}
}
Customer Message Have Phone
Copy {
"company_id" : 1 ,
"event_type" : "customer_message_have_phone" ,
"data" : {
"customer" : {
"id" : 1 ,
"name" : "DooPage customer"
} ,
"phones" : [ "0389111222" ]
}
}
Xác thực yêu cầu đến từ DooPage
Để xác thực bạn cần liên hệ DooPage để có được secret_key
Mọi webhook http request đến từ DooPage đều chứa 1 đoạn mã xác thực nằm tại headers của http request. X-Doo-Signature
Mã xác thực được tạo bằng hàm mã hóa sha1: verify_key
= sha1(<request_payload>.<secret_key>)
Nếu verify_key
khớp với header X-Doo-Signature
tức request này hợp lệ
Php:
Copy $expected_key = $_SERVER[ 'HTTP_DOO_X_SIGNATURE' ];
$secret_key = "<contact_doopage_admin>" ;
$request_body = file_get_contents ( 'php://input' ) ;
$actual_key = sha1 ( $request_body . "." . $secret_key ) ;
if ($expected_key == $actual_key) {
echo "valid request" ;
} else {
exit ( "wrong key" );
}
NodeJS(Express):
Copy const express = require ( "express" );
const crypto = require ( "crypto" );
const app = express ();
app .use ( express .json ());
const port = 3000 ;
app .post ( "/" , (req , res) => {
const expected_key = req .header ( "Doo-X-Signature" );
const secret_key = "<contact_doopage_admin>" ;
const request_body = JSON .stringify ( req .body);
const hash = crypto
.createHash ( "sha1" )
.update ( ` ${ request_body } . ${ secret_key } ` );
const actual_key = hash .digest ( "hex" );
if (expected_key == actual_key) {
res .send ( "valid request" );
} else {
res .send ( "invalid request" );
}
});
app .listen (port);