全部產品
Search
文件中心

Chat APP Message Service:身分識別驗證模板最佳實務

更新時間:Jul 13, 2024

本文帶您瞭解WhatsApp新的身分識別驗證模板。

背景資訊

自2023年5月1日起,WhatsApp推出了包含單次密碼按鈕的身分識別驗證模板(Authentication),自2023年5月29日起,所有建立的身分識別驗證模板都必須包含單次密碼按鈕。更多關於身分識別驗證模板的資訊請參見WhatsApp模板類型說明

身分識別驗證模板

模板組成

包含單次密碼按鈕的身分識別驗證模板由以下部分組成:

  • 身分識別驗證模板的預設固定文本:

    • <VERIFICATION_CODE> 是您的驗證碼。

    • 安全免責聲明(可選):為安全起見,請勿共用該驗證碼。

    • 到期警告(可選):這組驗證碼將在<NUM_MINUTES>分鐘後到期。

  • 按鈕:複製驗證碼按鈕(Copy code)或一鍵自動填寫按鈕(Autofill)。

樣本圖:

身分識別驗證模板OTP.png

模板規則限制

  • 包含單次密碼按鈕的身分識別驗證模板僅由預設文本和按鈕組成。

  • 身分識別驗證模板的內容或參數不允許使用網址、媒體(圖片、音頻、視頻、檔案等)和Emoji。

  • 身分識別驗證模板使用參數最多支援15 個字元,即驗證碼最大長度為15位。

按鈕

身分識別驗證模板必須包含複製驗證碼按鈕(Copy code)或一鍵自動填寫按鈕(Autofill)。當使用者點擊按鈕時,不同按鈕的工作方式不同:

  • 複製驗證碼按鈕:會將單次密碼或驗證碼複製到使用者的剪貼簿。然後,使用者可以手動切換到您的應用,將單次密碼或驗證碼粘貼到應用介面。

  • 一鍵自動填寫按鈕:會自動載入您的應用,並向該應用傳遞單次密碼或驗證碼。

一鍵自動填寫按鈕可提供最佳使用者體驗,所以是首選的解決方案。但是,目前僅安卓系統手機(Android)支援一鍵自動填寫按鈕,並且此類按鈕需要更改您應用的代碼,才能執行“握手”,另外還需要更改應用的簽名密鑰雜湊值。請參閱下方握手應用簽名密鑰雜湊值部分。

最佳實務

  • 在發送單次密碼或驗證碼前,先確認使用者的WhatsApp電話號碼,再向該號碼發送單次密碼或驗證碼。

  • 明確告知使用者,單次密碼或驗證碼將發送至他們的WhatsApp電話號碼,尤其是當您為使用者提供多種方式來接收單次密碼或驗證碼時。

  • 當使用者將單次密碼或驗證碼粘貼到您的應用中時,或應用在一鍵自動填寫按鈕流程中收到單次密碼或驗證碼時,請明確告知使用者應用已擷取單次密碼或驗證碼。

參數說明

參數名

描述

樣本值

COMPONENTS

該數組包含描述模板內容和中繼資料的單個對象。

-

LANGUAGE

模板的語言代碼

en_US

NAME

模板的名稱。

僅支援小寫字母、底線、數字。

名稱長度不超過60個字元。

verification_code

WHATSAPP_BUSINESS_ACCOUNT_ID

要與模板關聯的WABA ID。

106***********06

ADD_SECURITY_RECOMMENDATION

可選。

布爾值。

如需在模板中加入以下字串,請將此預留位置設為true:為安全起見,請勿共用該驗證碼。

否則,請設為false。

說明

字串內容為固定內容。

true

CODE_EXPIRATION_MINUTES

可選。

整數。

表示單次密碼或驗證碼的有效期間(以分鐘為單位)。

如果忽略此預留位置,則發送的訊息不會顯示單次密碼或驗證碼的到期警告。

最小值為1,最大值為90。

5

COPY_CODE_BUTTON_TEXT

字串。

複製驗證碼按鈕的文本。

重要

即使模板使用一鍵自動填寫按鈕,您仍須提供此值。如果我們無法驗證您的握手,身分識別驗證模板訊息會顯示一個包含此文本的複製驗證碼按鈕。

不超過 25 個字元。

Copy Code

ONE_TAP_BUTTON_TEXT

僅適用於一鍵自動填寫按鈕。

字串。

一鍵自動填寫按鈕的文本。

不超過 25 個字元。

Autofill

OTP_TYPE

枚舉。

表示按鈕類型。

如需讓模板使用複製驗證碼按鈕,請將此預留位置設為 COPY_CODE;

如需讓模板使用一鍵自動填寫按鈕,則設為 ONE_TAP。

請參閱上方按鈕部分。

ONE_TAP

PACKAGE_NAME

Android應用的應用程式套件名。

com.example.myapplication

SIGNATURE_HASH

應用簽名密鑰雜湊值。

請參閱下方應用簽名密鑰雜湊值

K8a%2FAINcGX7

應用簽名密鑰雜湊值

如要建立使用一鍵自動填寫按鈕的身分識別驗證模板,您必須在components數組中加入應用簽名密鑰雜湊值。

如要計算您的雜湊值,請遵循Google有關計算應用的雜湊字串的說明。

或者,如果您按照Google說明下載了應用簽名密鑰認證,您可以結合使用該認證和sms_retriever_hash_v9.sh shell指令碼來計算雜湊值。

握手

如果您應用中的使用者請求擷取單次密碼或驗證碼,並選擇將其發送到他們的WhatsApp電話號碼,您首先應執行“握手”,然後調用我們的API來發送身分識別驗證模板訊息。在收到該訊息後,WhatsApp應用將執行資格檢查。如果沒有錯誤,WhatsApp將啟動意圖並向使用者顯示該訊息。最後,當使用者點擊該訊息的一鍵自動填寫按鈕時,WhatsApp應用會自動載入您的應用並向傳遞單次密碼或驗證碼。

說明

如果您在發送訊息之前不執行“握手”,或訊息未通過資格檢查,則發送的訊息將顯示複製驗證碼按鈕(Copy code),而不是一鍵自動填寫按鈕(Autofill)。

資格檢查

在收到身分識別驗證模板訊息之後,WhatsApp應用會執行以下檢查。如果任意檢查失敗,一鍵自動填寫按鈕將被替換為複製驗證碼按鈕。

  • “握手”是在發送訊息前的10分鐘內發起。

  • 訊息中的應用程式套件名(建立模板時在components數組的package_name屬性中定義)與意圖上設定的應用程式套件名匹配。WhatsApp應用將使用您的應用程式提供的PendingIntent對象中調用的getCreatorPackage方法判斷專案包名稱是否匹配。

  • 訊息中的應用簽名密鑰雜湊值(建立模板時在components數組的signature_hash屬性中定義)與您所安裝應用的簽名密鑰雜湊值匹配。

  • 訊息包含一鍵自動填寫按鈕的文本。

  • 您的應用已定義用於接收單次密碼或驗證碼的活動。請參閱下方活動(Activity)部分。

Android通知

僅在以下情況下,表示已收到WhatsApp身分識別驗證模板訊息的Android通知才會顯示在使用者的Android裝置上:

  • 使用者使用所發送訊息的接收電話號碼(賬戶)登入WhatsApp應用。

  • 使用者登入您的應用。

  • Android作業系統是 KitKat(Android 4.4,API 19)或更高版本。

  • WhatsApp應用已啟用顯示通知(設定>通知)。

  • 已為WhatsApp應用啟用裝置層級通知。

  • 在WhatsApp應用中,使用者與您的企業之間過去的訊息對話未設為靜音。

用戶端實現

在您的應用中實現以下活動(activity)和類(class)。

活動(Activity)

聲明可接收單次密碼或驗證碼的活動和意圖篩選條件。意圖篩選條件必須具有操作名稱 com.whatsapp.otp.OTP_RETRIEVED。

在收到身分識別驗證模板訊息(且該訊息已通過所有資格檢查)後,WhatsApp應用將立即開始執行此活動。

公用類(Public Class)

定義在單次密碼或驗證碼傳遞到您的應用後,可接受該單次密碼或驗證碼的活動公用類。

發起“握手”

以下樣本展示了使用WhatsApp應用發起“握手”的一種方法。

public void sendOtpIntentToWhatsApp() {
   // Send OTP_REQUESTED intent to both WA and WA Business App
   sendOtpIntentToWhatsApp("com.whatsapp");
   sendOtpIntentToWhatsApp("com.whatsapp.w4b");
}

private void sendOtpIntentToWhatsApp(String packageName) {

  /**
  * Starting with Build.VERSION_CODES.S, it will be required to explicitly 
  * specify the mutability of  PendingIntents on creation with either 
  * (@link #FLAG_IMMUTABLE} or FLAG_MUTABLE
  */
  int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? FLAG_IMMUTABLE : 0;
  PendingIntent pi = PendingIntent.getActivity(
      getApplicationContext(), 
      0, 
      new Intent(), 
      flags);


  // Send OTP_REQUESTED intent to WhatsApp
  Intent intentToWhatsApp = new Intent();
  intentToWhatsApp.setPackage(packageName);
  intentToWhatsApp.setAction("com.whatsapp.otp.OTP_REQUESTED");
  // WA will use this to verify the identity of the caller app.
  Bundle extras = intentToWhatsApp.getExtras();
  if (extras == null) {
     extras = new Bundle();
  }
  extras.putParcelable("_ci_", pi);
  intentToWhatsApp.putExtras(extras);
  getApplicationContext().sendBroadcast(intentToWhatsApp);
}

錯誤訊號

如果您的訊息未通過WhatsApp的任意一項資格檢查,一鍵自動填寫按鈕將被替換為複製驗證碼按鈕。此外,還可能有裝置、WhatsApp應用設定阻止訊息通知。為協助調試,WhatsApp應用會通過傳遞com.whatsapp.OTP_ERROR意圖來顯示一些錯誤資訊。在這種情況下,您將收到錯誤密鑰和訊息,而不是使用者的單次密碼或驗證碼。

請注意,其中某些錯誤訊號只有在Android模擬器中運行WhatsApp應用時才會出現。

描述

incompatible_os_version

Android 版本不相容。

如果發起“握手”(發送 com.whatsapp.otp.OTP_REQUESTED 意圖),但裝置所啟動並執行 Android 版本低於 v19,則會出現此情況。

incorrect_signature_hash

說明

僅限模擬器

簽名雜湊不正確。

如果發起“握手”(發送 com.whatsapp.otp.OTP_REQUESTED 意圖),並且WhatsApp應用收到使用一鍵自動填寫按鈕的身分識別驗證模板訊息,而訊息中的包名未產生訊息的簽名雜湊,則會出現此情況。

missing_handshake_or_disorder

缺少“握手”/操作指令。

如果WhatsApp應用收到帶有一鍵自動填寫按鈕的身分識別驗證模板訊息,但未發起“握手”,則會出現此情況。

otp_request_expired

單次密碼請求到期。

如果使用一鍵自動填寫按鈕的身分識別驗證模板已送達使用者,但此時距您發起握手已超過 10 分鐘,則會出現此情況。在此情況下,會改為顯示複製驗證碼按鈕。

whatsapp_message_notification_disabled

說明

僅限模擬器

WhatsApp應用中設定了禁用訊息通知。

如果發起“握手”(發送 com.whatsapp.otp.OTP_REQUESTED 意圖),但使用者已在WhatsApp應用中停用通知,則會出現此情況。

whatsapp_notification_disabled

說明

僅限模擬器

已在裝置層級禁用WhatsApp通知。

如果發起“握手”(發送 com.whatsapp.otp.OTP_REQUESTED 意圖),但使用者已在WhatsApp(裝置層級設定)中禁用應用通知,則會出現此情況。

整合

錯誤訊號通過廣播意圖送達,因此必須運行BroadcastReceiver才能收到錯誤訊號。

使用 manifest.xml

<receiver
 android:name=".app.otp.OtpErrorReceiver"
 android:enabled="true"
 android:exported="true" >
   <intent-filter>
       <action android:name="com.whatsapp.otp.OTP_ERROR"/>
   </intent-filter>
</receiver>

使用接收器類

<![CDATA[ public class OtpErrorReceiver extends BroadcastReceiver { public static final String OTP_ERROR_KEY = "error"; public static final String OTP_ERROR_MESSAGE_KEY = "error_message"; @Override public void onReceive(Context context, Intent intent) { try { PendingIntent pendingIntent = intent.getParcelableExtra("_ci_"); if (pendingIntent != null) { String packageName = pendingIntent.getCreatorPackage(); if (packageName.equalsIgnoreCase("com.whatsapp") || packageName.equalsIgnoreCase("com.whatsapp.w4b")) { String otpErrorKey = intent.getStringExtra(OTP_ERROR_KEY);String otpErrorMessage = intent.getStringExtra(OTP_ERROR_MESSAGE_KEY); // Handle errors } } } catch (BadParcelableException e) { Log.e("OtpErrorReceiver", e.getLocalizedMessage()); } } } ]]>

應用樣本

請訪問Github網站,參閱適用於Android平台的WhatsApp單次密碼 (OTP) 應用樣本。該應用樣本展示了如何通過 API 發送和接收單次密碼和驗證碼、如何整合一鍵自動填寫按鈕和複製驗證碼按鈕、如何建立模板以及如何啟動樣本伺服器。