Xử lý lỗi trong React Native SDK
Mỗi lỗi được SDK trả về đều có kiểu AdaptyErrorCode. Dưới đây là một ví dụ:
Bật verbose logs trước khi debug. Hầu hết các AdaptyError đều bọc một lỗi bên dưới từ StoreKit, Play Billing, network, hoặc backend. Khi bật verbose logs (adapty.setLogLevel('verbose') — xem phần Logging cho React Native thuần hoặc Expo), lỗi bọc đó sẽ được in ra console, thường cho bạn biết nguyên nhân thực sự.
Nếu các giải pháp này không giải quyết được vấn đề của bạn, hãy xem phần Các vấn đề khác để biết các bước cần thực hiện trước khi liên hệ hỗ trợ, giúp chúng tôi hỗ trợ bạn hiệu quả hơn.
try {
const params: MakePurchaseParamsInput = {};
await adapty.makePurchase(product, params);
} catch (error) {
if (
error instanceof AdaptyError &&
error.adaptyCode === getErrorCode('cantMakePayments')
) {
// In-app purchases are not allowed on this device
}
}
error.adaptyCode là một số, vì vậy hãy so sánh nó với một số: có thể là giá trị trực tiếp (1003) hoặc kết quả của getErrorCode('<name>'). ErrorCode ánh xạ theo chiều ngược lại — từ số sang tên — nên hãy dùng nó để ghi log, không phải để so sánh.
Giao dịch bị người dùng hủy không phải là lỗi. makePurchase trả về một AdaptyPurchaseResult có type là 'user_cancelled' — xem Thực hiện mua hàng.
Mã StoreKit hệ thống
| Lỗi | Mã | Giải pháp |
|---|---|---|
| unknown | 0 | Mã lỗi cho biết đã xảy ra lỗi không xác định hoặc bất ngờ. Thử lại hoặc xem phần Các vấn đề khác. |
| clientInvalid | 1 | Mã lỗi này cho biết client không được phép thực hiện hành động đang thử. |
| paymentCancelled | 2 | 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 thêm hành động nào, nhưng về mặt logic kinh doanh, bạn có thể đề nghị giảm giá cho người dùng hoặc nhắc nhở họ sau. |
| paymentInvalid | 3 | Lỗi này cho biết một trong các tham số thanh toán không được App Store nhận dạng. |
| paymentNotAllowed | 4 | Mã lỗi này cho biết người dùng không được phép ủy quyền thanh toán. |
| storeProductNotAvailable | 5 | Mã lỗi này cho biết sản phẩm được yêu cầu không có sẵn trong cửa hàng. Thử cài đặt lại ứng dụng. |
| cloudServicePermissionDenied | 6 | Mã 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. |
| cloudServiceNetworkConnectionFailed | 7 | Mã lỗi này cho biết thiết bị không thể kết nối mạng. |
| cloudServiceRevoked | 8 | Mã 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. |
| privacyAcknowledgementRequired | 9 | Mã lỗi này cho biết người dùng chưa xác nhận chính sách quyền riêng tư của Apple. |
| unauthorizedRequestData | 10 | Mã lỗi này cho biết ứng dụng đang cố sử dụng một thuộc tính mà nó không có quyền hạn cần thiết. |
| invalidOfferIdentifier | 11 |
Hãy đảm bảo bạn đã thiết lập các ưu đãi mong muốn trong AppStore Connect và truyền vào một offer identifier hợp lệ. |
| invalidSignature | 12 | Mã lỗi này cho biết chữ ký trong payment discount không hợp lệ. |
| missingOfferParams | 13 | Mã lỗi này cho biết thiếu các tham số trong payment discount. |
| invalidOfferPrice | 14 | Mã lỗi này cho biết giá bạn đã chỉ định trong App Store Connect không còn hợp lệ. Các ưu đãi phải luôn thể hiện mức giá được giảm. |
Mã Android tùy chỉnh
| Lỗi | Mã | Giải pháp |
|---|---|---|
| adaptyNotInitialized | 20 | Bạn cần cấu hình Adapty SDK đúng cách bằng phương thức Adapty.activate. Tìm hiểu cách thực hiện cho React Native. |
| productNotFound | 22 | Lỗ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. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | Không tìm thấy gói đăng ký gốc cần được gia hạn. |
| billingServiceTimeout | 97 | Lỗi này cho biết yêu cầu đã vượt quá thời gian chờ tối đa trước khi Google Play có thể phản hồi. Nguyên nhân có thể là do sự chậm trễ trong việc thực thi hành động được yêu cầu bởi lệnh gọi Play Billing Library. |
| featureNotSupported | 98 | Tính năng được yêu cầu không được Play Store hỗ trợ trên thiết bị hiện tại. |
| billingServiceDisconnected | 99 | Lỗi nghiêm trọng này cho biết kết nối của ứng dụng khách đến dịch vụ Google Play Store thông qua BillingClient đã bị ngắt. |
| billingServiceUnavailable | 102 | Lỗ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ị của người dùng và dịch vụ Google Play Billing. |
| billingUnavailable | 103 | 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. Một số ví dụ 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 đang ở 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ọ đã tắt tính năng mua hà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. |
| developerError | 105 | Đây là lỗi nghiêm trọng cho biết bạn đang sử dụng API không đúng cách. |
| billingError | 106 | Đây là lỗi nghiêm trọng cho biết có vấn đề nội bộ với chính Google Play. |
| itemAlreadyOwned | 107 | Sản phẩm consumable này đã được mua trước đó. |
| itemNotOwned | 108 | Lỗi này cho biết hành động được yêu cầu trên mặt hàng đã thất bại. |
| billingNetworkError | 112 | Lỗi này cho biết đã xảy ra sự cố với kết nối mạng giữa thiết bị và hệ thống Play. |
Mã StoreKit tùy chỉnh
| Lỗi | Mã | Giải pháp |
|---|---|---|
| noProductIDsFound | 1000 | Lỗi này cho biết không có sản phẩm nào bạn yêu cầu trên paywall có thể mua được trong App Store, dù chúng đã được liệt kê ở đó. Lỗi này đôi khi đi kèm cảnh báo Nếu gặp lỗi này, hãy làm theo các bước trong phần Fix for Code-1000 |
| productRequestFailed | 1002 | Không thể tải danh sách sản phẩm hiện tại. Nguyên nhân có thể là: - Chưa có cache nào được tạo và đồng thời không có kết nối internet. |
| cantMakePayments | 1003 | In-App purchase không được phép trên thiết bị này. Xem hướng dẫn khắc phục sự cố. |
| noPurchasesToRestore | 1004 | Không còn dùng trong Adapty React Native SDK 4.0.3: restorePurchases() không còn trả về lỗi này nữa. Khi không có gì để khôi phục, phương thức sẽ trả về hồ sơ người dùng hiện tại, vì vậy hãy kiểm tra trạng thái mức độ truy cập trong đó. Ở các phiên bản SDK cũ hơn, lỗi này cho biết Google Play không tìm thấy giao dịch mua cần khôi phục. |
| cantReadReceipt | 1005 | Không có receipt hợp lệ nào trên thiết bị. Điều này có thể xảy ra khi kiểm tra trong 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ể đề nghị giảm giá cho người dùng hoặc nhắc nhở họ sau. |
| productPurchaseFailed | 1006 | Mua 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 bọc (hoặc bật verbose logs để xem trong console) để biết nguyên nhân thực sự. Lỗi được bao bọc thường là một trong các mã StoreKit 0–14 trong bảng trên — phổ biến nhất là paymentCancelled, paymentInvalid, paymentNotAllowed, hoặc invalidOfferPrice. Nếu không xác định được nguyên nhân cụ thể, hãy thử với sandbox profile mới; nếu vẫn thất bại, hãy liên hệ bộ phận hỗ trợ của Apple. |
| refreshReceiptFailed | 1010 | Lỗi này cho biết receipt không được nhận. Chỉ áp dụng cho StoreKit 1. |
| receiveRestoredTransactionsFailed | 1011 | Khôi phục giao dịch mua thất bại. |
Mã mạng tùy chỉnh
| Lỗi | Mã | Giải pháp |
|---|---|---|
| notActivated | 2002 | Adapty SDK chưa được kích hoạt. Thường gặp nhất khi màn hình splash hoặc một hook UI sớm gọi các phương thức Adapty trước khi adapty.activate trả về. Triệu chứng không ổn định và có thể không tái hiện trên simulator vì thời gian chạy trên thiết bị thực khác nhau. Hãy await activate trước khi lên lịch bất kỳ lệnh gọi SDK nào khác. Xem Thứ tự gọi trong React Native SDK để biết toàn bộ trình tự. |
| badRequest | 2003 | Yêu cầu không hợp lệ. Hãy đảm bảo bạn đã hoàn thành tất cả các bước cần thiết để tích hợp với App Store. |
| serverError | 2004 | Lỗi máy chủ. Thử lại sau một thời gian. Nếu vấn đề vẫn chưa được giải quyết, hãy liên hệ với đội hỗ trợ Adapty. |
| networkFailed | 2005 | Lỗi này cho biết có vấn đề với kết nối mạng trên thiết bị của người dùng. Thử tắt VPN hoặc chuyển sang WiFi từ mạng di động hoặc ngược lại. |
| decodingFailed | 2006 | Lỗi này cho biết quá trình giải mã phản hồi thất bại. Xem lại code của bạn và đảm bảo rằng các tham số bạn gửi là hợp lệ. Ví dụ, lỗi này có thể cho biết bạn đang sử dụng API key không hợp lệ. |
| encodingFailed | 2009 | Lỗi này cho biết quá trình mã hóa yêu cầu thất bại. |
| analyticsDisabled | 3000 | Không thể xử lý các sự kiện analytics vì bạn đã tắt tính năng này. |
| wrongParam | 3001 | Lỗi này cho biết một số tham số của bạn không chính xác. Nếu bạn đang dùng Adapty paywall builder và không thể hiển thị paywall do lỗi này, hãy bật Show on device trong paywall builder. Một nguyên nhân khác có thể là phiên bản file fallback cục bộ không khớp với phiên bản SDK. Hãy tải file mới trong dashboard. |
| activateOnceError | 3005 | Không thể gọi phương thức .activate nhiều hơn một lần. |
| profileWasChanged | 3006 | Hồ sơ người dùng đã thay đổi trong quá trình thực hiện thao tác. Điều này xảy ra khi một phương thức được gọi trong khi adapty.identify vẫn đang chạy — lệnh gọi đang thực thi đó sẽ tác động lên một hồ sơ sắp bị thay thế, và SDK từ chối nó. Luôn await identify trước bất kỳ lệnh gọi hành động người dùng nào. Xem Thứ tự gọi trong React Native SDK. |
| unsupportedData | 3007 | Lỗi này cho biết định dạng dữ liệu không được SDK hỗ trợ. |
| persistingDataError | 3100 | Đã xảy ra lỗi khi lưu dữ liệu. |
| fetchTimeoutError | 3101 | Lỗi này cho biết thao tác fetch đã hết thời gian chờ. |
| operationInterrupted | 9000 | Thao tác này đã bị hệ thống ngắt. Hãy thử lại lệnh gọi. |
Các vấn đề khác
Nếu bạn vẫn chưa tìm được giải pháp, các bước tiếp theo có thể là:
- Nâng cấp SDK lên phiên bản mới nhất: Chúng tôi luôn khuyến nghị nâng cấp lên các phiên bản SDK mới nhất vì chúng ổn định hơn và bao gồm các bản sửa lỗi đã biết.
- Liên hệ đội hỗ trợ hoặc nhận trợ giúp từ các nhà phát triển khác trong diễn đàn hỗ trợ.
- Liên hệ đội hỗ trợ qua support@adapty.io hoặc qua chat: Nếu bạn chưa sẵn sàng nâng cấp SDK hoặc việc nâng cấp không giải quyết được vấn đề, hãy liên hệ đội hỗ trợ của chúng tôi. Lưu ý rằng vấn đề của bạn sẽ được giải quyết nhanh hơn nếu bạn bật verbose logging và chia sẻ logs với đội ngũ. Bạn cũng có thể đính kèm các đoạn code liên quan.