Hướng dẫn tích hợp Facebook Messenger vào EzyOA
Back to ezyoaTài liệu này hướng dẫn lấy thông tin từ Facebook (Meta), điền vào form OA Service Setting của EzyOA (
/oa-services/add hoặc /oa-services/{code}/edit trong trang admin), rồi bấm nút Fetch access token để EzyOA tự lấy Page Access Token qua OAuth 2.0.Tổng quan
Người dùng nhắn Page -> Facebook -> POST {web-url}/api/v1/oa/{code}/webhook -> EzyOA
EzyOA trả lời -> POST https://graph.facebook.com/{version}/me/messages?access_token=<Page Access Token>
Admin bấm nút -> Facebook Login -> GET {web-url}/oa/{code}/auth-callback -> EzyOA lưu Page Access Token
Bạn cần nhập tay 3 giá trị. Phần còn lại EzyOA tự lưu sau khi OAuth thành công.
| Trường / nơi lưu | Nội dung | Ai điền |
|---|---|---|
Mã ứng dụng (appId) | Facebook App ID | Bạn |
Khoá bí mật (secretKey) | Facebook App Secret (lưu dạng password, được mã hoá) | Bạn |
Mã UUID ứng dụng (appUuid) | Username hoặc ID của Facebook Page, ví dụ youngmonkeys.org (xem mục 5) | Bạn |
Data meta fb_page_id của OA service setting | Facebook Page ID (chỉ để xem, được cập nhật mỗi lần OAuth) | EzyOA |
Setting ezyoa_oa_service_<code>_fb_page_access_token | Page Access Token (lưu dạng password, được mã hoá), được cập nhật mỗi lần OAuth. Không hiển thị trên form | EzyOA |
| Verify Token của webhook | Tự sinh từ Khoá bí mật và Mã, hiển thị ở trang chi tiết dịch vụ | EzyOA |
Khoá máy khách (clientKey) không còn được Messenger sử dụng, để trống.Chuẩn bị
- Một Facebook Page mà tài khoản Facebook của bạn có quyền quản trị.
- Tài khoản Facebook có quyền tạo app tại https://developers.facebook.com.
- Website EzyOA có địa chỉ HTTPS công khai (Facebook không gọi được
localhost). Khi chạy local có thể dùng ngrok hoặc cloudflared để có URL HTTPS tạm. - Trong EzyOA, cấu hình
web url(địa chỉ web của hệ thống) đúng với domain công khai, vì Webhook URL và Callback URL đều được tạo từ giá trị này.
Tạo app trên Facebook
Giao diện của Meta thay đổi thường xuyên, tên menu có thể khác đôi chút.
Tạo app và thêm sản phẩm
- Vào https://developers.facebook.com -> My Apps -> Create App.
- Chọn use case liên quan đến nhắn tin (ví dụ Engage with customers on Messenger from Meta) hoặc Other -> loại app Business.
- Đặt tên app rồi tạo app.
- Đảm bảo app có 2 sản phẩm: Messenger (để cấu hình webhook) và Facebook Login (để đăng nhập OAuth).
Lấy App ID và App Secret
- Vào App settings -> Basic.
- App ID -> dùng cho trường
Mã ứng dụng. - App Secret -> bấm Show (Facebook có thể yêu cầu nhập lại mật khẩu) -> dùng cho trường
Khoá bí mật.
App Secret được dùng vào hai việc: đổi
code OAuth lấy token, và kiểm tra chữ ký X-Hub-Signature-256 của webhook. Nếu để trống Khoá bí mật, EzyOA sẽ bỏ qua kiểm tra chữ ký webhook và cũng không hiện được nút OAuth.

Verify Token
Bạn không cần tự đặt Verify Token. EzyOA tự sinh giá trị này từ App Secret và
Mã của dịch vụ, và hiển thị ở dòng Webhook verify token trên trang chi tiết dịch vụ để bạn sao chép, dán vào ô Verify token khi cấu hình webhook trên Facebook (mục 6). Giá trị chỉ đổi khi bạn đổi App Secret.Khai báo OAuth Redirect URI
- Vào Facebook Login -> Settings.
- Ở ô Valid OAuth Redirect URIs, thêm URL callback của EzyOA:
https://<web-url>/oa/<code>/auth-callback
<code> là mã bạn sẽ đặt ở mục 4. Sau khi lưu dịch vụ, trang chi tiết cũng hiển thị URL này ở dòng Authentication callback url, có thể sao chép trực tiếp.
- Bật Client OAuth Login và Web OAuth Login, rồi lưu.
Nếu app của bạn dùng Facebook Login for Business, luồng đăng nhập dùngconfig_idthay cho danh sách quyền. Khi đó cần chọn loại app/use case dùng Facebook Login thông thường để nút OAuth của EzyOA hoạt động.
4. Điền form OA Service Setting trong EzyOA
Vào trang admin -> OA Services -> Thêm (
/oa-services/add):| Trường trong form | Giá trị cần điền | Bắt buộc |
|---|---|---|
Mã (code) | MESSENGER. Nếu có nhiều Page, đặt mã riêng cho từng Page (ví dụ MESSENGER_SHOP_A) và chọn Dịch vụ xử lý là MESSENGER. Mã này nằm trong Webhook URL và Callback URL, và không sửa được sau khi tạo. | Có |
Tên (name) | Tên hiển thị, ví dụ Facebook Messenger - Shop A | Có |
Phiên bản (version) | Phiên bản Graph API, ví dụ v21.0. Xem phiên bản mới nhất tại <https://developers.facebook.com/docs/graph-api/changelog>.Để trống thì EzyOA gọi Graph API không kèm phiên bản. | Không |
Mã ứng dụng (appId) | App ID ở mục 3.2 | Có |
Mã UUID ứng dụng (appUuid) | Username hoặc ID của Page (xem mục 5) | Có |
Đường dẫn dịch vụ (serviceUrl) | Tuỳ chọn, ví dụ đường dẫn tới Page | Không |
Đường dẫn API dịch vụ (serviceApiUrl) | Để trống, mặc định là https://graph.facebook.com | Không |
Khoá máy khách (clientKey) | Để trống | Không |
Khoá bí mật (secretKey) | App Secret ở mục 3.2 | Có |
Khoá bí mật webhook (webhookSecretKey) | Messenger không sử dụng trường này, để trống. Page Access Token được lưu ở một setting riêng nên nhập gì vào đây cũng không ảnh hưởng việc gửi tin | Không |
Code challenge, Code verifier | Để trống, chỉ dùng cho luồng OAuth của Zalo | Không |
Kênh nhận thông báo (notificationChannel) | Không liên quan đến việc kết nối Facebook, để trống nếu không cần | Không |
Dịch vụ xử lý (handlingService) | MESSENGER | Có |
Mẫu thông báo cho nhân viên | Để mặc định | Không |
Trạng thái (status) | ACTIVATED | Có |
Bấm Lưu.
5. Lấy Page Access Token bằng OAuth
- Mở trang chi tiết của dịch vụ vừa tạo. Dòng Auth url và nút Fetch access token chỉ hiện khi đã có
Mã ứng dụngvàKhoá bí mật. - Bấm Fetch access token. Facebook hiện màn hình đăng nhập và xin quyền
pages_show_list,pages_messaging,pages_manage_metadata. Hãy chọn đúng Page cần kết nối khi Facebook hỏi. - Sau khi đồng ý, Facebook chuyển về
/oa/{code}/auth-callback. EzyOA thực hiện lần lượt:- Đổi
codelấy user token ngắn hạn, rồi đổi sang user token dài hạn. - Gọi
GET /{appUuid}?fields=id,name,access_tokenbằng user token dài hạn để đổi username/ID của Page sang Page ID và lấy Page Access Token (token của Page lấy từ user token dài hạn không hết hạn). - Lưu Page Access Token (vào
Khoá bí mật webhook) và Page ID. - Đăng ký (subscribe) Page vào app với field
messages. Nếu bước này thất bại, EzyOA chỉ ghi log cảnh báo và bạn có thể subscribe thủ công (mục 6).
- Đổi
- EzyOA chuyển bạn về trang chi tiết dịch vụ.
Về
Mã UUID ứng dụng:
- Phải là username của Page (phần sau
facebook.com/, ví dụyoungmonkeys.org) hoặc Page ID dạng số. Facebook không có API đổi tên hiển thị của Page (ví dụYoung Monkeys) sang ID, nên không dùng được tên có khoảng trắng. - Page ID được tra lại từ API mỗi lần bấm nút, giá trị lưu lại chỉ để xem.
- Tài khoản dùng để đăng nhập phải có quyền quản trị Page đó.
Muốn đổi sang Page khác, sửa
Mã UUID ứng dụng thành username hoặc ID của Page mới rồi bấm lại Fetch access token.
Cấu hình Webhook trên Facebook
Phải hoàn tất mục 4 (đã lưu và kích hoạt) trước khi làm bước này, vì Facebook gọi vào webhook ngay khi bạn bấm xác minh.
- Mở app tại <https://developers.facebook.com/apps>,rồi tìm màn hình cấu hình webhook theo một trong các cách sau (tuỳ loại app):
- Use cases -> use case Messenger -> Customize -> Messenger API settings -> mục Configure webhooks.
- Messenger -> Settings -> mục Webhooks (app có sản phẩm Messenger kiểu cũ).
- Webhooks ở menu trái -> chọn đối tượng Page -> Subscribe to this object. Với cách này, đăng ký field
messagesngay trong danh sách field của Page.
- Callback URL: dùng Webhook URL ở trang chi tiết dịch vụ, có dạng
https://<web-url>/api/v1/oa/<code>/webhook. - Verify token: dán giá trị ở dòng Webhook verify token trên trang chi tiết dịch vụ.
- Bấm Verify and save. Facebook gửi
GETkèmhub.mode=subscribe,hub.verify_token,hub.challenge; EzyOA trả lạihub.challengenếu token khớp. - Ở mục Webhook fields, đăng ký ít nhất trường
messages. - Nếu log của EzyOA báo
can not subscribe page ... to app, vào mục Generate access tokens, thêm Page vào app để Page được subscribe thủ công.
Kiểm tra hoạt động
- Dùng tài khoản Facebook là admin/developer/tester của app, nhắn tin vào Page.
- Vào trang admin EzyOA -> danh sách OA Users / tin nhắn: phải thấy người dùng mới cùng tin nhắn vừa gửi (tên và avatar lấy từ Graph API).
- Trả lời từ admin EzyOA và kiểm tra tin nhắn đã tới Messenger.
Đưa lên chạy thật (Live mode)
- Khi app còn ở Development mode, chỉ admin/developer/tester của app đăng nhập OAuth được và nhắn vào Page được.
- Để nhận tin từ mọi khách hàng, cần chuyển app sang Live mode và xin quyền
pages_messaging(Advanced Access) qua App Review. Cần có Privacy Policy URL và thông tin doanh nghiệp đã xác minh theo yêu cầu của Meta. - EzyOA gửi tin với
messaging_type = RESPONSE, nên chỉ trả lời được trong 24 giờ kể từ tin nhắn gần nhất của người dùng. Ngoài khung 24 giờ, Facebook sẽ từ chối.
Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Không thấy nút Fetch access token | Chưa có Mã ứng dụng hoặc Khoá bí mật | Điền đủ hai trường rồi lưu |
Facebook báo URL Blocked / redirect_uri isn't an authorized domain khi bấm nút | Callback URL chưa nằm trong Valid OAuth Redirect URIs, hoặc web url của EzyOA khác domain đã khai báo | Xem mục 3.4 |
Callback trả 400 state: invalid | Khoá bí mật đã bị đổi sau khi mở link OAuth, hoặc link bị sửa | Mở lại trang chi tiết và bấm nút lại |
Callback trả 400 error: ... | Người dùng từ chối cấp quyền trên Facebook | Bấm nút lại và đồng ý các quyền |
Callback trả 400 appUuid: required | Chưa nhập username hoặc ID Page | Điền Mã UUID ứng dụng rồi bấm nút lại |
Callback báo lỗi can not call Facebook Graph API | Sai App Secret, code đã dùng rồi, Mã UUID ứng dụng không phải username/ID hợp lệ (ví dụ nhập tên hiển thị), hoặc tài khoản không có quyền trên Page hoặc chưa được cấp pages_show_list | Kiểm tra Khoá bí mật, Mã UUID ứng dụng, quyền trên Page và bấm nút lại |
| Facebook báo "The URL couldn't be validated" khi Verify webhook | Dịch vụ chưa ACTIVATED, sai code trong URL, hoặc domain không truy cập được từ Internet | Kiểm tra trạng thái, Webhook URL, HTTPS công khai |
| Verify webhook trả 403 | Verify token nhập trên Facebook khác giá trị ở dòng Webhook verify token, hoặc chưa có Khoá bí mật | Sao chép lại giá trị đúng (không thừa khoảng trắng). Nếu đã đổi Khoá bí mật thì giá trị này cũng đổi theo |
Webhook trả 404 oaService notFound | Sai code, dịch vụ chưa ACTIVATED, hoặc Dịch vụ xử lý để trống | Sửa lại form |
Webhook trả 400 X-Hub-Signature-256: invalid | Khoá bí mật không phải App Secret của đúng app | Sao chép lại App Secret ở App settings -> Basic |
Webhook trả 400 X-Hub-Signature-256: required | Request không đi từ Facebook (ví dụ test tay bằng curl) trong khi đã có Khoá bí mật | Test bằng tin nhắn thật |
Nhận được tin nhưng không trả lời được, lỗi OAuthException code 190 | Page Access Token hết hiệu lực (ví dụ đổi mật khẩu Facebook, gỡ app) | Bấm Fetch access token để lấy lại |
Lỗi gửi tin code 10 / 551 / 2018278 | Ngoài khung 24 giờ, hoặc người dùng chưa từng nhắn Page | Chờ người dùng nhắn lại |
| Không nhận được webhook dù Verify thành công | Chưa đăng ký field messages, hoặc Page chưa được subscribe vào app | Làm lại mục 6.5 và 6.6 |
| Tin nhắn từ khách thật không tới, chỉ có tin của tài khoản test | App đang ở Development mode | Xem mục 8 |
Bảo mật
-
App Secret,Page Access Token,Verify Tokenlà thông tin nhạy cảm, không commit vào git và không gửi qua kênh công khai. EzyOA lưu App Secret và Page Access Token dưới dạng password setting (mã hoá). - Nếu nghi ngờ lộ token: Reset App Secret ở App settings -> Basic, cập nhật lại
Khoá bí mậttrong EzyOA rồi bấm lại Fetch access token. - Luôn điền
Khoá bí mật(App Secret) ở môi trường production để EzyOA từ chối các request webhook giả mạo.