ÿÿ Xá»­ lý lá»—i trong Capacitor | Tài liệu Adapty

Xử lý lỗi trong Capacitor SDK

Má»i lá»—i được SDK trả vá» Ä‘á»u là má»™t instance cá»§a AdaptyError. Dưới đây là ví dụ:

Bật verbose logs trước khi debug. Hầu hết các AdaptyError Ä‘á»u bao bá»c má»™t lá»—i cÆ¡ bản từ StoreKit, Play Billing, mạng hoặc backend. Khi bật verbose logs (adapty.setLogLevel({ logLevel: 'verbose' }) — xem Logging), lá»—i đó sẽ được in ra console, thưá»ng cho bạn biết nguyên nhân thá»±c sá»±. Thuá»™c tính detail trên AdaptyError luôn được Ä‘iá»n bất kể mức log — verbose logs chỉ giúp hiển thị nó ra console.


try {
  const result = await adapty.makePurchase({ product });
  
  // Handle purchase result
  if (result.type === 'success') {
    console.log('Purchase successful:', result.profile);
  } else if (result.type === 'user_cancelled') {
    console.log('User cancelled the purchase');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  if (error instanceof AdaptyError) {
    console.error('Adapty error:', error.adaptyCode, error.localizedDescription);
    
    // Handle specific error codes
    switch (error.adaptyCode) {
      case ErrorCodeName.cantMakePayments:
        console.log('In-app purchases are not allowed on this device');
        break;
      case ErrorCodeName.notActivated:
        console.log('Adapty SDK is not activated');
        break;
      case ErrorCodeName.productPurchaseFailed:
        console.log('Purchase failed:', error.detail);
        break;
      default:
        console.log('Other error occurred:', error.detail);
    }
  } else {
    console.error('Non-Adapty error:', error);
  }
}

Thuộc tính của lỗi

Lớp AdaptyError cung cấp các thuộc tính sau:

Thuộc tínhKiểuMô tả
adaptyCodenumberMã lỗi dạng số (ví dụ: 1003 cho cantMakePayments)
localizedDescriptionstringThông báo lá»—i thân thiện vá»›i ngưá»i dùng
detailstring | undefinedThông tin chi tiết bổ sung vá» lá»—i (tùy chá»n)
messagestringThông báo lỗi đầy đủ bao gồm mã và mô tả

Mã lỗi

SDK xuất các hằng số và tiện ích để làm việc với mã lỗi:

Hằng số ErrorCodeName

Ãnh xạ các định danh chuá»—i sang mã số:


ErrorCodeName.cantMakePayments // 1003
ErrorCodeName.notActivated // 2002
ErrorCodeName.networkFailed // 2005

Hằng số ErrorCode

Ãnh xạ mã số sang định danh chuá»—i:


ErrorCode[1003] // 'cantMakePayments'
ErrorCode[2002] // 'notActivated'
ErrorCode[2005] // 'networkFailed'

Các hàm hỗ trợ


// Get numeric code from string name:
getErrorCode('cantMakePayments') // 1003

// Get string name from numeric code:
getErrorPrompt(1003) // 'cantMakePayments'

So sánh mã lỗi

Lưu ý quan trá»ng: error.adaptyCode là má»™t số, vì vậy hãy so sánh trá»±c tiếp vá»›i mã số:

// Option 1: Use ErrorCodeName constant (recommended) ✅
if (error.adaptyCode === ErrorCodeName.cantMakePayments) {
  console.log('Cannot make payments');
}

// Option 2: Compare with numeric literal ✅
if (error.adaptyCode === 1003) {
  console.log('Cannot make payments');
}

// NOT like this ⌠- compares number to string and will never match
if (error.adaptyCode === ErrorCode[1003]) {
}

Trình xử lý lỗi toàn cục

Bạn có thể thiết lập một trình xử lý lỗi toàn cục để bắt tất cả các lỗi từ Adapty:


// Set up global error handler
AdaptyError.onError = (error: AdaptyError) => {
  console.error('Global Adapty error:', {
    code: error.adaptyCode,
    message: error.localizedDescription,
    detail: error.detail
  });
  
  // Handle specific error types globally
  if (error.adaptyCode === ErrorCodeName.notActivated) {
    // SDK not activated - maybe retry activation
    console.log('SDK not activated, attempting to reactivate...');
  }
};

Các mẫu xử lý lỗi phổ biến

Xử lý lỗi mua hàng


async function handlePurchase(product: AdaptyPaywallProduct) {
  try {<ÿÿ/span>
    const result = await adapty.makePurchase({ product });
    
    if (result.type === 'success') {
      console.log('Purchase successful:', result.profile);
    } else if (result.type === 'user_cancelled') {
      console.log('User cancelled the purchase');
    } else if (result.type === 'pending') {
      console.log('Purchase is pending');
    }
  } catch (error) {
    if (error instanceof AdaptyError) {
      switch (error.adaptyCode) {
        case ErrorCodeName.cantMakePayments:
          console.log('In-app purchases not allowed');
          break;
        case ErrorCodeName.productPurchaseFailed:
          console.log('Purchase failed:', error.detail);
          break;
        default:
          console.error('Purchase error:', error.localizedDescription);
      }
    }
  }
}

Xử lý lỗi mạng


async function fetchFlow(placementId: string) {
  try {
    const flow = await adapty.getFlow({ placementId });
    return flow;
  } catch (error) {
    if (error instanceof AdaptyError) {
      switch (error.adaptyCode) {
        case ErrorCodeName.networkFailed:
          console.log('Network error, retrying...');
          // Implement retry logic
          break;
        case ErrorCodeName.serverError:
          console.log('Server error:', error.detail);
          break;
        case ErrorCodeName.notActivated:
          console.log('SDK not activated');
          break;
        default:
          console.error('Paywall fetch error:', error.localizedDescription);
      }
    }
    throw error;
  }
}

Mã StoreKit hệ thống

LỗiMãMô tả
unknown0Lỗi này cho biết đã xảy ra lỗi không xác định hoặc không mong muốn.
clientInvalid1Mã lỗi này cho biết client không được phép thực hiện hành động đã thử.
paymentCancelled2

Mã lá»—i này cho biết ngưá»i dùng đã há»§y yêu cầu thanh toán.

Không cần thá»±c hiện hành động nào, nhưng vá» mặt logic nghiệp vụ, bạn có thể cung cấp ưu đãi cho ngưá»i dùng hoặc nhắc nhở há» sau.

paymentInvalid3Lỗi này cho biết một trong các tham số thanh toán không được cửa hàng nhận dạng.
paymentNotAllowed4

Mã lá»—i này cho biết ngưá»i dùng không được phép á»§y quyá»n thanh toán. Nguyên nhân có thể:

- Thanh toán không được há»— trợ ở quốc gia cá»§a ngưá»i dùng.

- Ngưá»i dùng chưa đủ tuổi.

storeProductNotAvailable5Mã lỗi này cho biết sản phẩm được yêu cầu không có trên App Store. Hãy đảm bảo sản phẩm khả dụng ở quốc gia đang sử dụng.
cloudServicePermissionDenied6Mã lá»—i này cho biết ngưá»i dùng chưa cho phép truy cập thông tin dịch vụ Cloud.
cloudServiceNetworkConnectionFailed7Mã lỗi này cho biết thiết bị không thể kết nối mạng.
cloudServiceRevoked8Mã lá»—i này cho biết ngưá»i dùng đã thu hồi quyá»n sá»­ dụng dịch vụ cloud này.
privacyAcknowledgementRequired9Mã lá»—i này cho biết ngưá»i dùng chưa xác nhận chính sách bảo mật cá»§a cá»­a hàng.
unauthorizedRequestData10Mã lỗi này cho biết yêu cầu được tạo không đúng cách.
invalidOfferIdentifier11

Mã định danh ưu đãi không hợp lệ. Nguyên nhân có thể:

- Bạn chưa thiết lập ưu đãi với mã định danh đó trên App Store.

- Bạn đã thu hồi ưu đãi.

- Bạn nhập sai mã ưu đãi.

invalidSignature12Mã lá»—i này cho biết chữ ký trong ưu đãi thanh toán không hợp lệ. Hãy đảm bảo bạn đã Ä‘iá»n trưá»ng In-app purchase Key ID và tải lên tệp In-App Purchase Private Key. Tham khảo phần Cấu hình tích hợp App Store để biết thêm chi tiết.
missingOfferParams13

Lỗi này cho biết có vấn đỠvới tích hợp Adapty hoặc với các ưu đãi.

Tham khảo phần Cấu hình tích hợp App Store và Ưu đãi để biết cách thiết lập chúng.

invalidOfferPrice14Mã lỗi này cho biết giá bạn chỉ định trong cửa hàng không còn hợp lệ. Các ưu đãi luôn phải thể hiện mức giá được giảm.

Mã Android tùy chỉnh

LỗiMãMô tả
adaptyNotInitialized20Bạn cần cấu hình đúng Adapty SDK bằng phương thức Adapty.activate. Tìm hiểu cách thực hiện cho React Native.
productNotFound22Lỗi này cho biết sản phẩm được yêu cầu mua không có sẵn trong cửa hàng.
invalidJson23JSON của paywall không hợp lệ. Hãy sửa nó trong Adapty Dashboard. Tham khảo phần Tùy chỉnh paywall với remote config để biết cách khắc phục.
currentSubscriptionToUpdateNotFoundInHistory24Không tìm thấy gói đăng ký gốc cần được gia hạn.
pendingPurchase25Lỗi này cho biết trạng thái mua hàng đang ở trạng thái chỠxử lý thay vì đã mua. Tham khảo trang Xử lý giao dịch đang chỠtrong tài liệu Android Developer để biết thêm chi tiết.
billingServiceTimeout97Lá»—i này cho biết yêu cầu đã đạt đến thá»i gian chá» tối Ä‘a trước khi Google Play có thể phản hồi. Äiá»u này có thể do, ví dụ, sá»± chậm trá»… trong việc thá»±c hiện hành động được yêu cầu bởi lệnh gá»i Play Billing Library.
featureNotSupported98Tính năng được yêu cầu không được Play Store hỗ trợ trên thiết bị hiện tại.
billingServiceDisconnected99Lá»—i nghiêm trá»ng này cho biết kết nối cá»§a ứng dụng client vá»›i dịch vụ Google Play Store qua BillingClient đã bị ngắt.
billingServiceUnavailable102Lá»—i tạm thá»i này cho biết dịch vụ Google Play Billing hiện không khả dụng. Trong hầu hết các trưá»ng hợp, Ä‘iá»u này có nghÄ©a là có sá»± cố kết nối mạng ở đâu đó giữa thiết bị client và dịch vụ Google Play Billing.
billingUnavailable103

Lá»—i này cho biết đã xảy ra lá»—i thanh toán cá»§a ngưá»i dùng trong quá trình mua hàng. Ví dụ vá» khi Ä‘iá»u này có thể xảy ra:

1. Ứng dụng Play Store trên thiết bị cá»§a ngưá»i dùng đã lá»—i thá»i.

2. Ngưá»i dùng ở quốc gia không được há»— trợ.

3. Ngưá»i dùng là ngưá»i dùng doanh nghiệp và quản trị viên doanh nghiệp cá»§a hỠđã vô hiệu hóa việc mua hàng cá»§a ngưá»i dùng.

4. Google Play không thể tính phí phương thức thanh toán cá»§a ngưá»i dùng. Ví dụ, thẻ tín dụng cá»§a ngưá»i dùng có thể đã hết hạn.

5. Ngưá»i dùng chưa đăng nhập vào ứng dụng Play Store.

developerError105Äây là lá»—i nghiêm trá»ng cho biết bạn Ä‘ang sá»­ dụng API không đúng cách.
billingError106Äây là lá»—i nghiêm trá»ng cho biết có vấn đỠná»™i bá»™ vá»›i chính Google Play.
itemAlreadyOwned107Sản phẩm consumable đã được mua trước đó.
itemNotOwned108Lỗi này cho biết hành động được yêu cầu trên mặt hàng đã thất bại

Mã StoreKit tùy chỉnh

LỗiMãMô tả
noProductIDsFound1000

Lỗi này cho biết không có sản phẩm nào trong paywall khả dụng trong cửa hàng.

Nếu bạn gặp lỗi này, hãy làm theo các bước dưới đây để khắc phục:

1. Kiểm tra xem tất cả các sản phẩm đã được thêm vào Adapty Dashboard chưa.

2. Äảm bảo rằng Bundle ID cá»§a ứng dụng khá»›p vá»›i Bundle ID từ Apple Connect.

3. Xác minh rằng mã định danh sản phẩm từ các cửa hàng ứng dụng khớp với những mã bạn đã thêm vào Dashboard. Lưu ý rằng các mã định danh không nên chứa Bundle ID, trừ khi Bundle ID đã được bao gồm trong cửa hàng.

4. Xác nhận rằng trạng thái thanh toán cá»§a ứng dụng Ä‘ang hoạt động trong cài đặt thuế Apple cá»§a bạn. Äảm bảo thông tin thuế cá»§a bạn được cập nhật và chứng chỉ cá»§a bạn còn hợp lệ.

5. Kiểm tra xem tài khoản ngân hàng có được liên kết vá»›i ứng dụng hay không để ứng dụng đủ Ä‘iá»u kiện kiếm tiá»n.

6. Kiểm tra xem các sản phẩm có khả dụng ở tất cả các khu vá»±c hay không. Ngoài ra, hãy đảm bảo rằng các sản phẩm cá»§a bạn ở trạng thái “Ready to Submitâ€.

productRequestFailed1002

Không thể tải các sản phẩm khả dụng vào lúc này. Nguyên nhân có thể:

- Chưa có cache nào được tạo và đồng thá»i không có kết nối internet.

cantMakePayments1003In-app purchase không được phép trên thiết bị này.
noPurchasesToRestore1004Lỗi này cho biết Google Play không tìm thấy giao dịch mua để khôi phục.
cantReadReceipt1005

Không có biên lai hợp lệ nào trên thiết bị. Äiá»u này có thể là vấn đỠtrong quá trình kiểm tra sandbox.

Không cần thá»±c hiện hành động nào, nhưng vá» mặt logic nghiệp vụ, bạn có thể cung cấp ưu đãi cho ngưá»i dùng hoặc nhắc nhở há» sau.

productPurchaseFailed1006Mua sản phẩm thất bại. Lá»—i này bao gồm má»™t lá»—i StoreKit bên dưới — Ä‘á»c lá»—i được bao gồm (hoặc bật nhật ký chi tiết để xem nó trong console) để biết lý do thá»±c sá»±. Lá»—i được bao gồm thưá»ng là má»™t trong các mã StoreKit 0–14 trong bảng trên — thưá»ng gặp nhất là paymentCancelled, paymentInvalid, paymentNotAllowed, hoặc invalidOfferPrice. Nếu bạn không thể xác định lý do cụ thể, hãy thá»­ má»™t hồ sÆ¡ sandbox má»›i; nếu vẫn thất bại, hãy liên hệ bá»™ phận há»— trợ Apple.
refreshReceiptFailed1010Lỗi này cho biết biên lai không được nhận. Chỉ áp dụng cho StoreKit 1.
receiveRestoredTransactionsFailed1011Khôi phục giao dịch mua thất bại.

Mã mạng tùy chỉnh

LỗiMãMô tả
notActivated2002Bạn cần cấu hình đúng Adapty SDK bằng phương thức Adapty.activate. Tìm hiểu cách thực hiện cho React Native.
badRequest2003Yêu cầu không hợp lệ.
serverError2004Lỗi máy chủ.
networkFailed2005Yêu cầu mạng thất bại.
decodingFailed2006Lỗi này cho biết việc giải mã phản hồi đã thất bại.
encodingFailed2009Lỗi này cho biết việc mã hóa yêu cầu đã thất bại.
analyticsDisabled3000Chúng tôi không thể xử lý các sự kiện analytics vì bạn đã tắt tính năng này. Tham khảo phần Tích hợp Analytics để biết thêm chi tiết.
wrongParam3001Lỗi này cho biết một số tham số của bạn không đúng: để trống khi không được phép để trống hoặc sai kiểu, v.v.
activateOnceError3005Không thể gá»i phương thức .activate nhiá»u hÆ¡n má»™t lần.
profileWasChanged3006Hồ sÆ¡ ngưá»i dùng đã bị thay đổi trong quá trình thá»±c hiện thao tác.
fetchTimeoutError3101Lá»—i này có nghÄ©a là paywall không thể được tải trong giá»›i hạn thá»i gian đã đặt. Äể tránh tình huống này, hãy thiết lập paywall dá»± phòng cục bá»™.
operationInterrupted9000Thao tác này đã bị hệ thống ngắt.
ÿÿÿÿ