Play Faturalandırma Entegrasyonunuzdan En İyi Şekilde Yararlanma

1. Genel Bakış

Google Play'in bu Play Faturalandırma Kitaplığı entegrasyonu codelab'i ile gelir akışlarınızı optimize edin ve uygulamanızı güvenle kullanıma sunun. Bu yapılandırılmış codelab, güvenilir satın alma işlemleri yapmayı ayarlama, test etme ve uygulama konusunda size yol göstererek para kazanma hedeflerinizi desteklemenize ve daha sorunsuz bir kullanıcı deneyimi sunmanıza olanak tanır.

Uygulamalarınız ve oyunlarınızdaki abonelikler ve tek seferlik ürünler için Gerçek zamanlı geliştirici bildirimleri (RTDN) ve Play Faturalandırma Test Alanı'nı ayarlamanıza yardımcı olacağız. Abonelik iptallerini azaltmayı, sahtekarlık ve kötüye kullanıma karşı korumayı, uç durumları test etmeyi, olası sorunları simüle etmeyi, yeniden üretmeyi ve ele almayı, ayrıca kullanıcıları etkilemeden teklifler ve fiyat değişiklikleriyle denemeler yapmayı öğreneceksiniz.

Bu kursun sonunda, kullanıcıları geri kazanma stratejileri uygulamaya, entegrasyonla ilgili sorunları hızlıca çözmeye, YG'yi artırmaya, birinci sınıf bir deneyim sunmaya ve uygulamanızı ve güncellemelerinizi güvenle kullanıma sunmaya hazır olacaksınız.

Ön koşullar

Neler öğreneceksiniz?

  • Satın alma dönüşümü sayısını ve müşteriyi elde tutmayı artırmaya yönelik tekniklerle büyümeyi optimize etmek için satın alma yaşam döngülerinizi nasıl doğru şekilde yönetebilirsiniz?
  • Google Cloud Pub/Sub'ı kullanarak gerçek zamanlı geliştirici bildirimlerini (RTDN) ayarlama. Bu bildirimler, kullanıcıları geri kazanma kampanyaları ve diğer yaşam döngüsü yönetimi stratejilerini uygulamak için kullanılabilir.
  • Arka uç sunucunuzda, doğru izleme ve hak yönetimi ile bildirimleri güvenli bir şekilde işlemek için alıcıyı nasıl ayarlayacağınız, böylece istenmeyen geri ödemeleri veya sahtekarlık ve kötüye kullanım risklerini azaltacağınız
  • Kullanıcı deneyiminizi iyileştirirken geliştirme maliyetlerini azaltmak için Google Play Faturalandırma Test Alanı'nı kullanarak entegrasyonunuzu test etme ve hataları simüle etme

İhtiyacınız olanlar

2. Abonelikler ve tek seferlik satın alma işlemleri için para kazanma stratejileri

Uygulamanız üzerinden dijital ürün satarken başarılı bir para kazanma stratejisi, hem tek seferlik satın alma işlemleri hem de abonelikler için kullanıcı deneyiminin tamamını göz önünde bulundurmalıdır. Sorunsuz bir deneyim, satın alma isteğini artırabilir ve müşteri kaybını azaltabilir.

Tek seferlik satın alım veya abonelik için yaygın bir satın alma süreci birden fazla aşamadan oluşur:

  1. Kullanıcı, satın alacağı öğelere göz atar.
  2. Kullanıcının satın alma ve ödeme işlemlerini tamamlaması için satın alma sürecini başlatın.
  3. Tamamlanan satın alma işlemi hakkında sunucunuza bildirim gönderin
  4. Satın alma işlemini sunucunuzda doğrulayın.
  5. Kullanıcıya içerik verme
  6. İçeriğin teslim edildiğini onaylayın. Tüketilebilir ürünlerde, kullanıcının öğeyi tekrar satın alabilmesi için satın alma işlemini uygun zamanda tüketin.

Uygulama içi entegrasyon, satın alma akışlarını başlatmanıza ve bu kullanıcı deneyimini yönetmenize olanak tanır. Ancak arka ucunuzu, kullanıcıların satın aldığı haklar konusunda güncel tutmanız çok önemlidir. Bu, satın alma işlemlerini izlemek ve kullanıcı deneyiminin diğer yönlerini (ör. platformlar arası haklar) yönetmek için önemlidir.

Gerçek zamanlı geliştirici bildirimleri (RTDN), satın alma yaşam döngüsündeki bu farklı aşamaları tanımak için harika bir yöntemdir. Hem anlık performans izleme aracı hem de aboneleri geri kazanma stratejilerini etkinleştirmek için kullanılabilir.

Örneğin, kullanıcınızın yeni bir öğe satın aldığını veya ödemesini kaçırdığı için aboneliğin ödeme süresine girdiğini varsayalım. Doğru RTDN ile kullanıcının durumunun değiştiğini neredeyse gerçek zamanlı olarak anlayabilir ve buna göre hareket edebilirsiniz. Örneğin, kullanıcıyı yeni satın aldığı öğeyle daha fazla etkileşime geçirebilir veya aboneliğine devam edebilmesi için ödeme ayrıntılarını güncellemesini hatırlatan e-postalar gönderebilirsiniz.

RTDN'ler, kullanıcının istemcisinde sorun olsa bile satın alma işlemlerini yönetmenize yardımcı olmak için sunucu tarafında ek kontroller eklemenin harika bir yoludur. Örneğin, bir kullanıcı başarılı bir satın alma işlemi gerçekleştirdi ve Google'dan onay aldı ancak cihazı ve uygulamanız, satın alma işlemi dinleyicisi aracılığıyla satın alma işlemiyle ilgili bildirimi almadan önce cihazının ağ bağlantısı kesildi. RTDN'ler sayesinde sunucunuz üzerinden bağımsız bir bildirim alırsınız. Bu bildirim, satın alma işlemini tanımanıza ve istemci sorunundan bağımsız olarak kullanıcıya hak vermenize olanak tanır. Böylece, satın alma işleminin güvenilir bir şekilde gerçekleşmesini sağlarsınız.

Şu anda desteklenen tüm RTDN türleri hakkında daha fazla bilgiyi burada bulabilirsiniz. Her bir RTDN türü, farklı bir satın alma durumunu gösterir. Kullanım alanlarınızda gerektiği şekilde uygun işlemeyi sağlamak için ilgili işleme mekanizmalarını uygulamanız çok önemlidir. Bu codelab'de, uygulamanızda bir kullanıcı satın alma işlemini başarıyla tamamladığında RTDN mesajını alma, satın alma işlemini doğrulama ve hakları doğru kullanıcıya verme gibi güvenli arka uç sunucunuzdaki RTDN mesajını işleyen bir örnek üzerinden ilerleyeceğiz. Ardından, uygulamanız için RTDN'leri nasıl yapılandıracağınızı göstereceğiz.

3. Gerçek zamanlı geliştirici bildirimlerini (RTDN) yapılandırma

Gerçek zamanlı geliştirici bildirimleri (RTDN), satın alma durumu değişikliklerine anında tepki vermenizi sağlamak için Google Cloud Pub/Sub'dan yararlanır. Cloud Pub/Sub, bağımsız uygulamalar arasında mesaj gönderip almak için kullanabileceğiniz, tümüyle yönetilen bir anlık mesajlaşma hizmetidir. Google Play, abone olduğunuz konularda push bildirimleri yayınlamak için Cloud Pub/Sub'ı kullanır.

RTDN'yi etkinleştirmek için önce kendi Google Cloud Platform (GCP) projenizi kullanarak Cloud Pub/Sub'ı ayarlamanız, ardından uygulamanız için bildirimleri etkinleştirmeniz gerekir. GCP ve Cloud Pub/Sub hakkında bilginiz yoksa Hızlı Başlangıç Kılavuzu'na bakın.

Konu oluşturma

Bildirim almaya başlamak için Google Play'in bildirimleri yayınlayacağı bir konu oluşturmanız gerekir. Konu oluşturmak için Konu oluşturma başlıklı makaledeki talimatları uygulayın.

Pub/Sub aboneliği oluşturma

Bir konuda yayınlanan mesajları almak için ilgili konuya Pub/Sub aboneliği oluşturmanız gerekir. Pub/Sub aboneliği oluşturmak için aşağıdakileri yapın:

  1. Aboneliği push aboneliği veya çekme aboneliği olarak yapılandırma hakkında bilgi edinmek için Cloud Pub/Sub Abone Kılavuzu'nu okuyun. Bu codelab'de, mesajları almak için güvenli arka uç sunucunuzun Cloud Pub/Sub sunucusuna istek başlatmasını gerektiren bir çekme aboneliğiyle çalışacağız.
  1. Abonelik oluşturmak için Abonelik ekleme başlıklı makaledeki talimatları uygulayın.

Konunuzda yayınlama hakları verme

Cloud Pub/Sub, Google Play'e konunuza bildirim yayınlama ayrıcalıkları vermenizi gerektirir.

  1. Google Cloud Console'u açın.
  2. Projenizi seçin, ardından arama çubuğunda "Pub/Sub" ifadesini arayın ve Pub/Sub yapılandırma sayfasına gidin. Pub/Sub yapılandırma sayfasını arama ve bu sayfaya gitme
  3. Konunuzu bulup izin ayarını açın. İzin ayarını açın
  4. google-play-developer-notifications@system.gserviceaccount.com hizmet hesabını eklemek için ADD PRINCIPAL'ı (Ana hesap ekle) tıklayın ve hesaba Pub/Sub Yayıncısı rolünü verin. google-play-developer-notifications@system.gserviceaccount.com hizmet hesabını ekleyin ve bu hesaba Pub/Sub Yayıncısı rolünü verin.
  5. Konu kurulumunu tamamlamak için Kaydet'i tıklayın. Konu kurulumunu tamamlamak için Kaydet'i tıklayın.

Uygulamanız için RTDN'yi etkinleştirme

Play Faturalandırma entegrasyonunuzu önemli ölçüde geliştirmek için gerçek zamanlı geliştirici bildirimlerini (RTDN) ayarlamayı öğrenin. Kişiselleştirilmiş mesajlarla satın alma güvenilirliğini artırabilir, genel yatırım getirinizi iyileştirmek için sahtekarlığı ve kötüye kullanımı önleyebilirsiniz.

RTDN'ler, abonelik yenilemeleri, yeni satın alma işlemleri ve ödeme sorunları gibi önemli etkinlikler için doğrudan Google Play'den sunucudan sunucuya anında güncellemeler sağlar. Bu API'ler, arka uç sistemlerinizin kullanıcı haklarının gerçek durumuyla otomatik olarak senkronize olmasına yardımcı olur. Böylece, istemci taraflı sınırlamaların ötesine geçebilir ve anında uygun şekilde yanıt verebilirsiniz.

Uygulamanız için gerçek zamanlı geliştirici bildirimlerini etkinleştirme:

  1. Google Play Console'u açın.
  2. Uygulamanızı seçin.
  3. Google Play ile para kazanın > Para kazanma kurulumu'na gidin.
  4. Gerçek zamanlı geliştirici bildirimleri bölümüne gidin.
  5. Anlık bildirimleri etkinleştir'i işaretleyin.
  6. Konu adı alanına, daha önce yapılandırdığınız Cloud Pub/Sub konu adını eksiksiz bir şekilde girin. Konu adı projects/{project_id}/topics/{topic_name} biçiminde olmalıdır. Burada project_id, projenizin benzersiz tanımlayıcısı, topic_name ise daha önce oluşturulan konunun adıdır.
  7. Test mesajı göndermek için Test Mesajı Gönder'i tıklayın. Test yayını yapmak, her şeyin doğru şekilde ayarlanıp yapılandırıldığından emin olmanıza yardımcı olur. Test yayını başarılı olursa test yayınının başarılı olduğunu belirten bir mesaj gösterilir. Bu konu için bir abonelik eklediyseniz test mesajını alırsınız. Çekme aboneliği için Cloud Console'da aboneliğe gidin, View Messages'ı (Mesajları Görüntüle) tıklayın ve mesajları çekme işlemine devam edin. Cloud Pub/Sub'ın mesajı tekrar tekrar göndermesini önlemek için çektiğiniz tüm mesajları onaylamanız gerekir. Anlık bildirim aboneliği için test mesajının anlık bildirim uç noktanıza teslim edilip edilmediğini kontrol edin. Başarılı bir yanıt kodu, onay mesajı olarak kabul edilir. Yayınlama başarısız olursa bir hata gösterilir. Konu adının doğru olduğundan ve google-play-developer-notifications@system.gserviceaccount.com hizmet hesabının konu için Pub/Sub Yayıncısı erişimine sahip olduğundan emin olun.
  8. Almak istediğiniz bildirim türlerini seçin.
  • Abonelikler ve tüm geçersiz satın alma işlemleri ile ilgili bildirim alma: Abonelikler ve geçersiz satın alma işlemleriyle ilgili gerçek zamanlı geliştirici bildirimleri alın. Tek seferlik ürün satın alma işlemleriyle ilgili bildirim almazsınız.
  • Abonelikler ve tek seferlik ürünler ile ilgili tüm bildirimleri gönder: Tüm abonelik ve geçersiz satın alma işlemi etkinlikleriyle ilgili bildirimler alırsınız. Ayrıca ONE_TIME_PRODUCT_PURCHASED ve ONE_TIME_PRODUCT_CANCELED gibi tek seferlik ürün satın alma etkinliklerini de alırsınız. Bu satın alma etkinlikleri hakkında daha fazla bilgi edinmek için Tek seferlik satın alma yaşam döngüsü başlıklı makaleyi inceleyin.

a266e5dec5c93cd8.png

  1. Değişiklikleri kaydet'i tıklayın.

Uygulamanız için gerçek zamanlı geliştirici bildirimlerini tamamladınız. Artık kullanıcı kaybı gibi yaygın sorunları geri kazanma mesajlarıyla veya sahtekarlık ve kötüye kullanımı önlemek için kullanabileceğiniz araçlara sahipsiniz. Sonraki bölümde, Cloud Pub/Sub konunuza gönderilen mesajları kullanmak için güvenli arka uç sunucunuzda bir abone oluşturacağız.

4. Bildirimleri alma

Uygulamanızda en iyi kullanıcı deneyimini sunmak için arka uç sunucunuzu satın alma işlemlerinin durumu hakkında güncel tutmanız çok önemlidir. Örneğin, bir kullanıcı uygulama içi ödeme ile satın alma işlemini başarıyla tamamladığında içeriğin en kısa sürede hesabına teslim edilmesi gerekir.

Bunun için satın alma işleminin tamamlanmasının zamanında algılanması ve işlenmesi gerekir. Play Faturalandırma Kitaplığı, uygulamanızdaki satın alma işlemlerini algılamanın birden fazla yolunu sunar. Tamamlanan bir satın alma işlemi algılandığında uygulamanız, satın alma işlemini doğrulamak, içeriği doğru kullanıcıya vermek ve satın alma işleminin işlendiğini Google'a bildirmek için arka uç sunucunuza bildirim göndermelidir. Ancak uygulamanız, çeşitli nedenlerle satın alma işlemini zamanında algılamamış olabilir. Örneğin, bir kullanıcı başarılı bir satın alma işlemi yapıp Google'dan onay alabilir ancak cihazı ve uygulamanız, Play Faturalandırma Kitaplığı arayüzü üzerinden bildirim almadan önce cihazının ağ bağlantısı kesilir. RTDN, kullanıcının istemcisinde sorun olsa bile satın alma işlemlerini yönetmenize yardımcı olmak için ek sunucu tarafı kontrolleri sağlar. RTDN, satın alma durumu değişikliklerinde sunucunuza bağımsız bildirimler gönderilmesini garanti eder. Bu sayede, potansiyel istemci sorunlarından bağımsız olarak ikinci bir yol üzerinden satın alma durumu değişikliklerini neredeyse anında tanıyabilir ve satın alma işleminin daha güvenilir bir şekilde gerçekleşmesini sağlayabilirsiniz.

Bu bölümde, Cloud Pub/Sub istemci kitaplıklarını kullanarak Cloud Pub/Sub konunuza gönderilen mesajları tüketecek bir abone oluşturacaksınız. Bu kitaplıklar çeşitli dillerde kullanılabilir. Aşağıdaki bölümlerde, satın alma işlemini doğrulamak, doğru kullanıcıya hak vermek ve satın alma işlemini sunucuda onaylamak/tüketmek için aboneye eklemeler yapacağız. Bu codelab'de Java kullanıyoruz.

Cloud Pub/Sub konusuna yapılan her yayın, tek bir base64 kodlu veri alanı içerir.

{
 "message": {
   "attributes": {
     "key": "value"
   },
   "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
   "messageId": "136969346945"
 },
 "subscription": "projects/myproject/subscriptions/mysubscription"
}

Base64 kodlu veri alanının kodunu çözdükten sonra DeveloperNotification aşağıdaki alanları içerir:

{
 "version": string,
 "packageName": string,
 "eventTimeMillis": long,
 "oneTimeProductNotification": OneTimeProductNotification,
 "subscriptionNotification": SubscriptionNotification,
 "voidedPurchaseNotification": VoidedPurchaseNotification,
 "testNotification": TestNotification
}

Daha fazla bilgi için lütfen Gerçek zamanlı geliştirici bildirimleri referansı başlıklı makaleyi inceleyin.

Aşağıda, güvenli arka uç sunucunuzun Pub/Sub mesajlarını işlemesi için NotificationReceiver'ın örnek kodu verilmiştir. Security Command Center'da kimlik doğrulaması yapmak için Uygulama Varsayılan Kimlik Bilgileri'ni ayarlayın. Yerel geliştirme ortamı için kimlik doğrulama ayarlama başlıklı makaleyi inceleyin.

import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.Base64;
import org.json.JSONObject;

/** Real-time developer notifications receiver. */
public class NotificationReceiver {

 private NotificationReceiver() {}

 /*
  * Receive notification messages from the subscription.
  *
  * @param projectId The project ID of your Google Cloud Project.
  * @param subscriptionId The subscription ID of the subscriber to the pub/sub topic.
  */
 public static void receiveNotificationMessages(String projectId, String subscriptionId) {
   ProjectSubscriptionName subscriptionName =
       ProjectSubscriptionName.of(projectId, subscriptionId);

   try {
     Subscriber subscriber =
         Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
     // Start the subscriber.
     subscriber.startAsync().awaitRunning();

     subscriber.awaitTerminated();
   } catch (IllegalStateException e) {
     System.out.println("Subscriber stopped: " + e);
   }
 }

 static class NotificationMessageReceiver implements MessageReceiver {

   @Override
   public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
     // Decode the data into a String from the message data field.
     String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
     // Parse the String into a JSON object.
     JSONObject messageJson = new JSONObject(jsonString);

     // Fetch the value for certain fields.
     String version = messageJson.getString("version");
     String packageName = messageJson.getString("packageName");
     System.out.println("version: " + version);
     System.out.println("packageName: " + packageName);

     // Validate the purchase and grant the entitlement as needed.
     // More details in the following sections.
     // ......

     // Acknowledge the message to avoid repeated delivery.
     consumer.ack();
   }
 }
}

Artık güvenli arka uç sunucunuzda Cloud Pub/Sub konunuza gönderilen mesajları kullanan bir bildirim alıcınız var. Aşağıdaki bölümlerde, RTDN mesajlarını arka uç sunucunuzda işleme koymayla ilgili en iyi uygulamaları ele alacağız.

5. Uygulamanızdaki satın alma sürecine kullanıcı tanımlayıcıları ekleme

Sunucunuz, satın alma durumu güncellemesiyle ilgili RTDN mesajını aldığında, içeriği doğru kullanıcıya teslim etmek gibi işlemleri gerçekleştirebilmek için satın alma işlemini hangi kullanıcının yaptığını bilmesi gerekir. Bunu, uygulamanızda satın alma sürecini başlatırken satın alma işlemini yapan kullanıcı için sahip olduğunuz tüm kullanıcı kimliklerini obfuscatedAccountId kullanarak ekleyerek yapabilirsiniz. Tanımlayıcı örneği, kullanıcının sisteminizdeki girişinin karartılmış bir sürümü olabilir. Bu parametreyi ayarlamak, Google'ın sahtekarlığı tespit etmesine yardımcı olabilir. Ayrıca, kullanıcılara hak verme bölümünde bahsedildiği gibi, satın alma işlemlerinin doğru kullanıcıya atfedilmesini sağlamanıza yardımcı olabilir.

Aşağıda, obfuscatedAccountId ayarlanarak uygulamada satın alma süreci başlatılırken kullanıcı tanımlayıcısının eklenmesi için örnek kodlar gösterilmektedir.

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// A user identifier, e.g. an obfuscated user id in your system.
String obfuscatedAccountId = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
            // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // set the offer token to specify the offer to purchase when applicable, e.g., subscription products
            // .setOfferToken(offerToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .setObfuscatedAccountId(obfuscatedAccountId)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Sonraki bölümde göreceğiniz gibi, satın alma akışında ayarlanan kullanıcı tanımlayıcısı satın alma işlemine dahil edilir ve doğru kullanıcıya hak vermek için kullanılabilir.

6. Hakları vermeden önce satın alma işlemlerini doğrulama

Bu bölümde, güvenli arka uç sunucunuzda haklar vermeden önce satın alma işlemlerini doğrulama ile ilgili en iyi uygulamaları ele alacağız.

Kullanıcı tek seferlik ürün satın alma işlemi yaptıktan sonra güvenli arka uç sunucunuzdaki Pub/Sub abonesi bir Pub/Sub mesajı alır. Arka uç sunucunuzda şunları yapmanız gerekir:

  1. Pub/Sub mesajından purchaseToken öğesini ayrıştırın. Tüm satın alma işlemleri için tüm purchaseToken değerlerinin kaydını tutmanız gerekir.
  2. Mevcut satın alma işlemine ait purchaseToken değerinin önceki purchaseToken değerleriyle eşleşmediğini doğrulayın. purchaseToken, genel olarak benzersizdir. Bu nedenle, bu değeri veritabanınızda birincil anahtar olarak güvenle kullanabilirsiniz.
  3. Satın alma işleminin geçerli olduğunu Google ile doğrulamak için Google Play Developer API'deki purchases.products:get uç noktasını kullanın.
  1. Satın alma işlemi meşruysa ve daha önce kullanılmadıysa uygulama içi öğe veya abonelik için güvenli bir şekilde hak verebilirsiniz.
  2. Yetkiyi yalnızca satın alma durumu PURCHASED olduğunda vermeli ve PENDING satın alma işlemlerini doğru şekilde ele aldığınızdan emin olmalısınız. Daha fazla bilgiyi Bekleyen işlemleri işleme başlıklı makalede bulabilirsiniz.

Aşağıdaki kod örneği, Google Play Developer API için bir API istemcisi oluşturur. Bu bilgiyi daha sonra API çağrıları yapmak için kullanacağız.

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

/** Helper class to initialize the publisher APIs client library. */
public class AndroidPublisherHelper {
 /* Your application name */
 private static final String APPLICATION_NAME = "YourApplicationName";

 /* Load credentials from a JSON key file. Replace with the actual path to your downloaded service
  * account key file.
  */
 private static final String RESOURCES_CLIENT_SECRETS_JSON =
     "/path/to/your/service_account_key.json";

 /** Global instance of the JSON factory. */
 private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

 /* The API client */
 private static final AndroidPublisher ANDROID_PUBLISHER = init();

 /**
  * Performs all necessary setup steps for running requests against the API.
  *
  * @return the {@link AndroidPublisher} service
  */
 private static AndroidPublisher init(){
   try {
     // Authorization.
     Credential credential =
         GoogleCredential.fromStream(
                 AndroidPublisherHelper.class.getResourceAsStream(RESOURCES_CLIENT_SECRETS_JSON))
             .createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

     // Set up and return API client.
     return new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential)
         .setApplicationName(ApplicationConfig.APPLICATION_NAME)
         .build();
   } catch (GeneralSecurityException | IOException ex) {
     throw new RuntimeException("fail to initialize the publisher APIs client library", ex);
   }
 }
}

Ardından, API çağrısı yapacak mantığı ekleriz ve satın alma işlemini doğrulamak ve hakları doğru kullanıcıya vermek için daha önce oluşturulan alıcıyı değiştiririz.

AndroidPublisherHelper içinde, Google Play Developer API'sindeki Purchases.products:get uç noktasından ProductPurchase'i getirmek için aşağıdaki yöntemi ekleyin.

 /* Fetch the ProductPurchase for the one-time product purchase from
  * Purchases.products.get endpoint in the Google Play Developer API
  */
 public static ProductPurchase executeProductPurchasesGet(
     String packageName, String sku, String purchaseToken) {
   try {
     ProductPurchase productPurchase =
         ANDROID_PUBLISHER.purchases().products().get(packageName, sku, purchaseToken).execute();
     return productPurchase;
   } catch (IOException ex) {
     log.error("Exception was thrown while getting a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to fetch the purchase in case of transient failures.
     return null;
   }
 }

NotificationMessageReceiver bölümünde, satın alma işlemini doğrulayın ve bildirimde yer alan verilere göre sisteminizdeki doğru kullanıcıya yetki verin. Yinelenen işlemeyi önlemek için sunucunuzdaki purchaseToken izlemeye devam etmeniz gerekir.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   // Decode the data into a String from the message data field.
   String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
   // Parse the String into a JSON object.
   JSONObject messageJson = new JSONObject(jsonString);

   // Fetch the value for certain fields.
   String version = messageJson.getString("version");
   String packageName = messageJson.getString("packageName");

   // Process notification data based on your business requirements.
   // Process oneTimeProductNotification in the message.
   JSONObject oneTimeProductNotificationJson =
       messageJson.getJSONObject("oneTimeProductNotification");
   if (oneTimeProductNotificationJson != null) {
     String purchaseToken = oneTimeProductNotificationJson.getString("purchaseToken");
     String sku = oneTimeProductNotificationJson.getString("sku");
     int notificationType = oneTimeProductNotificationJson.getInt("notificationType");

     if (notificationType == 1) {
       // ONE_TIME_PRODUCT_PURCHASED - A one-time product was successfully purchased by a user.
       // Verify that the purchaseToken value does not match any previous purchaseToken values in
       // your backend system to avoid duplicate processing.
       ......
       // Fetch the ProductPurchase from Purchases.products.get endpoint
       ProductPurchase productPurchase =
         AndroidPublisherHelper.executeProductPurchasesGet(packageName, sku, purchaseToken);
       if (productPurchase != null && productPurchase.getPurchaseState() == 0) {
         // The purchase is valid and in PURCHASED state.

         // The account Id set in the App when launching the billing flow.
         String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
         // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
         // system.
       ......
       }
     }
     // Process subscriptionNotification in the message.
     JSONObject subscriptionNotificationJson = messageJson.getJSONObject("subscriptionNotification");
     if (subscriptionNotificationJson != null) {
       ......
     }
     // Process other notification data in the message as needed.
     ......
   }

   // Acknowledge the message to avoid repeated delivery.
   consumer.ack();
 }

7. Satın alma işleminin tamamlandığını Google'a bildirin.

Yetki verdikten sonra, tüketilebilir bir ürünü kullanmak veya tüketilemeyen bir ürünü onaylamak için güvenli arka uç sunucunuzdan Play Developer API'deki purchases.products:consume veya purchases.products:acknowledge uç noktalarını çağırarak satın alma işleminin işlendiğini Google'a bildirmeniz gerekir.

AndroidPublisherHelper bölümünde, Google Play Developer API'de purchases.products:consume veya purchases.products:acknowledge yöntemlerini çağırmak için aşağıdaki yöntemleri ekleyin.

 /* Consume the one-time product purchase by calling
  * Purchases.products.consume endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesConsume(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().consume(packageName, sku, purchaseToken).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while consuming a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly consumed in case of transient failures.
   }
 }

 /* Acknowledge the one-time product purchase by calling
  * Purchases.products.acknowledge endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesAcknowledge(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().acknowledge(packageName, sku, purchaseToken, new ProductPurchasesAcknowledgeRequest()).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while acknowledging a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly acknowledged in case of transient failures.
   }
 }

NotificationMessageReceiver içinde, arka uç sunucunuzda yetki verdikten sonra tüketilebilir ürün satın alma işlemini tüketin veya tüketilemeyen ürün satın alma işlemini onaylayın.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   ......
       String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
       // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
       // system.
       ......
       // If the product is a consumable product, consume the purchase.
       AndroidPublisherHelper.executeProductPurchasesConsume(packageName, sku, purchaseToken);
       // Or if the product is a non-consumable product, acknowledge the purchase.
       // AndroidPublisherHelper.executeProductPurchasesAcknowledge(packageName, sku, purchaseToken);
  ......

 }

Kullanıcıya satın alma yetkisi verildiğini Google Play'e bildirdiği için onay gereklidir. Yetki verdikten hemen sonra satın alma işlemini onaylamanız gerekir.

Tebrikler! Bu codelab'de gösterildiği gibi güvenilir satın alma işlemi yapılmasını sağlayan gerçek zamanlı geliştirici bildirimleriyle başarılı bir şekilde entegrasyon yaptınız. Şimdi her şeyin mükemmel şekilde çalıştığından emin olmak için Play Faturalandırma Test Alanı'nı inceleyelim. Bu kullanıcı dostu araç, Play Faturalandırma entegrasyonunuzu test etmenize yardımcı olmak için tasarlanmıştır.

8. Play Faturalandırma Test Alanı ile test etme

Güvenle kullanıma sunmak için entegrasyonunuzu geliştirme sürecinde test etmeniz gerekir. Google Play Faturalandırma Test Alanı, geliştiricilerin Google Play'in faturalandırma sistemiyle entegrasyonlarını test etmelerine yardımcı olan ücretsiz bir Android uygulamasıdır. Geliştiricilere Google Play Faturalandırma özelliklerini test etmeleri, daha hızlı entegrasyon sağlamaları ve güvenle lansman yapmaları için kolay ve rahat bir yol sunar.

Play Faturalandırma Test Alanı, aşağıdakiler de dahil olmak üzere farklı senaryoları test etmenize yardımcı olacak çeşitli test özellikleri sunar:

Google Play Faturalandırma Test Alanı uygulamasına sürekli olarak yeni test özellikleri ekliyoruz. Google Play Faturalandırma Test Alanı'nı Play Store'dan indirip yükleyebilir veya Google Play Faturalandırma Test Alanı ile test etme hakkında daha fazla bilgi edinmek için Entegrasyonunuzu test etme başlıklı makaleyi inceleyebilirsiniz.

BillingResponseCode'u test etmek için Play Faturalandırma Test Alanı'nı kullanma

Uygulamanızı Play Faturalandırma Kitaplığı ile entegre ederken tüm BillingResponseCode akışlarını test etmek, Play Store ile Play'in arka ucu arasındaki iletişim üzerinde fazla kontrolünüz olmadığı için yaygın bir zorluktur. Play Faturalandırma Test Alanı uygulamasındaki yanıt simülatörü özelliği, çeşitli karmaşık hata senaryolarını test etmek için Play Faturalandırma Kitaplığı'nın hata kodu yanıtlarını yapılandırmanıza olanak tanır.

Örneğin, uygulamanız başarılı satın alma işlemini algıladıktan sonra satın alma işlemini tüketmek için uygulamanızda mantığı uyguladınız. Uygulamanızın, ağ hatası nedeniyle satın alma işlemini kullanamadığı ve arka uç sunucunuzdaki RTDN alıcısının mesajı alıp satın alma işlemini doğru şekilde gerçekleştirdiği senaryoyu test etmek istiyorsunuz. Testiniz için senaryoyu simüle etmek üzere Yanıt Simülasyonu'ndan yararlanabilirsiniz. Aşağıdaki bilgiler, Play Faturalandırma Test Alanı Yanıt Simülasyon Aracı ile test etme adımlarında size yol gösterecektir.

Yanıt simülatörü ile test etme

Yanıt simülatörü ile test yaparken uygulamanız, Play Faturalandırma Test Alanı'nda yapılandırdığınız yanıt kodunu almak için Play Faturalandırma Test Alanı ile iletişim kurar.

Play Faturalandırma Kitaplığı için faturalandırma geçersiz kılma testini etkinleştirme

Yanıt Simülasyonu ile uygulamanız arasında iletişimi etkinleştirmek için öncelikle uygulamanızdan Play Faturalandırma Kitaplığı'nda faturalandırma geçersiz kılma testini etkinleştirmeniz gerekir. Bunu yapmak için aşağıdaki meta veri etiketlerini uygulamanızın AndroidManifest.xml dosyasına ekleyin.

<manifest ... >
  <application ... >
    ...
     <meta-data
      android:name="com.google.android.play.largest_release_audience.NONPRODUCTION"
      android:value="" />
    <meta-data
      android:name="com.google.android.play.billingclient.enableBillingOverridesTesting"
      android:value="true" />
  </application>
</manifest>

Uygulamanızı güncellenen AndroidManifest.xml dosyasıyla oluşturun. Uygulamanız artık Play Faturalandırma Test Alanı yanıt simülatörü için hazır.

Uygulamanızı test ettikten sonra üretim ortamına dağıtırken bu meta veri etiketlerini içermeyen ayrı bir AndroidManifest.xml dosyası kullanmanız veya bu etiketleri AndroidManifest.xml dosyasından kaldırdığınızdan emin olmanız gerekir.

Play Faturalandırma Kitaplığı hatalarını simüle etme

Simüle edilmiş Play Faturalandırma Kitaplığı hatalarıyla test etmek için önce Play Faturalandırma Test Alanı uygulamasında yanıt kodunu yapılandırın, ardından uygulamanızda testi gerçekleştirin.

Yanıt kodu yapılandırma

  1. Play Faturalandırma Test Alanı uygulamasında, uygulamanız için lisans test edici hesabıyla oturum açın. Aşağıdaki resimde, Yanıt Simülatörü kartı da dahil olmak üzere Play Faturalandırma Test Alanı Kontrol Paneli gösterilmektedir.

Yanıt simülatörlü Play Faturalandırma Test Alanı kontrol paneli

  1. Yanıt Simülatörü ekranına gitmek için Yanıt Simülatörü kartında Yönet'i tıklayın.
  2. İstendiğinde, uygulamanızın bağlantı durumunu görmek için Play Faturalandırma Test Alanı'ndan gelen bildirimlere izin verin.
  3. Henüz etkinleştirilmemişse Play Faturalandırma Kitaplığı yanıtını simüle et anahtarını etkinleştirin.

c841baa4c96bf306.png

  1. Test etmek istediğiniz Play Faturalandırma Kitaplığı API'leri için bir yanıt kodu seçin. Tüketilen satın alma işlemindeki hatayı simüle etmek için consumeAsync API'si için bir hata kodu seçin. Seçimleriniz otomatik olarak kaydedilir. Artık yanıt simülatörü, seçilen yanıt kodlarını uygulamanıza göndermeye hazırdır.

Uygulamanızı test etme

Artık uygulamanızı test ederek yapılandırılan hata senaryosunda her şeyin beklendiği gibi çalıştığını doğrulayabilirsiniz. Uygulamanızı açın ve Play Faturalandırma Kitaplığı API yöntemini tetikleyin. Uygulamanız, satın alma işlemini kullanmak için consumeAsync çağrısını yaparsa uygulamanız, az önce yapılandırdığınız gibi hata kodunu alır. Hata koduna göre uygulamanızın düzgün çalışıp çalışmadığını ve arka uç sunucunuzun satın alma işlemini doğru şekilde işleyip işlemediğini doğrulayabilirsiniz.

Testinizi tamamladıktan sonra yanıtı simüle etmeyi durdurmak için Play Faturalandırma Kitaplığı yanıtını simüle etme anahtarını kapatmanız yeterlidir.

Play Faturalandırma Test Alanı ile test etme hakkında daha fazla bilgi edinin veya lisans test kullanıcılarıyla uygulama içi faturalandırmayı test etme hakkında daha fazla bilgi için Yardım Merkezi'ni ziyaret edin.

9. Tebrikler!

Bu codelab'i tamamladınız. Artık kullanıcı deneyiminizi iyileştirmek için uygulama para kazanma stratejinizi optimize etmeye ve kullanıcı memnuniyeti, satın alma dönüşümü sayısı ve abone kaybı oranında iyileşmeler sağlamaya hazırsınız.

Gerçek Zamanlı Geliştirici Bildirimleri'nden ve Play Faturalandırma Test Alanı tamamlayıcı uygulamasından yararlanarak hem tek seferlik satın alım hem de abonelikler için satın alma yaşam döngüsü olaylarını proaktif bir şekilde ele alabilirsiniz.

Bu araçlarla, ilgi çekici geri kazanma stratejilerini etkili bir şekilde uygulayabilir, entegrasyonla ilgili sorunları hızlıca çözebilir ve sonuç olarak uygulamanızı veya oyununuzu güvenle yayınlamak için kullanıcı deneyimini ve gelir akışlarını iyileştirebilirsiniz.

Bu codelab'i tamamlayarak artık satın alma yolculuğunun tamamını yönetme ve Play Faturalandırma Test Alanı ile uygulamanızı titizlikle test etme becerisine sahipsiniz. Böylece sorunsuz bir kullanıcı deneyimi sağlayabilir ve Google Play'deki para kazanma potansiyelinizi en üst düzeye çıkarabilirsiniz.