Tà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ưuNội dungAi điền
Mã ứng dụng (appId)Facebook App IDBạ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 settingFacebook Page ID (chỉ để xem, được cập nhật mỗi lần OAuth)EzyOA
Setting ezyoa_oa_service_<code>_fb_page_access_tokenPage 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 formEzyOA
Verify Token của webhookTự 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

  1. Vào https://developers.facebook.com -> My Apps -> Create App.
  2. 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.
  3. Đặt tên app rồi tạo app.
  4. Đảm bảo app có 2 sản phẩm: Messenger (để cấu hình webhook) và Facebook Login (để đăng nhập OAuth).
meta-use-cases-redacted.png

Lấy App ID và App Secret

  1. Vào App settings -> Basic.
  2. App ID -> dùng cho trường Mã ứng dụng.
  3. 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.
meta-basic-settings-redacted.png

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

  1. Vào Facebook Login -> Settings.
  2. Ở ô 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.
meta-facebook-login-redacted.png
  1. 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ùng config_id thay 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 formGiá trị cần điềnBắ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 ACó
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.2Có
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 PageKhông
Đường dẫn API dịch vụ (serviceApiUrl)Để trống, mặc định là https://graph.facebook.comKhông
Khoá máy khách (clientKey)Để trốngKhông
Khoá bí mật (secretKey)App Secret ở mục 3.2Có
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 tinKhông
Code challenge, Code verifierĐể trống, chỉ dùng cho luồng OAuth của ZaloKhô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ầnKhông
Dịch vụ xử lý (handlingService)MESSENGERCó
Mẫu thông báo cho nhân viênĐể mặc địnhKhông
Trạng thái (status)ACTIVATEDCó
Bấm Lưu.

5. Lấy Page Access Token bằng OAuth

  1. 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ụng và Khoá bí mật.
  2. 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.
  3. Sau khi đồng ý, Facebook chuyển về /oa/{code}/auth-callback. EzyOA thực hiện lần lượt:
    • Đổi code lấ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_token bằ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).
  4. 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.
  1. 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 messages ngay trong danh sách field của Page.
  2. Callback URL: dùng Webhook URL ở trang chi tiết dịch vụ, có dạng https://<web-url>/api/v1/oa/<code>/webhook.
  3. Verify token: dán giá trị ở dòng Webhook verify token trên trang chi tiết dịch vụ.
  4. Bấm Verify and save. Facebook gửi GET kèm hub.mode=subscribe, hub.verify_token, hub.challenge; EzyOA trả lại hub.challenge nếu token khớp.
  5. Ở mục Webhook fields, đăng ký ít nhất trường messages.
  6. 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

  1. Dùng tài khoản Facebook là admin/developer/tester của app, nhắn tin vào Page.
  2. 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).
  3. 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ượngNguyên nhân thường gặpCách xử lý
Không thấy nút Fetch access tokenChư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útCallback URL chưa nằm trong Valid OAuth Redirect URIs, hoặc web url của EzyOA khác domain đã khai báoXem mục 3.4
Callback trả 400 state: invalidKhoá bí mật đã bị đổi sau khi mở link OAuth, hoặc link bị sửaMở 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 FacebookBấm nút lại và đồng ý các quyền
Callback trả 400 appUuid: requiredChư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 APISai 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_listKiể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 webhookDịch vụ chưa ACTIVATED, sai code trong URL, hoặc domain không truy cập được từ InternetKiểm tra trạng thái, Webhook URL, HTTPS công khai
Verify webhook trả 403Verify token nhập trên Facebook khác giá trị ở dòng Webhook verify token, hoặc chưa có Khoá bí mậtSao 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 notFoundSai code, dịch vụ chưa ACTIVATED, hoặc Dịch vụ xử lý để trốngSửa lại form
Webhook trả 400 X-Hub-Signature-256: invalidKhoá bí mật không phải App Secret của đúng appSao chép lại App Secret ở App settings -> Basic
Webhook trả 400 X-Hub-Signature-256: requiredRequest không đi từ Facebook (ví dụ test tay bằng curl) trong khi đã có Khoá bí mậtTest bằng tin nhắn thật
Nhận được tin nhưng không trả lời được, lỗi OAuthException code 190Page 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 / 2018278Ngoài khung 24 giờ, hoặc người dùng chưa từng nhắn PageChờ người dùng nhắn lại
Không nhận được webhook dù Verify thành côngChưa đăng ký field messages, hoặc Page chưa được subscribe vào appLà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 testApp đang ở Development modeXem mục 8

Bảo mật

  • App Secret, Page Access Token, Verify Token là 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ật trong 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.