Android - Paywall olaylarını yönetme

Bu kılavuz; satın alma, geri yükleme, ürün seçimi ve paywall render işlemlerine ait olay yönetimini kapsar. Bunların yanı sıra buton yönetimini de (paywallı kapatma, bağlantı açma vb.) uygulamanız gerekir. Ayrıntılar için buton aksiyonlarını yönetme kılavuzuna bakın.

Paywall Builder ile yapılandırılmış paywalllar, satın alma ve geri yükleme işlemleri için ekstra kod gerektirmez. Ancak uygulamanızın yanıt verebileceği bazı olaylar üretirler. Bu olaylar; buton tıklamaları (kapat butonları, URL’ler, ürün seçimleri vb.) ve paywall üzerinde gerçekleştirilen satın alma ile ilgili eylem bildirimlerini kapsar. Bu olaylara nasıl yanıt vereceğinizi aşağıda öğrenebilirsiniz.

Bu kılavuz yalnızca Adapty SDK v3.0 veya daha yeni bir sürüm gerektiren yeni Paywall Builder paywallları içindir.

Adapty SDK’nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Tam kurulumu, paywall’ların gösterimini, satın alma işlemlerini ve diğer temel işlevleri içeren örnek uygulamalarımıza göz atın.

Satın alma ekranında gerçekleşen süreçleri kontrol etmek veya izlemek istiyorsanız AdaptyUiEventListener metodlarını uygulayın.

Bazı durumlarda varsayılan davranışı korumak istiyorsanız AdaptyUiDefaultEventListener sınıfını genişletip yalnızca değiştirmek istediğiniz metodları override edebilirsiniz.

Aşağıda AdaptyUiDefaultEventListener’ın varsayılan metodları verilmiştir.

Kullanıcı kaynaklı olaylar

Ürün seçimi

Bir ürün satın alma için seçildiğinde (kullanıcı veya sistem tarafından) bu metod çağrılır:

public override fun onProductSelected(
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Olay örneği (Genişletmek için tıklayın)
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Satın alma başlatıldı

Kullanıcı satın alma işlemini başlattığında bu metod çağrılır:

public override fun onPurchaseStarted(
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Olay örneği (Genişletmek için tıklayın)
{
  "product": {
    "vendorProductId": "premium_monthly",
    "localizedTitle": "Premium Monthly",
    "localizedDescription": "Premium subscription for 1 month",
    "localizedPrice": "$9.99",
    "price": 9.99,
    "currencyCode": "USD"
  }
}

Bu metod Observer modunda çağrılmaz. Ayrıntılar için Android - Observer modunda Paywall Builder paywalllarını sunma konusuna bakın.

Başarılı, iptal edilmiş veya beklemedeki satın alma

Satın alma başarılı olduğunda bu metod çağrılır:

public override fun onPurchaseFinished(
    purchaseResult: AdaptyPurchaseResult,
    product: AdaptyPaywallProduct,
    context: Context,
) {
    if (purchaseResult !is AdaptyPurchaseResult.UserCanceled)
        context.getActivityOrNull()?.onBackPressed()
}
Olay örnekleri (Genişletmek için tıklayın)
// 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"
  }
}

Bu durumda ekranı kapatmanızı öneririz.

Bu metod Observer modunda çağrılmaz. Ayrıntılar için Android - Observer modunda Paywall Builder paywalllarını sunma konusuna bakın.

Başarısız satın alma

Bir hata nedeniyle satın alma başarısız olduğunda bu metod çağrılır. Google Play Billing hataları (ödeme kısıtlamaları, geçersiz ürünler, ağ hataları), işlem doğrulama hataları ve sistem hataları bu kapsama girer. Kullanıcı iptalleri ise bu metodu değil, iptal sonucuyla onPurchaseFinished’ı tetikler; beklemedeki ödemeler bu metodu tetiklemez.

public override fun onPurchaseFailure(
    error: AdaptyError,
    product: AdaptyPaywallProduct,
    context: Context,
) {}
Olay örneği (Genişletmek için tıklayın)
{
  "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"
  }
}

Bu metod Observer modunda çağrılmaz. Ayrıntılar için Android - Observer modunda Paywall Builder paywalllarını sunma konusuna bakın.

Web ödeme navigasyonu tamamlandı

Bu metod, belirli bir ürün için web paywall açma girişiminin ardından çağrılır. Başarılı ve başarısız navigasyon girişimlerini kapsar:

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

Parametreler:

ParametreAçıklama
productWeb paywallın açıldığı AdaptyPaywallProduct. null olabilir.
errorWeb paywall navigasyonu başarısız olduysa AdaptyError nesnesi; navigasyon başarılıysa null.
Olay örnekleri (Genişletmek için tıklayın)
// 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"
    }
  }
}

Başarılı geri yükleme

Satın alma geri yükleme işlemi başarılı olduğunda bu metod çağrılır:

public override fun onRestoreSuccess(
    profile: AdaptyProfile,
    context: Context,
) {}
Olay örneği (Genişletmek için tıklayın)
{
  "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"
      }
    ]
  }
}

Kullanıcının gerekli accessLevel’a sahip olması durumunda ekranı kapatmanızı öneririz. Bunu nasıl kontrol edeceğinizi öğrenmek için Abonelik durumu konusuna bakın.

Başarısız geri yükleme

Adapty.restorePurchases() başarısız olduğunda bu metod çağrılır:

public override fun onRestoreFailure(
    error: AdaptyError,
    context: Context,
) {}
Olay örneği (Genişletmek için tıklayın)
{
  "error": {
    "code": "restore_failed",
    "message": "Purchase restoration failed",
    "details": {
      "underlyingError": "No previous purchases found"
    }
  }
}

Abonelik yükseltme

Olay örneği (Genişletmek için tıklayın)
{
  "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"
  }
}

Veri çekme ve render

Ürün yükleme hataları

Başlatma sırasında ürünleri geçmezseniz AdaptyUI gerekli nesneleri sunucudan kendisi alır. Bu işlem başarısız olursa AdaptyUI hatayı bu metodu çağırarak bildirir:

public override fun onLoadingProductsFailure(
    error: AdaptyError,
    context: Context,
): Boolean = false
Olay örneği (Genişletmek için tıklayın)
{
  "error": {
    "code": "products_loading_failed",
    "message": "Failed to load products from the server",
    "details": {
      "underlyingError": "Network timeout"
    }
  }
}

true döndürürseniz AdaptyUI isteği 2 saniye sonra tekrar dener.

Render hataları

Arayüz render edilirken bir hata oluşursa bu metod çağrılarak bildirim yapılır:

public override fun onRenderingError(
    error: AdaptyError,
    context: Context,
) {}
Olay örneği (Genişletmek için tıklayın)
{
  "error": {
    "code": "rendering_failed",
    "message": "Failed to render paywall interface",
    "details": {
      "underlyingError": "Invalid paywall configuration"
    }
  }
}

Normal koşullarda bu tür hatalar oluşmamalıdır; böyle bir hatayla karşılaşırsanız lütfen bize bildirin.