本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定動態流程
動態流程會在執行時間呼叫您自己的 HTTPS 端點,以擷取畫面內容並決定導覽。靜態流程定義流程 JSON 中的所有畫面。動態流程會改為在每次使用者在畫面之間導覽時,使用 data_exchange動作從您的端點請求資料。這可實現個人化、資料驅動的體驗,例如向使用者顯示其開啟的訂單、驗證輸入伺服器端,或根據後端決策進行分支。
當使用者與動態流程互動時,中繼會使用加密請求直接呼叫您的端點。您的端點會解密請求、執行您的商業邏輯、加密回應,並將其傳回 Meta。加密的請求和回應會直接在中繼和端點之間傳遞,因此 AWS 最終使用者傳訊社交永遠無法存取這些交換的解密內容。 AWS 最終使用者傳訊社交會管理控制平面:建立和更新流程、上傳加密公有金鑰,以及交付流程運作狀態 Webhook。
若要設定動態流程,請完成下列步驟:
部署 HTTPS 端點。
上傳商業公有金鑰以進行加密。
使用端點 URI 建立流程。
連接您的中繼應用程式以進行請求驗證。
發佈流程。
步驟 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-256HMAC-SHA256 標頭。這會確認來自中繼的請求。如果驗證失敗,請傳回 HTTP 狀態 432。 -
驗證流程字符 — 將流程傳送給使用者時,
flow_token為每個流程工作階段產生唯一的、不可預測的。您的端點會在加密的承載中接收字符,並應針對作用中工作階段進行驗證。拒絕具有未知、過期或已完成字符的請求。這可防止未經授權或重播的請求到達您的商業邏輯。 -
在沒有權杖驗證的情況下處理運作狀態檢查 — Meta 會定期傳送
ping請求來監控端點運作狀態。這些請求不包含flow_token。回應運作狀態檢查而不需要權杖驗證,因為拒絕它們會降低端點的可用性分數。 -
傳回適當的狀態碼 — 如果您的端點無法解密請求,則傳回 421 (Meta 會重新擷取公有金鑰並重試)。如果
flow_token無效,請傳回 427 (Meta 會停用該工作階段的流程按鈕)。
撰寫動態流程 JSON
動態流程 JSON 與靜態流程 JSON 有兩種不同之處:
最上層
data_api_version欄位為必要欄位。這會通知 Meta 在流程工作階段期間呼叫您的端點。支援的值為"3.0"和"4.0"(建議)。螢幕頁尾使用
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 流程給使用者。