ÿÿ Xá»­ lý Sá»± kiện Flow - Android | Tài liệu Adapty

Xử lý sự kiện flow & paywall - Android

Hướng dẫn này đỠcập đến việc xá»­ lý sá»± kiện cho các lần mua hàng, khôi phục, chá»n sản phẩm và hiển thị flow. Bạn cÅ©ng cần triển khai xá»­ lý nút bấm (đóng flow, mở liên kết, v.v.). Xem hướng dẫn xá»­ lý hành động nút bấm cá»§a chúng tôi để biết thêm chi tiết.

Flow và paywall được cấu hình bằng Flow Builder hoặc Paywall Builder không cần thêm code để thá»±c hiện và khôi phục giao dịch mua. Tuy nhiên, chúng tạo ra má»™t số sá»± kiện mà ứng dụng cá»§a bạn có thể phản hồi. Các sá»± kiện đó bao gồm thao tác nhấn nút (nút đóng, URL, chá»n sản phẩm, v.v.) cÅ©ng như thông báo vá» các hành động liên quan đến giao dịch mua. Tìm hiểu cách phản hồi các sá»± kiện này bên dưới.

Muốn xem ví dụ thá»±c tế vá» cách tích hợp Adapty SDK vào ứng dụng di động? Hãy xem ứng dụng mẫu cá»§a chúng tôi, nÆ¡i minh há»a toàn bá»™ quá trình thiết lập, bao gồm hiển thị paywall, thá»±c hiện mua hàng và các chức năng cÆ¡ bản khác.

Nếu bạn cần kiểm soát hoặc theo dõi các quy trình diá»…n ra trên màn hình thanh toán, hãy triển khai các phương thức AdaptyFlowEventListener. Nếu bạn muốn giữ nguyên hành vi mặc định trong má»™t số trưá»ng hợp, bạn có thể extend AdaptyFlowDefaultEventListener và chỉ override những method bạn muốn thay đổi.

Dưới đây là các giá trị mặc định từ AdaptyFlowDefaultEventListener.

Sá»± kiện do ngưá»i dùng tạo ra

Chá»n sản phẩm

Nếu má»™t sản phẩm được chá»n để mua (bởi ngưá»i dùng hoặc hệ thống), phương thức này sẽ được gá»i:

public override fun onProductSelected(
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Bắt đầu mua hàng

Nếu ngưá»i dùng bắt đầu quá trình mua hàng, phương thức này sẽ được gá»i:

public override fun onPurchaseStarted(
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Phương thức này sẽ không được gá»i trong chế độ Observer. Tham khảo chá»§ đỠAndroid - Hiển thị paywall Paywall Builder trong chế độ Observer để biết thêm chi tiết.

Mua thành công, đã hủy hoặc đang chỠxử lý

Nếu giao dịch mua thành công, phương thức này sẽ được gá»i:

public override fun onPurchaseFinished(
    purchaseResult: AdaptyPurchaseResult,
    product: AdaptyPaywallProduct,
    context: Context,
) {
    if (purchaseResult !is AdaptyPurchaseResult.UserCanceled)
        context.getActivityOrNull()?.onBackPressed()
}
Ví dụ sự kiện (Nhấn để mở rộng)
// Successful purchase
{
  "purchaseResult": {
    "type": "Success",
    "profile": {
      "accessLevels": {
        "premium": {
          "id": "premium",
          "isActive": true,
          "expiresAt": "2024-02-15T10:30:00Z"
        }
      }
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// Cancelled purchase
{
  "purchaseResult": {
    "type": "UserCanceled"
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// Pending purchase
{
  "purchaseResult"ÿÿ: {
    "type": "Pending"
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Chúng tôi khuyến nghị đóng màn hình trong trưá»ng hợp đó.

Phương thức này sẽ không được gá»i trong Observer mode. Tham khảo chá»§ đỠAndroid - Hiển thị paywall Paywall Builder trong Observer mode để biết thêm chi tiết.

Giao dịch mua thất bại

Nếu má»™t giao dịch thất bại do lá»—i, phương thức này sẽ được gá»i. Äiá»u này bao gồm các lá»—i Google Play Billing (hạn chế thanh toán, sản phẩm không hợp lệ, lá»—i mạng), lá»—i xác minh giao dịch và lá»—i hệ thống. Lưu ý rằng khi ngưá»i dùng há»§y, onPurchaseFinished sẽ được gá»i vá»›i kết quả đã há»§y thay thế, và các giao dịch Ä‘ang chá» xá»­ lý không kích hoạt phương thức này.

public override fun onPurchaseFailure(
    error: AdaptyError,
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "purchase_failed",
    "message": "Purchase failed due to insufficient funds",
    "details": {
      "underlyingError": "Insufficient funds in account"
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Phương thức này sẽ không được gá»i trong chế độ Observer. Tham khảo chá»§ đỠAndroid - Hiển thị paywall Paywall Builder trong chế độ Observer để biết thêm chi tiết.

Hoàn tất Ä‘iá»u hướng thanh toán web

Phương thức này được gá»i sau khi có má»™t lần thá»­ mở web paywall cho má»™t sản phẩm cụ thể. Äiá»u này bao gồm cả các lần Ä‘iá»u hướng thành công lẫn thất bại:

public override fun onFinishWebPaymentNavigation(
    product: AdaptyPaywallProduct?,
    error: AdaptyError?,
    context: Context,
) {}

Tham số:

Tham sốMô tả
productMột AdaptyPaywallProduct mà web paywall đã được mở. Có thể là null.
errorMá»™t đối tượng AdaptyError nếu Ä‘iá»u hướng web paywall thất bại; null nếu Ä‘iá»u hướng thành công.
Ví dụ vỠsự kiện (Nhấn để mở rộng)
// Successful navigation
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "error": null
}

// Failed navigation
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "error": {
    "code": "web_navigation_failed",
    "message": "Failed to open web paywall",
    "details": {
      "underlyingError": "Browser unavailable"
    }
  }
}

Khôi phục thành công

Nếu việc khôi phục giao dịch mua thành công, phương thức này sẽ được gá»i:

public override fun onRestoreSuccess(
    profile: AdaptyProfile,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "profile": {
    "accessLevels": {
      "premium": {
        "id": "premium",
        "isActive": true,
        "expiresAt": "2024-02-15T10:30:00Z"
      }
    },
    "subscriptions": [
      {
        "vendorProductId": "premium_monthly",
        "isActive": true,
        "expiresAt": "2024-02-15T10:30:00Z"
      }
    ]
  }
}

Chúng tôi khuyến nghị đóng màn hình nếu ngưá»i dùng có accessLevel yêu cầu. Tham khảo chá»§ đỠTrạng thái gói đăng ký để tìm hiểu cách kiểm tra.

Khôi phục thất bại

Nếu Adapty.restorePurchases() thất bại, phương thức này sẽ được gá»i:

public override fun onRestoreFailure(
    error: AdaptyError,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "restore_failed",
    "message": "Purchase restoration failed",
    "details": {
      "underlyingError": "No previous purchases found"
    }
  }
}

Nâng cấp gói đăng ký

Khi ngưá»i dùng cố mua má»™t gói đăng ký má»›i trong khi đã có gói đăng ký Ä‘ang hoạt động, bạn có thể kiểm soát cách xá»­ lý giao dịch má»›i bằng cách ghi đè phương thức này. Bạn có hai lá»±a chá»n:

  1. Thay thế gói đăng ký hiện tại bằng gói mới:
public override fun onAwaitingPurchaseParams(
    product: AdaptyPaywallProduct,
    context: Context,
    onPurchaseParamsReceived: AdaptyFlowEventListener.PurchaseParamsCallback,
): AdaptyFlowEventListener.PurchaseParamsCallback.IveBeenInvoked {
    onPurchaseParamsReceived(
        AdaptyPurchaseParameters.Builder()
            .withSubscriptionUpdateParams(AdaptySubscriptionUpdateParameters(...))
            .build()
    )
    return AdaptyFlowEventListener.PurchaseParamsCallback.IveBeenInvoked
}
  1. Giữ cả hai gói đăng ký (thêm gói mới riêng biệt):
public override fun onAwaitingPurchaseParams(
    product: AdaptyPaywallProduct,
    context: Context,
    onPurchaseParamsReceived: AdaptyFlowEventListener.PurchaseParamsCallback,
): AdaptyFlowEventListener.PurchaseParamsCallback.IveBeenInvoked {
    onPurchaseParamsReceived(AdaptyPurchaseParameters.Empty)
    return AdaptyFlowEventListener.PurchaseParamsCallback.IveBeenInvoked
}

Nếu bạn không override phương thức này, hành vi mặc định là giữ nguyên cả hai gói đăng ký (tương đương với việc sử dụng AdaptyPurchaseParameters.Empty).

Bạn cũng có thể đặt thêm các tham số mua hàng nếu cần:

AdaptyPurchaseParameters.Builder()
    .withSubscriptionUpdateParams(AdaptySubscriptionUpdateParameters(...)) // optional - for replacing current subscription
    .withOfferPersonalized(true) // optional - if using personalized pricing
    .build()
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "product": {
    "vendorProductId": "premium_yearly",
    "localizedTitle": "Premium Yearly",
    "localizedDescription": "Premium subscription for 1 year",
    "localizedPrice": "$99.99",
    "price": 99.99,
    "currencyCode": "USD"
  },
  "subscriptionUpdateParams": {
    "replacementMode": "with_time_proration"
  }
}

Tải dữ liệu và hiển thị

Lỗi tải sản phẩm

Nếu bạn không truyá»n sản phẩm trong quá trình khởi tạo, AdaptyUI sẽ tá»± động lấy các đối tượng cần thiết từ server. Nếu thao tác này thất bại, AdaptyUI sẽ báo lá»—i bằng cách gá»i phương thức sau:

public override fun onLoadingProductsFailure(
    error: AdaptyError,
    context: Context,
): Boolean = false
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "products_loading_failed",
    "message": "Failed to load products from the server",
    "details": {
      "underlyingError": "Network timeout"
    }
  }
}

Nếu bạn trả vỠtrue, AdaptyUI sẽ lặp lại yêu cầu sau 2 giây.

Lỗi kết xuất giao diện

Nếu xảy ra lỗi trong quá trình kết xuất giao diện, lỗi đó sẽ được báo cáo thông qua phương thức này:

public override fun onError(
    error: AdaptyError,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "rendering_failed",
    "message": "Failed to render flow interface",
    "details": {
      "underlyingError": "Invalid flow configuration"
    }
  }
}

Trong Ä‘iá»u kiện bình thưá»ng, các lá»—i này sẽ không xảy ra, vì vậy nếu bạn gặp phải, hãy cho chúng tôi biết.

Nút back của hệ thống

Theo mặc định, ngưá»i dùng không thể thoát khá»i má»™t flow bằng nút back cá»§a hệ thống hoặc thao tác vuốt để quay lại — há» thoát thông qua má»™t đưá»ng dẫn bạn định nghÄ©a, chẳng hạn như nút Close hoặc má»™t hành động on_device_back trong builder. Nếu bạn muốn nút back cá»§a hệ thống có thể đóng flow, hãy override onBackPressed và trả vá» false để activity hoặc fragment host xá»­ lý sá»± kiện nhấn đó:

public override fun onBackPressed(context: Context): Boolean {
    return false // let the host handle the back press (e.g. finish the activity or pop the fragment)
}

Callback này chỉ được gá»i khi không có hành động on_device_back nào được cấu hình cho màn hình hiện tại — hành động đã cấu hình sẽ được ưu tiên và xá»­ lý ná»™i bá»™. Trả vá» true để tiêu thụ sá»± kiện nhấn (hành vi mặc định), hoặc false để cho phép logic xá»­ lý back cá»§a host tá»± chạy.

Các sự kiện dành riêng

AdaptyFlowEventListener khai báo một số callback cho các tính năng mà flow chưa sử dụng. Bạn không cần triển khai chúng — AdaptyFlowDefaultEventListener đã cung cấp sẵn các giá trị mặc định không làm gì cả.

Phương thứcMô tả
onAnalyticEventDành riêng cho các sự kiện phân tích tùy chỉnh từ một flow. Hiện tại các flow chưa phát ra sự kiện này tới code của bạn, nên bạn chưa cần implement.
onShowAppRateDành riêng cho các yêu cầu đánh giá ứng dụng từ một flow. Hiện tại các flow chưa kích hoạt yêu cầu đánh giá ứng dụng, nên bạn chưa cần implement.
onShowRequestPermissionDành riêng cho các yêu cầu cấp quyá»n hệ thống (như thông báo đẩy hoặc quyá»n truy cập camera) từ má»™t flow. Hiện tại các flow chưa kích hoạt yêu cầu cấp quyá»n, nên bạn chưa cần implement.

Hướng dẫn này đỠcập đến việc xá»­ lý sá»± kiện cho các giao dịch mua, khôi phục, lá»±a chá»n sản phẩm và hiển thị paywall. Bạn cÅ©ng cần triển khai xá»­ lý nút bấm (đóng paywall, mở liên kết, v.v.). Xem hướng dẫn xá»­ lý hành động nút bấm cá»§a chúng tôi để biết thêm chi tiết.

Paywall được cấu hình bằng Paywall Builder không cần thêm code để thá»±c hiện và khôi phục giao dịch mua. Tuy nhiên, chúng tạo ra má»™t số sá»± kiện mà ứng dụng cá»§a bạn có thể phản hồi. Các sá»± kiện đó bao gồm các thao tác nhấn nút (nút đóng, URL, chá»n sản phẩm, v.v.) cÅ©ng như thông báo vá» các hành động liên quan đến giao dịch mua được thá»±c hiện trên paywall. Hãy tìm hiểu cách phản hồi các sá»± kiện này bên dưới.

Hướng dẫn này chỉ dành cho paywall Paywall Builder mới yêu cầu Adapty SDK v3.0 trở lên.

Muốn xem ví dụ thá»±c tế vá» cách tích hợp Adapty SDK vào ứng dụng di động? Hãy xem ứng dụng mẫu cá»§a chúng tôi, nÆ¡i minh há»a toàn bá»™ quá trình thiết lập, bao gồm hiển thị paywall, thá»±c hiện mua hàng và các chức năng cÆ¡ bản khác.

Nếu bạn cần kiểm soát hoặc theo dõi các tiến trình diễn ra trên màn hình mua hàng, hãy implement các phương thức của AdaptyUiEventListener.

Nếu bạn muốn giữ nguyên hành vi mặc định trong má»™t số trưá»ng hợp, bạn có thể extend AdaptyUiDefaultEventListener và chỉ override những phương thức bạn muốn thay đổi.

Dưới đây là các giá trị mặc định từ AdaptyUiDefaultEventListener.

Sá»± kiện do ngưá»i dùng tạo ra

Chá»n sản phẩm

Nếu má»™t sản phẩm được chá»n để mua (bởi ngưá»i dùng hoặc hệ thống), phương thức này sẽ được gá»i:

public override fun onProductSelected(
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Ví dụ sự kiện (Nhấp để mở rộng)
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Bắt đầu mua hàng

Nếu ngưá»i dùng bắt đầu quá trình mua hàng, phương thức này sẽ được gá»i:

public override fun onPurchaseStarted(
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Phương thức này sẽ không được gá»i trong chế độ Observer. Tham khảo chá»§ đỠAndroid - Present Paywall Builder paywalls in Observer mode để biết thêm chi tiết.

Mua hàng thành công, đã hủy hoặc đang chỠxử lý

Nếu mua hàng thành công, phương thức này sẽ được gá»i:

public override fun onPurchaseFinished(
    purchaseResult: AdaptyPurchaseResult,
    product: AdaptyPaywallProduct,
    context: Context,
) {
    if (purchaseResult !is AdaptyPurchaseResult.UserCanceled)
        context.getActivityOrNull()?.onBackPressed()
}
Ví dụ vỠsự kiện (Nhấn để mở rộng)
// Successful purchase
{
  "purchaseResult": {
    "type": "Success",
    "profile": {
      "accessLevels": {
        "premium": {
          "id": "premium",
          "isActive": true,
          "expiresAt": "2024-02-15T10:30:00Z"
        }
      }
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// Cancelled purchase
{
  "purchaseResult": {
    "type": "UserCanceled"
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

// Pending purchase
{
  "purchaseResult": {
    "type": "Pending"
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Chúng tôi khuyến nghị bạn đóng màn hình trong trưá»ng hợp đó.

Phương thức này sẽ không được gá»i trong Observer mode. Tham khảo chá»§ đỠAndroid - Hiển thị paywall Paywall Builder trong Observer mode để biết thêm chi tiết.

Mua hàng thất bại

Nếu má»™t giao dịch thất bại do lá»—i, phương thức này sẽ được gá»i. Äiá»u này bao gồm các lá»—i Google Play Billing (hạn chế thanh toán, sản phẩm không hợp lệ, lá»—i mạng), lá»—i xác minh giao dịch, và lá»—i hệ thống. Lưu ý rằng khi ngưá»i dùng há»§y giao dịch, onPurchaseFinished sẽ được gá»i vá»›i kết quả đã há»§y thay thế, và các khoản thanh toán Ä‘ang chá» xá»­ lý sẽ không kích hoạt phương thức này.

public override fun onPurchaseFailure(
    error: AdaptyError,
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "purchase_failed",
    "message": "Purchase failed due to insufficient funds",
    "details": {
      "underlyingError": "Insufficient funds in account"
    }
  },
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Phương thức này sẽ không được gá»i trong chế độ Observer. Tham khảo chá»§ đỠAndroid - Hiển thị paywall Paywall Builder trong chế độ Observer để biết thêm chi tiết.

Hoàn tất Ä‘iá»u hướng thanh toán web

Phương thức này được gá»i sau khi có má»™t lần thá»­ mở web paywall cho má»™t sản phẩm cụ thể. Äiá»u này bao gồm cả các lần Ä‘iá»u hướng thành công lẫn thất bại:

public override fun onFinishWebPaymentNavigation(
    product: AdaptyPaywallProduct?,
    error: AdaptyError?,
    context: Context,
) {}

Tham số:

Tham sốMô tả
productMột AdaptyPaywallProduct mà web paywall được mở cho sản phẩm đó. Có thể là null.
errorMá»™t đối tượng AdaptyError nếu Ä‘iá»u hướng web paywall thất bại; null nếu Ä‘iá»u hướng thành công.
Ví dụ sự kiện (Nhấn để mở rộng)
// Successful navigation
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "error": null
}

// Failed navigation
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  },
  "error": {
    "code": "web_navigation_failed",
    "message": "Failed to open web paywall",
    "details": {
      "underlyingError": "Browser unavailable"
    }
  }
}

Khôi phục thành công

Nếu việc khôi phục giao dịch thành công, phương thức này sẽ được gá»i:

public override fun onRestoreSuccess(
    profile: AdaptyProfile,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "profile": {
    "accessLevels": {
      "premium": {
        "id": "premium",
        "isActive": true,
        "expiresAt": "2024-02-15T10:30:00Z"
      }
    },
    "subscriptions": [
      {
        "vendorProductId": "premium_monthly",
        "isActive": true,
        "expiresAt": "2024-02-15T10:30:00Z"
      }
    ]
  }
}

Chúng tôi khuyến nghị đóng màn hình nếu ngưá»i dùng có accessLevel yêu cầu. Tham khảo tài liệu Trạng thái gói đăng ký để biết cách kiểm tra.

Khôi phục thất bại

Nếu Adapty.restorePurchases() thất bại, phương thức này sẽ được gá»i:

public override fun onRestoreFailure(
    error: AdaptyError,
    context: Context,
) {}
Ví dụ sự kiện (Nhấp để mở rộng)
{
  "error": {
    "code": "restore_failed",
    "message": "Purchase restoration failed",
    "details": {
      "underlyingError": "No previous purchases found"
    }
  }
}

Nâng cấp gói đăng ký

Ví dụ sự kiện (Nhấp để mở rộng)
{
  "product": {
    "vendorProductId": "premium_yearly",
    "localizedTitle": "Premium Yearly",
    "localizedDescription": "Premium subscription for 1 year",
    "localizedPrice": "$99.99",
    "price": 99.99,
    "currencyCode": "USD"
  },
  "subscriptionUpdateParams": {
    "replacementMode": "with_time_proration"
  }
}

Tải dữ liệu và hiển thị

Lỗi tải sản phẩm

Nếu bạn không truyá»n sản phẩm trong quá trình khởi tạo, AdaptyUI sẽ tá»± động lấy các đối tượng cần thiết từ server. Nếu thao tác này thất bại, AdaptyUI sẽ báo lá»—i bằng cách gá»i phương thức sau:

public override fun onLoadingProductsFailure(
    error: AdaptyError,
    context: Context,
): Boolean = false
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "products_loading_failed",
    "message": "Failed to load products from the server",
    "details": {
      "underlyingError": "Network timeout"
    }
  }
}

Nếu bạn trả vỠtrue, AdaptyUI sẽ thực hiện lại yêu cầu sau 2 giây.

Lá»—i rendering

Nếu xảy ra lỗi trong quá trình render giao diện, lỗi đó sẽ được báo cáo qua phương thức này:

public override fun onRenderingError(
    error: AdaptyError,
    context: Context,
) {}
Ví dụ sự kiện (Nhấn để mở rộng)
{
  "error": {
    "code": "rendering_failed",
    "message": "Failed to render paywall interface",
    "details": {
      "underlyingError": "Invalid paywall configuration"
    }
  }
}

Trong trưá»ng hợp bình thưá»ng, những lá»—i này không nên xảy ra, vì vậy nếu bạn gặp phải, hãy cho chúng tôi biết.

ÿÿÿÿ