View a markdown version of this page

設定動態流程 - AWS 最終使用者傳訊社交

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定動態流程

動態流程會在執行時間呼叫您自己的 HTTPS 端點,以擷取畫面內容並決定導覽。靜態流程定義流程 JSON 中的所有畫面。動態流程會改為在每次使用者在畫面之間導覽時,使用 data_exchange動作從您的端點請求資料。這可實現個人化、資料驅動的體驗,例如向使用者顯示其開啟的訂單、驗證輸入伺服器端,或根據後端決策進行分支。

當使用者與動態流程互動時,中繼會使用加密請求直接呼叫您的端點。您的端點會解密請求、執行您的商業邏輯、加密回應,並將其傳回 Meta。加密的請求和回應會直接在中繼和端點之間傳遞,因此 AWS 最終使用者傳訊社交永遠無法存取這些交換的解密內容。 AWS 最終使用者傳訊社交會管理控制平面:建立和更新流程、上傳加密公有金鑰,以及交付流程運作狀態 Webhook。

若要設定動態流程,請完成下列步驟:

  1. 部署 HTTPS 端點。

  2. 上傳商業公有金鑰以進行加密。

  3. 使用端點 URI 建立流程。

  4. 連接您的中繼應用程式以進行請求驗證。

  5. 發佈流程。

步驟 1:部署 HTTPS 端點

您的端點必須符合下列要求:

  • 具有有效 TLS 憑證的公開存取 HTTPS URL。

  • 在 10 秒內回應。Meta 會強制執行硬性逾時並監控 p90 延遲。持續超過延遲閾值或傳回錯誤的端點可能會受到調節或封鎖。

  • 接受包含加密 JSON 承載的 POST 請求。

  • 將加密的回應傳回為 text/plain(base64 編碼)。

您可以使用任何提供公有 HTTPS URL 的運算選項。常見的方法包括:

  • AWS Lambda 函數 URL — 具有內建 HTTPS 端點的單一函數。將授權類型設定為 ,NONE因為 Meta 不使用 。您可以使用您在 中設定的商業加密金鑰對來驗證請求步驟 2:上傳商業公有金鑰。

  • Amazon API Gateway with Lambda — 提供其他控制項,例如限制來源 IPs、 AWS WAF 規則和限流的資源政策。

  • Elastic Load Balancing 與 Lambda 目標 — 當您想要與現有的負載平衡基礎設施結合時很有用。

  • 任何其他 HTTPS 伺服器 (容器、Amazon EC2 執行個體或外部服務)。

您的端點必須實作 Meta 的資料交換合約,該合約會處理下列請求類型:

  • 運作狀態檢查 — Meta 會定期傳送ping請求,以驗證您的端點是否可用。使用 回應 {"data": {"status": "active"}}。

  • INIT — 當使用者開啟流程時傳送。傳回初始畫面及其資料。

  • data_exchange — 每次使用者提交畫面時傳送。傳回下一個畫面及其資料。

  • BACK — 當使用者導覽回上一個畫面時傳送。

如需完整的端點實作指南,包括多種語言的加密和解密程式碼範例,請參閱 Meta for Developers 網站上的實作您的流程端點。

步驟 2:上傳商業公有金鑰

Meta 會使用 RSA (Rivest-Shamir-Adleman) 公有金鑰end-to-end的資料交換請求。您的端點會使用對應的私有金鑰解密請求。 AWS 使用者傳訊社交會代表您將公有金鑰上傳至 Meta,但絕不會存取或存放私有金鑰。

使用 PutWhatsAppBusinessPublicKey API 上傳電話號碼的公有金鑰。您必須完全提供下列其中一項:

  • PEM 編碼的 RSA 公有金鑰 — 直接提供金鑰。您的端點會保留對應的私有金鑰以進行解密。

  • AWS Key Management Service 金鑰 ARN — 提供非對稱 RSA-2048 KMS 金鑰的 ARN。 AWS 最終使用者傳訊社交只會使用 讀取公有半數,kms:GetPublicKey並將其上傳至 Meta。私有金鑰永遠不會離開 AWS KMS。您的端點使用 kms:Decrypt 在執行時間解密請求。

提供兩者或兩者都無法傳回 InvalidParametersException。

PEM 模式

產生 RSA 金鑰對並上傳公有金鑰:

# Generate a key pair openssl genrsa -out private.pem 2048 openssl rsa -in private.pem -pubout -out public.pem # Upload the public key aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --business-public-key "$(cat public.pem)"

安全地存放私有金鑰,並將其提供給端點進行解密。

AWS KMS 模式

建立非對稱 RSA KMS 金鑰並上傳其 ARN:

# Create the KMS key KMS_KEY_ARN=$(aws kms create-key \ --key-spec RSA_2048 \ --key-usage ENCRYPT_DECRYPT \ --description "WhatsApp Dynamic Flow encryption key" \ --query KeyMetadata.Arn --output text) # Upload the KMS key ARN aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --kms-key-arn $KMS_KEY_ARN

KMS 金鑰政策必須授予下列許可:

  • kms:GetPublicKey 至 social-messaging.amazonaws.com 服務主體。這可讓 AWS 最終使用者傳訊社交讀取公有金鑰並將其上傳至中繼。

  • kms:Decrypt 端點的執行角色。這可讓您的端點解密傳入的資料交換請求。 AWS 最終使用者傳訊社交絕不kms:Decrypt會呼叫此金鑰。

驗證金鑰

使用 GetWhatsAppBusinessPublicKey API 驗證儲存的金鑰並檢查中繼的簽署狀態:

aws social-messaging get-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID}

回應包含存放的 PEM 和中繼簽署狀態 (VALID 或 MISMATCH)。MISMATCH 狀態表示儲存的金鑰與 Meta 預期不相符。如果您看到此狀態,請上傳新的金鑰。

步驟 3:使用端點建立流程

建立動態流程時,請提供 --endpoint-uri 參數與您的 HTTPS 端點 URL。流程 JSON 也必須宣告 data_api_version,讓 Meta 在流程工作階段期間呼叫您的端點。

aws social-messaging create-whatsapp-flow \ --id {WABA_ID} \ --flow-name "my_dynamic_flow" \ --categories '["OTHER"]' \ --flow-json fileb://flow.json \ --endpoint-uri "https://your-endpoint.example.com/flow"

您也可以使用 在現有的 DRAFT Flow 上新增或變更端點UpdateWhatsAppFlow:

aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID} \ --endpoint-uri "https://your-endpoint.example.com/flow"
注意

當您發佈動態流程時,Meta 會對端點執行同步運作狀態檢查。如果端點未回應或傳回錯誤,發佈操作會失敗並出現中繼錯誤,例如 131000(「驗證端點可用且您已實作運作狀態檢查」)。遺失或無效的商業公有金鑰也可能導致此錯誤。在發佈之前,請確定您的端點已部署並回應ping請求,而且您已上傳有效的商業公有金鑰 (請參閱 步驟 2:上傳商業公有金鑰)。

若要驗證為流程設定的端點和資料 API 版本,請使用 GetWhatsAppFlow:

aws social-messaging get-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID}

回應包含endpointUri中繼保留的 、流程 JSON 中dataApiVersion宣告的 ,以及目前連接的 application。

步驟 4:連接您的 Meta 應用程式以進行請求驗證

根據預設,當您透過 AWS 最終使用者傳訊社交建立流程時,它會與服務的中繼應用程式相關聯。若要驗證對端點的資料交換請求是否來自 Meta,請將您自己的 Meta 應用程式連接到 流程。如果沒有連接您自己的應用程式,就無法進行請求來源驗證。連接您的應用程式可讓您存取驗證 Meta 在每個請求中包含的 X-Hub-Signature-256 HMAC 標頭所需的應用程式秘密。

aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID} \ --meta-app-id "{YOUR_META_APP_ID}"

Meta 應用程式必須由擁有 WhatsApp 商業帳戶 (WABA) 的相同企業所擁有。

重要

連接您自己的 Meta 應用程式是單向操作。連接應用程式後,無法重新連接服務的應用程式。這不會影響流程功能。只有新的流程會重設應用程式關聯。

您可以在相同通話--meta-app-id或個別通話中設定 --endpoint-uri和 。這兩個欄位是獨立的。

連接應用程式後,請呼叫 GetWhatsAppFlow並檢查回應中的 application 欄位,以驗證組態。application.id 應該符合您提供的中繼應用程式 ID。

保護您的端點

由於 Meta 會直接呼叫您的端點,請考慮下列安全實務:

  • 驗證請求簽章 — 如果您連接自己的 Meta 應用程式 (步驟 4),請使用應用程式秘密來驗證每個請求上的 X-Hub-Signature-256 HMAC-SHA256 標頭。這會確認來自中繼的請求。如果驗證失敗,請傳回 HTTP 狀態 432。

  • 驗證流程字符 — 將流程傳送給使用者時,flow_token為每個流程工作階段產生唯一的、不可預測的。您的端點會在加密的承載中接收字符,並應針對作用中工作階段進行驗證。拒絕具有未知、過期或已完成字符的請求。這可防止未經授權或重播的請求到達您的商業邏輯。

  • 在沒有權杖驗證的情況下處理運作狀態檢查 — Meta 會定期傳送ping請求來監控端點運作狀態。這些請求不包含 flow_token。回應運作狀態檢查而不需要權杖驗證,因為拒絕它們會降低端點的可用性分數。

  • 傳回適當的狀態碼 — 如果您的端點無法解密請求,則傳回 421 (Meta 會重新擷取公有金鑰並重試)。如果 flow_token 無效,請傳回 427 (Meta 會停用該工作階段的流程按鈕)。

撰寫動態流程 JSON

動態流程 JSON 與靜態流程 JSON 有兩種不同之處:

  1. 最上層data_api_version欄位為必要欄位。這會通知 Meta 在流程工作階段期間呼叫您的端點。支援的值為 "3.0"和 "4.0"(建議)。

  2. 螢幕頁尾使用 data_exchange動作,而不是 navigate。每個data_exchange動作都會將表單資料傳送至您的端點,這會傳回下一個畫面及其內容。

下列範例顯示具有兩個畫面的最小動態流程 JSON。第一個畫面會收集使用者名稱,並將其傳送至端點。端點會在第二個畫面上傳回個人化問候語。

{ "version": "6.0", "data_api_version": "3.0", "routing_model": { "INPUT": ["RESULT"], "RESULT": [] }, "screens": [ { "id": "INPUT", "title": "Welcome", "data": { "greeting": { "type": "string", "__example__": "Tell us your name" } }, "layout": { "type": "SingleColumnLayout", "children": [ { "type": "TextBody", "text": "${data.greeting}" }, { "type": "Form", "name": "input_form", "children": [ { "type": "TextInput", "name": "user_name", "label": "Your name", "input-type": "text", "required": true }, { "type": "Footer", "label": "Submit", "on-click-action": { "name": "data_exchange", "payload": { "user_name": "${form.user_name}" } } } ] } ] } }, { "id": "RESULT", "title": "Hello", "terminal": true, "data": { "message": { "type": "string", "__example__": "Hello, World!" } }, "layout": { "type": "SingleColumnLayout", "children": [ { "type": "TextBody", "text": "${data.message}" }, { "type": "Footer", "label": "Done", "on-click-action": { "name": "complete", "payload": {} } } ] } } ] }

如需完整的流程 JSON 結構描述參考,請參閱 Meta for Developers 網站上的流程 JSON。

端對端範例

下列範例顯示設定和發佈動態流程的完整 API 呼叫序列:

# 1. Upload the business public key (KMS mode) aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --kms-key-arn {KMS_KEY_ARN} # 2. Create the Dynamic Flow with an endpoint FLOW_ID=$(aws social-messaging create-whatsapp-flow \ --id {WABA_ID} \ --flow-name "my_dynamic_flow" \ --categories '["OTHER"]' \ --flow-json fileb://flow.json \ --endpoint-uri "https://your-endpoint.example.com/flow" \ --query flowId --output text) # 3. Attach your Meta app for signature verification aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID \ --meta-app-id "{YOUR_META_APP_ID}" # 4. Publish the Flow aws social-messaging publish-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID # 5. Verify the configuration aws social-messaging get-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID

發佈之後,流程可用於範本訊息。如需傳送流程的詳細資訊,請參閱 傳送 WhatsApp 流程給使用者。