Xử lý lỗi xác minh số điện thoại Firebase trên Android

Khi lệnh gọi đến thư viện Firebase PNV không thành công, thư viện sẽ báo cáo FirebasePhoneNumberVerificationException. Trang này liệt kê mọi mã lỗi mà ngoại lệ có thể mang theo, thời điểm xảy ra từng mã lỗi và những việc ứng dụng của bạn nên làm.

Trang này giả định rằng bạn đã tích hợp Firebase PNV như mô tả trong phần Bắt đầu sử dụng Firebase Phone Number Verification trên Android.

Cách báo cáo lỗi

  • Các phương thức không đồng bộ (getVerificationSupportInfo(), getVerifiedPhoneNumber() và các phương thức quy trình tuỳ chỉnh) trả về một Task. Khi các lệnh này không thành công, Task sẽ không thành công kèm theo FirebasePhoneNumberVerificationException mà bạn nhận được trong addOnFailureListener.

  • enableTestSession() có tính đồng bộ. Thao tác này sẽ trực tiếp tạo một FirebasePhoneNumberVerificationException.

Đọc errorCode của ngoại lệ để tìm hiểu xem có vấn đề gì. Mã Firebase PNV là hằng số trong lớp FirebasePnvStatusCodes. Nếu lỗi là do Dịch vụ Google Play, thì errorCode cũng có thể là một giá trị CommonStatusCodes, chẳng hạn như NETWORK_ERROR.

Thiết bị hoặc SIM không được hỗ trợ không phải là lỗi. getVerificationSupportInfo() thành công và báo cáo isSupported() là false cho SIM đó, còn getReason() cho bạn biết lý do. Xem Thiết bị và SIM không được hỗ trợ.

Mã lỗi

Thiết lập phiên kiểm thử

enableTestSession() sẽ gửi các lỗi này một cách đồng bộ.

Mã lỗi Nguyên nhân Hành động được đề xuất
TEST_SESSION_ALREADY_ENABLED
(55508)
enableTestSession() đã được gọi nhiều lần trong cùng một quy trình ứng dụng. FirebasePhoneNumberVerification.getInstance() trả về cùng một thực thể mỗi lần, vì vậy, điều này cũng xảy ra khi một Activity gọi nó được tạo lại. Gọi enableTestSession() một lần cho mỗi quy trình, ví dụ: trong Application.onCreate(). Xem phần Khởi chạy thư viện ở chế độ thử nghiệm.
INVALID_TEST_NUMBER_ID
(55507)
Mã thông báo kiểm thử được truyền đến enableTestSession() đang trống. Đảm bảo bản dựng của bạn truyền mã thông báo mà bạn đã tạo trong bảng điều khiển Firebase và chỉ gọi enableTestSession() khi mã thông báo không trống.

Xác minh

Những lỗi này khiến Task do getVerifiedPhoneNumber() trả về không thành công.

Mã lỗi Nguyên nhân Hành động được đề xuất
CREDENTIAL_MANAGER_ERROR
(55506)
Trình quản lý thông tin xác thực Android không trả về số điện thoại. Nếu cause của ngoại lệ là GetCredentialCancellationException, thì nhiều khả năng người dùng đã đóng màn hình xin phép. Cung cấp một cách khác để xác minh số điện thoại, chẳng hạn như qua tin nhắn SMS. Đừng thử lại tự động vì người dùng sẽ thấy lại màn hình xin phép.
CARRIER_NOT_SUPPORTED
(55501)
Nhà mạng của SIM đã chọn không được hỗ trợ hoặc thiết bị không có thông tin gói thuê bao cần thiết để xác minh SIM đó. Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS.
UNSUPPORTED_OPERATION
(55505)
Firebase PNV không dùng được cho yêu cầu này trên thiết bị. Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS.
PREFLIGHT_CHECK_FAILED
(55504)
Phần phụ trợ Firebase PNV không thể tạo yêu cầu xác minh trước khi màn hình xin phép được hiển thị. Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS. Nếu lỗi này xảy ra với mọi yêu cầu, hãy kiểm tra để đảm bảo rằng ứng dụng của bạn được thiết lập đúng cách (xem phần Nâng cấp lên chế độ sản xuất).
INTEGRITY_CHECK_FAILED
(55503)
Thiết bị hoặc ứng dụng không vượt qua được quy trình kiểm tra tính toàn vẹn. Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
Không thể đọc phản hồi từ Trình quản lý thông tin xác thực hoặc không thể đổi lấy số điện thoại đã xác minh. Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS.
INVALID_TEST_NUMBER_ID
(55507)
Ở chế độ thử nghiệm, phần phụ trợ Firebase PNV đã từ chối mã thông báo thử nghiệm, ví dụ: vì mã thông báo đã hết hạn. Mã thông báo thử nghiệm có TTL là 7 ngày. Mã thông báo thử nghiệm bị từ chối thường báo cáo mã này; nếu bạn thấy các lỗi khác ở chế độ thử nghiệm, hãy kiểm tra để đảm bảo mã thông báo của bạn là mã thông báo hiện tại. Tạo mã thông báo kiểm thử mới trong bảng điều khiển Firebase rồi tạo lại ứng dụng.
ACTIVITY_CONTEXT_REQUIRED
(55509)
Context được truyền đến getVerifiedPhoneNumber() không phải là Activity. Phương thức này cần có một Activity để hiển thị màn hình xin phép. Truyền Activity hiện tại. Đây là lỗi trong ứng dụng của bạn, không phải là điều kiện để xử lý trong thời gian chạy.

Kiểm tra khả năng hỗ trợ

Task do getVerificationSupportInfo() trả về chỉ không thành công nếu bản thân quy trình kiểm tra không thể chạy. Trong trường hợp đó, errorCode là giá trị CommonStatusCodes của Dịch vụ Google Play hoặc CARRIER_NOT_SUPPORTED. Coi thiết bị là không được hỗ trợ và quay lại một phương thức xác minh khác, chẳng hạn như SMS.

Khi một phiên kiểm thử được bật, getVerificationSupportInfo() sẽ không liên hệ với phần phụ trợ Firebase PNV và luôn báo cáo SIM kiểm thử là được hỗ trợ, ngay cả khi mã thông báo kiểm thử đã hết hạn.

Quy trình tuỳ chỉnh

Nếu bạn sử dụng quy trình tuỳ chỉnh thay vì getVerifiedPhoneNumber():

  • getDigitalCredentialPayload() không thành công với PREFLIGHT_CHECK_FAILED hoặc với INVALID_TEST_NUMBER_ID nếu phần phụ trợ từ chối mã thông báo kiểm thử của bạn.
  • exchangeCredentialResponseForPhoneNumber() không thành công với INVALID_DIGITAL_CREDENTIAL_RESPONSE hoặc với INVALID_TEST_NUMBER_ID nếu phần phụ trợ từ chối mã thông báo kiểm thử của bạn.
  • Lệnh gọi của riêng bạn đến Trình quản lý thông tin xác thực sẽ gửi một GetCredentialException mà bạn xử lý trực tiếp.

Thiết bị và SIM không được hỗ trợ

Khi isSupported() là false cho một SIM, getReason() sẽ trả về một trong các giá trị VerificationSupportStatus sau:

Giá trị Ý nghĩa
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED Nhà mạng của SIM không được hỗ trợ. Xem Nhà mạng được hỗ trợ.
INCAPABLE_DUE_TO_ANDROID_VERSION Thiết bị chạy phiên bản Android cũ hơn Android 9 (cấp độ API 28).
INCAPABLE_DUE_TO_SIM_STATE SIM chưa sẵn sàng. SIM bị khoá hoặc vẫn đang tải cũng có thể báo cáo INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, vì nhà mạng được kiểm tra trước tiên.

Trong mỗi trường hợp, hãy sử dụng một phương thức xác minh khác, chẳng hạn như SMS, cho SIM đó.

Ví dụ

Ví dụ sau đây xử lý các lỗi mà một ứng dụng thông thường cần phân biệt khi gọi getVerifiedPhoneNumber():

Kotlin

import android.util.Log
// Credential Manager is included with the Firebase PNV library.
import androidx.credentials.exceptions.GetCredentialCancellationException
import com.google.firebase.pnv.FirebasePhoneNumberVerification
import com.google.firebase.pnv.FirebasePhoneNumberVerificationException
import com.google.firebase.pnv.FirebasePnvStatusCodes

private const val TAG = "PhoneVerification"

// In your Activity:
private fun verifyPhoneNumber() {
    FirebasePhoneNumberVerification.getInstance()
        .getVerifiedPhoneNumber(this)
        .addOnSuccessListener { result ->
            // Send result.getToken() to your backend.
        }
        .addOnFailureListener { e -> handleFpnvError(e) }
}

private fun handleFpnvError(e: Exception) {
    if (e !is FirebasePhoneNumberVerificationException) {
        Log.w(TAG, "Firebase PNV failed", e)
        showSmsVerification()
        return
    }
    when (e.errorCode) {
        FirebasePnvStatusCodes.CREDENTIAL_MANAGER_ERROR -> {
            if (e.cause is GetCredentialCancellationException) {
                // The user dismissed the consent screen.
            }
            showSmsVerification()
        }
        FirebasePnvStatusCodes.INVALID_TEST_NUMBER_ID -> {
            // Test mode only: generate a new test token.
            Log.e(TAG, "Firebase PNV test token rejected", e)
        }
        FirebasePnvStatusCodes.ACTIVITY_CONTEXT_REQUIRED -> {
            // App bug: pass an Activity to getVerifiedPhoneNumber().
            Log.e(TAG, "Firebase PNV needs an Activity context", e)
        }
        else -> {
            // Carrier not supported, network errors, and other failures.
            Log.w(TAG, "Firebase PNV failed with error code ${e.errorCode}", e)
            showSmsVerification()
        }
    }
}

Trong ví dụ này, showSmsVerification() là quy trình xác minh số điện thoại hiện có của ứng dụng.

Các bước tiếp theo