Шаблоны аутентификации без касания | Документация для разработчиков
Шаблоны аутентификации без касания
Обновлено: 6 февраля 2026 г
Предстоящее устаревание: начиная с 15 апреля 2026 года ,
PendingIntent для шаблонов аутентификации будет признан устаревшим. Если вы в настоящее время используете PendingIntent для инициирования установления соединения или проверки подлинности приложения, предпочтительным способом перехода является использование OTP Android SDK Шаблоны аутентификации без касания позволяют вашим пользователям получать одноразовые пароли или коды через WhatsApp, не покидая ваше приложение.
Когда пользователь в вашем приложении запрашивает пароль или код, и вы предоставляете его, используя шаблон аутентификации без касания, клиент WhatsApp просто передает указанный пароль или код, и ваше приложение может немедленно перехватить его с помощью приемника широковещательных сообщений.
С точки зрения пользователя, он запрашивает пароль или код в вашем приложении, и он автоматически отображается в приложении. Если пользователь приложения проверит сообщение в клиенте WhatsApp, он увидит только сообщение со стандартным фиксированным текстом: <код> — ваш код подтверждения.
Подобно шаблонам аутентификации с кнопкой автозаполнения в одно касание, когда клиент WhatsApp получает сообщение-шаблон, содержащее пароль или код пользователя, мы выполняем ряд проверок на соответствие требованиям. Если сообщение не проходит эту проверку и мы не можем передать пароль или код, в сообщении отобразится либо кнопка автозаполнения в одно касание, либо кнопка копирования кода. По этой причине при создании шаблона аутентификации без необходимости касания необходимо включить кнопку автозаполнения в одно касание и кнопку копирования кода в тело сообщения, даже если пользователь никогда не увидит одну из этих кнопок.
Примечание: В Android SDK OTP представлен упрощенный рабочий процесс для реализации шаблонов аутентификации в одно касание и без касаний. Ниже вы можете узнать, как его использовать.
Ограничения
Функция аутентификации без касания поддерживается только на Android. Если вы отправите шаблон аутентификации без касания пользователю WhatsApp, использующему устройство, отличное от Android, клиент WhatsApp отобразит вместо этого кнопку «Копировать код».
URL-адреса, медиафайлы и эмодзи не поддерживаются.
Передовые методы
Вот несколько примеров, которые наглядно демонстрируют пользователю приложения, что его код автоматически появится в приложении. 

Хэш ключа подписи приложения
В текст сообщения необходимо включить хэш ключа подписи вашего приложения.
Чтобы вычислить хеш, следуйте инструкциям Google по - строки вашего приложения .
В качестве альтернативы, если вы будете следовать инструкциям Google и загрузите сертификат ключа подписи вашего приложения (шаг 1), вы сможете использовать свой сертификат со оболочки sms_retriever_hash_v9.sh для вычисления хеша. Например:
./sms_retriever_hash_v9.sh --package "com.example.myapplication" --keystore ~/.android/debug.keystore
Поддерживаемые приложения
Массив
supported_apps позволяет задавать пары имен пакетов приложений и хешей ключей подписи для до 5 приложений. Это может быть полезно, если у вас есть разные сборки приложений, и вы хотите, чтобы каждая из них могла инициировать рукопожатие:В качестве альтернативы, если вы используете Graph API версии 20.0 или более старой и у вас только одно приложение, вы можете определить имя пакета приложения и хэш ключа подписи в качестве
buttons , но это не рекомендуется, поскольку мы прекратим поддержку этого метода начиная с версии 21.0:Рукопожатие
Проверка соответствия требованиям
code_expiration_minutespackage_nameкомпонентыgetCreatorPackagePendingIntentsignature_hashУведомления Android
Использование SDK
зависимости { … реализация 'com.whatsapp.otp:whatsapp-otp-android-sdk:1.0.0' … }
mavenCentral()репозитории { … mavenCentral() … }
Приемник вещания без отвода
<receiver android:name=".app.receiver.OtpCodeReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.whatsapp.otp.OTP_RETRIEVED" /> </intent-filter> </receiver>
Класс приемника без отвода
BroadcastReceiveronReceiveWhatsAppOtpIncomingIntentHandler.processOtpCode()public class OtpCodeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { WhatsAppOtpIncomingIntentHandler whatsAppOtpIncomingIntentHandler = new WhatsAppOtpIncomingIntentHandler(); // Получаем ожидаемый идентификатор рукопожатия, сохраненный во время инициации рукопожатия String expectedHandshakeId = retrieveStoredHandshakeId(); whatsAppOtpIncomingIntentHandler.processOtpCode(intent, expectedHandshakeId, (code) -> { // Идентификатор рукопожатия проверен SDK validateCode(code); }, // вызываем вашу функцию для обработки ошибок (error, exception) -> handleError(error, exception)); } }
Без SDK
request_idpublic class OtpCodeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String incomingRequestId = intent.getStringExtra("request_id"); // Получаем ранее сохраненный ID рукопожатия String storedRequestId = retrieveStoredRequestId(); // Проверяем совпадение ID рукопожатия if (storedRequestId != null && storedRequestId.equals(incomingRequestId)) { // используем OTP-код String otpCode = intent.getStringExtra("code"); // ... } } }
Активность кнопки автозаполнения одним нажатием
com.whatsapp.otp.OTP_RETRIEVED<activity android:name=".ReceiveCodeActivity" android:enabled="true" android:exported="true" android:launchMode="standard"> <intent-filter> <action android:name="com.whatsapp.otp.OTP_RETRIEVED" /> </intent-filter> </activity>
Класс активности кнопки автозаполнения в одно касание
request_idpublic class ReceiveCodeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); // Извлекаем ID подтверждения из интента String incomingRequestId = intent.getStringExtra("request_id"); // Получаем ранее сохраненный ID подтверждения String storedRequestId = retrieveStoredRequestId(); // Проверяем совпадение ID подтверждения if (storedRequestId != null && storedRequestId.equals(incomingRequestId)) { // используем OTP-код String otpCode = intent.getStringExtra("code"); // ... } } }
Начало рукопожатия
Использование SDK
WhatsAppOtpHandler.sendOtpIntentToWhatsApp()WhatsAppOtpHandler whatsAppOtpHandler = new WhatsAppOtpHandler(); UUID handshakeId = whatsAppOtpHandler.sendOtpIntentToWhatsApp(context); // Сохраняем handshakeId для последующей проверки полученного OTP-кода
Без SDK
request_idprivate String currentRequestId; public void sendOtpIntentToWhatsApp() { // Генерируем уникальный идентификатор рукопожатия currentRequestId = UUID.randomUUID().toString(); // Сохраняем этот идентификатор для последующей проверки при получении OTP storeRequestId(currentRequestId); // Отправляем интент OTP_REQUESTED в WhatsApp и WhatsApp Business App sendOtpIntentToWhatsApp("com.whatsapp", currentRequestId); sendOtpIntentToWhatsApp("com.whatsapp.w4b", currentRequestId); } private void sendOtpIntentToWhatsApp(String packageName, String requestId) { /** * Начиная с Build.VERSION_CODES.S, потребуется явно * указать изменяемость PendingIntents при создании либо с помощью * (@link #FLAG_IMMUTABLE}, либо FLAG_MUTABLE */ int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? FLAG_IMMUTABLE : 0; PendingIntent pi = PendingIntent.getActivity( getApplicationContext(), 0, new Intent(), flags); // Отправить интент OTP_REQUESTED в WhatsApp Intent intentToWhatsApp = new Intent(); intentToWhatsApp.setPackage(packageName); intentToWhatsApp.setAction("com.whatsapp.otp.OTP_REQUESTED"); // WhatsApp будет использовать это для проверки личности вызывающего приложения. Bundle extras = intentToWhatsApp.getExtras(); if (extras == null) { extras = new Bundle(); } extras.putParcelable("_ci_", pi); // Добавляем идентификатор рукопожатия для безопасной проверки intentToWhatsApp.putExtra("request_id", requestId); intentToWhatsApp.putExtras(extras); getApplicationContext().sendBroadcast(intentToWhatsApp); }
Проверка наличия установленного WhatsApp
AndroidManifest.xml<queries> <package android:name="com.whatsapp"/> <package android:name="com.whatsapp.w4b"/> </queries>
WhatsAppOtpHandlerWhatsAppOtpHandler whatAppOtpHandler = new WhatsAppOtpHandler();
.isWhatsAppInstalled()ЕслиЕсли (whatsAppOtpHandler.isWhatsAppInstalled(context)) { // ... сделать что-нибудь }
сигналы ошибок
См. раздел «Сигналы ошибок» , который может помочь в отладке.
Коды ошибок идентификации рукопожатия
При использовании SDK с проверкой идентификатора подтверждения могут возвращаться следующие коды ошибок:
| Код ошибки | Описание |
|---|---|
HANDSHAKE_ID_MISSING |
Идентификатор подтверждения рукопожатия не был включен в Intent от WhatsApp |
HANDSHAKE_ID_INVALID_FORMAT |
Идентификатор подтверждения соединения не является допустимым форматом UUID |
HANDSHAKE_ID_MISMATCH |
Идентификатор подтверждения в намерении не соответствует ожидаемому значению |