Play Faturalandırma Entegrasyonunuzdan En İyi Şekilde Yararlanma

1. Genel Bakış

Google Play tarafından sunulan bu Play Faturalandırma Kitaplığı entegrasyon kod laboratuvarını kullanarak gelir kaynaklarınızı optimize edin ve uygulamanızı güvenle yayınlayın. Bu yapılandırılmış kod laboratuvarı, güvenilir satın alma işlemleri oluşturma, 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.

Uygulama ve oyunlarınız için abonelikler ve tek seferlik ürünlerle ilgili anlık geliştirici bildirimlerini (RTDN'ler) ve Play Billing Lab'i ayarlamanıza yardımcı oluruz. Abone kaybını nasıl azaltacağınızı, sahtekarlık ve kötüye kullanıma karşı nasıl korunacağınızı, uç durumları nasıl test edeceğinizi, olası sorunları nasıl simüle edeceğinizi, yeniden üreteceğinizi ve gidereceğinizi, ayrıca kullanıcıları etkilemeden teklifler ve fiyat değişiklikleriyle nasıl deneysel çalışmalar yapacağınızı öğreneceksiniz.

Bu eğitim sonunda, uygulamanızı ve güncellemelerinizi güvenle kullanıma sunmaya, geri kazanma stratejilerini uygulamaya, entegrasyon sorunlarını hızlıca çözmeye, yatırım getirisini artırmaya, premium bir deneyim sunmaya ve hazır olacaksınız.

Ön koşullar

Neler öğreneceksiniz?

  • Satın alma dönüşümlerini ve müşteri elde tutma oranını artıracak tekniklerle büyümeyi optimize etmek için satın alma yaşam döngülerinizi doğru şekilde yönetme
  • Google Cloud Pub/Sub'ı kullanarak gerçek zamanlı geliştirici bildirimlerini (RTDN) ayarlama. Bu bildirimler daha sonra kullanıcıları geri kazanma kampanyaları ve diğer yaşam döngüsü yönetimi stratejilerini uygulamak için kullanılabilir.
  • İstenmeyen geri ödemeleri veya sahtekarlık ve kötüye kullanım risklerini azaltmak için arka uç sunucunuzda, bildirimleri doğru izleme ve uygunlukla güvenli bir şekilde işlemesi için bir alıcı ayarlama
  • Geliştirme maliyetlerini düşürürken kullanıcı deneyiminizi iyileştirmek için 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ı dikkate almalıdır. Sorunsuz bir deneyim, satın alma hazırlığını artırabilir ve uygulamayı kullanmayı bırakma oranını düşürebilir.

Tek seferlik satın alma veya abonelik için yaygın bir satın alma akışı birden fazla aşama içerir:

  1. Kullanıcı, satın alınacak ürünlere göz atar.
  2. Kullanıcının satın alma ve ödeme işlemlerini tamamlaması için satın alma akışını başlatın.
  3. Tamamlanan satın alma işlemiyle ilgili olarak sunucunuzu bilgilendirme
  4. Satın alma işlemini sunucunuzda doğrulayın.
  5. Kullanıcıya içerik verin.
  6. İçeriğin yayınlandığını 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 uçta, kullanıcıların satın aldığı ayrıcalıklarla ilgili güncel bilgiler bulundurmanız çok önemlidir. Bu, satın alma işlemlerini izlemek ve kullanıcı deneyiminin diğer yönlerini (ör. platformlar arası haklardan yararlanma) yönetmek için önemlidir.

Gerçek zamanlı geliştirici bildirimleri (RTDN), satın alma yaşam döngüsünün bu farklı aşamalarını belirlemenin mükemmel bir yoludur ve hem gerçek zamanlı performans izleme aracı hem de aboneleri geri kazanma stratejilerini etkinleştirme aracı olarak etkili bir şekilde kullanılabilir.

Örneğin, kullanıcınızın yeni bir öğe satın aldığını veya ödemesini kaçırdığı için aboneliğin ek süreye girdiğini varsayalım. Doğru RTDN ile kullanıcının durumunun değiştiğini gerçek zamanlı olarak algılayabilir ve kullanıcıyı yeni satın aldığı ürünle daha fazla etkileşime geçirerek veya aboneliklerine devam etmek için ödeme ayrıntılarını güncellemelerini hatırlatan e-postalar göndererek buna göre hareket edebilirsiniz.

RTDN'ler, kullanıcının istemcisinde sorun olduğunda bile satın alma işlemlerini yönetmenize yardımcı olacak ek sunucu tarafı kontrolleri eklemenin mükemmel bir yoludur. Bir kullanıcının başarılı bir satın alma işlemi gerçekleştirdiğini ve Google'dan onay aldığını, ancak cihazının satın alma işlemini gerçekleştirmeden önce ağ bağlantısını kaybettiğini ve uygulamanızın satın alma işlemiyle ilgili bildirimi satın alma dinleyicisi aracılığıyla aldığını varsayalım. RTDN'ler sayesinde sunucunuz aracılığıyla 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 yapılması sağlanır.

Şu anda desteklenen tüm RTDN türleri hakkında daha fazla bilgiyi burada bulabilirsiniz. Her RTDN türü, farklı bir satın alma durumunu belirtir. Kullanım alanlarınızda gerektiği gibi doğru şekilde işlenmesini sağlamak için ilgili işlem mekanizmalarını uygulamanız çok önemlidir. Bu codelab'de, kullanıcı uygulamanızda başarılı bir şekilde satın alma işlemi gerçekleştirdiğinde güvenli arka uç sunucunuzda RTDN mesajını işleyen bir örnekte size yol gösterilir. Bu örnekte mesajın alınması, satın alma işleminin doğrulanması ve doğru kullanıcıya hak verilmesi gibi işlemler yer alır. Ardından, uygulamanız için RTDN'leri nasıl yapılandıracağınızı gösteririz.

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 hemen yanıt vermenize olanak tanımak 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 gerçek zamanlı 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ılavuzuna göz atı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ı makalede yer alan talimatları uygulayın.

Pub/Sub aboneliği oluşturma

Bir konuya yayınlanan mesajları almak için söz konusu 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 pull aboneliği olarak nasıl yapılandıracağınızı öğrenmek için Cloud Pub/Sub Abone Rehberi'ni okuyun. Bu codelab'de, güvenli arka uç sunucunuzun mesajları almak için Cloud Pub/Sub sunucusuna istek başlatmasını gerektiren bir alma aboneliğiyle çalışacağız.
  1. Abonelik oluşturmak için Abonelik ekleme başlıklı makaledeki talimatları uygulayın.

Konunuzla ilgili yayınlama hakları verme

Cloud Pub/Sub, konunuzda bildirim yayınlamak için Google Play'e ayrıcalık vermenizi gerektirir.

  1. Google Cloud Console'u açın.
  2. Projenizi seçin, ardından arama çubuğunda "Pub/Sub"'ı arayın ve Pub/Sub yapılandırma sayfasına gidin. Pub/Sub yapılandırma sayfasını arayın ve bu sayfaya gidin
  3. Konunuzu bulup izin ayarını açın. İzin ayarını açma
  4. google-play-developer-notifications@system.gserviceaccount.com hizmet hesabını eklemek ve Pub/Sub yayıncısı rolünü vermek için ANA HESAP EKLE'yi tıklayın. google-play-developer-notifications@system.gserviceaccount.com hizmet hesabını ekleyin ve bu hesaba Pub/Sub yayıncısı rolünü verin
  5. Konu ayarlarını tamamlamak için Kaydet'i tıklayın. Konu ayarlarını tamamlamak için Kaydet'i tıklayın.

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

Play Faturalandırma entegrasyonunuzu önemli ölçüde iyileştirmek için gerçek zamanlı geliştirici bildirimlerini (RTDN) nasıl ayarlayacağınızı öğrenin. Kişiselleştirilmiş mesajlarla satın alma güvenilirliğini artırabilir, genel YG'nizi artırmak için sahtekarlığı ve kötüye kullanımı da ö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. Arka uç sistemlerinizin, kullanıcı haklarıyla ilgili gerçek durumla otomatik olarak senkronize edilmesine yardımcı olurlar. Böylece istemci tarafı sınırlamalarının ötesine geçer ve anında ve uygun şekilde yanıt vermenizi sağlarlar.

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. Play ile para kazanma > 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ıdır ve topic_name, 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 ayarlandığından ve 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örüntülenir. Bu konu için bir abonelik eklediyseniz test mesajını alırsınız. Alma aboneliği için Cloud Console'da aboneliğe gidin, Mesajları Görüntüle'yi tıklayın ve mesajları almaya devam edin. Cloud Pub/Sub'ın tekrar tekrar yayınlamasını önlemek için aldığınız tüm mesajları onaylamanız gerekir. Push aboneliği için test mesajının push uç noktanıza teslim edilip edilmediğini kontrol edin. Başarılı bir yanıt kodu, onay mesajı görevi görür. Yayınlama işlemi 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 konuya 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 gönder: 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ünlerle ilgili tüm bildirimleri gönder: Tüm abonelik ve geçersiz satın alma işlemleri etkinlikleri için bildirim alın. Ayrıca ONE_TIME_PRODUCT_PURCHASED ve ONE_TIME_PRODUCT_CANCELED gibi tek seferlik ürün satın alma etkinlikleri de alırsınız. Bu satın alma etkinlikleri hakkında daha fazla bilgi edinmek için Tek seferlik satın alma 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. Bu sayede, geri kazanma mesajları aracılığıyla kullanıcı kaybı veya sahtekarlık ve kötüye kullanım gibi yaygın sorunları giderecek araçlara sahip oldunuz. 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 durumuyla ilgili olarak güncel tutmanız çok önemlidir. Örneğin, bir kullanıcı uygulamada ödeme yaparak satın alma işlemini başarıyla tamamladığında, içeriği en kısa sürede hesabına teslim alması 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ızda satın alma işlemlerini algılamanın birden fazla yolunu sunar. Tamamlanmış bir satın alma işlemi algılandığında uygulamanızın, satın alma işlemini doğrulamak, içeriği doğru kullanıcıya vermek ve ardından satın alma işleminin işlendiğini Google'a bildirmek için arka uç sunucunuzu bilgilendirmesi gerekir. Ancak uygulamanız çeşitli nedenlerden dolayı satın alma işlemini zamanında algılayamamış olabilir. Örneğin, bir kullanıcı başarılı bir satın alma işlemi gerçekleştirip Google'dan onay alabilir ancak cihazı, uygulamanız Play Faturalandırma Kitaplığı arayüzü üzerinden bildirim almadan önce ağ bağlantısını kaybedebilir. RTDN, kullanıcının istemcisinde sorun olsa bile satın alma işlemlerini yönetmenize yardımcı olmak için sunucu tarafında ek denetimler sağlar. RTDN, satın alma durumu değişiklikleri üzerine sunucunuza bağımsız bildirimler gönderir. Böylece, satın alma durumu değişikliklerini olası istemci sorunlarından bağımsız olarak ikinci bir yol üzerinden neredeyse anında tanıyabilir ve satın alma işleminin daha güvenilir olmasını 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 mevcuttur. 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/kullanmak için aboneye ekleme 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 olarak kodlanmış 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şleyeceği 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ğrulamayı 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, arka uç sunucunuzda RTDN mesajlarını işlemeyle ilgili en iyi uygulamaları ele alacağız.

5. Uygulamanızdaki satın alma akışında kullanıcı tanımlayıcılarını ekleme

Sunucunuz, satın alma durumu güncellemesiyle ilgili RTDN mesajını aldığında, satın alma işlemini işlemek için hangi kullanıcının satın alma işlemini gerçekleştirdiğini bilmesi gerekir (ör. içeriği doğru kullanıcıya yayınlamak). Bunu, uygulamanızda satın alma akışını başlatırken obfuscatedAccountId kullanarak satın alma işlemini gerçekleştiren kullanıcıyla ilgili sahip olduğunuz tüm kullanıcı tanımlayıcılarını ekleyerek yapabilirsiniz. Örnek bir tanımlayıcı, kullanıcının sisteminizde oturum açmasının karartılmış bir sürümü olabilir. Bu parametrenin ayarlanması, Google'ın sahtekarlığı tespit etmesine yardımcı olabilir. Ayrıca, kullanıcılara hak verme bölümünde açıklandığı gibi satın alma işlemlerinin doğru kullanıcıyla ilişkilendirilmesini sağlamanıza yardımcı olabilir.

Aşağıda, uygulamada satın alma akışı başlatılırken obfuscatedAccountId ayarlanarak kullanıcı tanımlayıcısını eklemek için kullanılacak ö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. Hak vermeden önce satın alma işlemlerini doğrulama

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

Bir kullanıcı tek seferlik ürün satın aldı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ındaki 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şleminin purchaseToken değerinin önceki purchaseToken değerleriyle eşleşmediğini doğrulayın. purchaseToken dünya genelinde benzersiz olduğundan bu değeri veritabanınızda birincil anahtar olarak güvenle kullanabilirsiniz.
  3. Satın alma işleminin Google tarafından geçerli olduğunu doğrulamak için Google Play Developer API'deki purchases.products:get uç noktasını kullanın.
  1. Satın alma işlemi geçerliyse ve daha önce kullanılmadıysa uygulama içi öğeye veya aboneliğe erişim iznini güvenle verebilirsiniz.
  2. Yalnızca satın alma durumu PURCHASED olduğunda hak vermeniz ve PENDING satın alma işlemlerini doğru şekilde işlediğinizden emin olmanız gerekir. Daha fazla bilgiyi Onay 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. 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ını yapacak mantığı ekleriz ve daha önce oluşturulan alıcıyı, satın alma işlemini doğrulamak ve doğru kullanıcıya hak vermek için değiştiririz.

AndroidPublisherHelper dosyasına, Google Play Developer API'deki Purchases.products:get uç noktasından ProductPurchase'ı almak 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'te satın alma işlemini doğrulayın ve bildirime dahil edilen verilere göre sisteminizde doğru kullanıcıya hak verin. Yinelenen işlemlerden kaçınmak için sunucunuzda purchaseToken değerini 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. Google'a satın alma işleminin yapıldığını bildirme

Kullanım hakkı verildikten sonra, tüketim amaçlı bir ürünü tüketmek veya tüketim amaçlı olmayan 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 Google'a satın alma işleminin yapıldığını bildirmeniz gerekir.

AndroidPublisherHelper içinde, Google Play Developer API'sinde purchases.products:consume veya purchases.products:acknowledge çağrısı yapmak 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'te, arka uç sunucunuzda hakkı verdikten sonra tüketilebilir ürün satın alma işlemini tüketin veya tüketilemez ü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);
  ......

 }

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

Tebrikler! Gerçek zamanlı geliştirici bildirimleriyle başarılı bir şekilde entegrasyon gerçekleştirerek bu kod laboratuvarının gösterdiği gibi güvenilir satın alma işlemi işlemeyi etkinleştirdiniz. Artık her şeyin sorunsuz çalıştığından emin olmak için Play Faturalandırma entegrasyonunuzu test etmenize yardımcı olmak üzere tasarlanmış kullanıcı dostu bir araç olan Play Faturalandırma Test Alanı'nı keşfedelim.

8. Play Billing Lab ile test etme

Güvenle kullanıma sunmak için entegrasyonunuzu geliştirme boyunca test etmeniz gerekir. 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ştiricilerin Play Faturalandırma özelliklerini test etmeleri, daha hızlı entegrasyon sağlamaları ve güvenle lansman yapmaları için kolay ve kullanışlı bir yol sunar.

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

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

BillingResponseCode'yi test etmek için Play Billing Lab'i kullanma

Play Store ile Play'in arka uç sistemi arasındaki iletişim üzerinde fazla kontrol sahibi olmadığınız için uygulamanızı Play Faturalandırma Kitaplığı ile entegre ederken tüm BillingResponseCode akışlarını test etmek yaygın bir sorundur. 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üketecek mantığı uygulamanıza uyguladınız. Uygulamanızın, ağ hatası nedeniyle satın alma işlemini gerçekleştiremediği ve arka uç sunucunuzdaki RTDN alıcısının mesajı alıp satın alma işlemini doğru şekilde işlediği senaryoyu test etmek istiyorsunuz. Testiniz için senaryoyu simüle etmek üzere Yanıt Simülasyon Aracı'ndan yararlanabilirsiniz. Aşağıdaki adımlar, 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üyle test yaparken uygulamanız, Play Billing Lab Yanıt Simülatörü'nde yapılandırdığınız yanıt kodunu almak için Play Billing Lab ile iletişim kurar.

Faturalandırmayı etkinleştirme, Play Faturalandırma Kitaplığı için testleri geçersiz kılar

Yanıt Simülasyon Aracı ile uygulamanız arasında iletişimi etkinleştirmek için öncelikle uygulamanızdan Play Faturalandırma Kitaplığı için faturalandırma geçersiz kılma testini etkinleştirmeniz gerekir. Bunu yapmak üzere uygulamanızın AndroidManifest.xml dosyasına aşağıdaki meta veri etiketlerini 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üncellenmiş AndroidManifest.xml dosyasıyla derleyin. Uygulamanız artık Play Billing Lab Yanıt Simülatörü için hazırdır.

Testten sonra uygulamanızı üretim ortamına dağıtırken bu meta veri etiketlerini içermeyen ayrı bir AndroidManifest.xml dosyası kullanmalı veya bu etiketleri AndroidManifest.xml dosyasından kaldırdığınızdan emin olmalısınız.

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

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

Yanıt kodu yapılandırması

  1. Uygulamanız için bir lisans test cihazı hesabıyla Play Billing Lab uygulamasında oturum açın. Aşağıdaki resimde,Yanıt Simülatörü kartı da dahil olmak üzere Play Billing Lab Kontrol Paneli gösterilmektedir.

Yanıt Simülatörü ile Play Billing Lab 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 Billing Lab'den gelen bildirimlere izin verin.
  3. Henüz etkinleştirilmemişse Play Faturalandırma Kitaplığı yanıtları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üketen satın alma işlemi için hatayı simüle etmek üzere consumeAsync api 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 yapılandırılmış hata senaryosundaki her şeyin beklendiği gibi çalışıp çalışmadığını doğrulamak için uygulamanızı test edebilirsiniz. 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ı yaparsa uygulamanız, az önce yapılandırdığınız 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 et anahtarını kapatmanız yeterlidir.

Play Billing Lab ile test etme hakkında daha fazla bilgi edinin veya Lisans Test Ekipleri ile uygulama içi faturalandırmayı test etme hakkında daha fazla bilgi için Yardım Merkezi'ni ziyaret edin.

9. Tebrikler!

Bu kod laboratuvarını tamamladınız ve artık kullanıcı memnuniyeti, satın alma dönüşümleri ve abone kaybında iyileştirmeler yapmak için kullanıcı deneyiminizi iyileştirmek amacıyla uygulamanızdan para kazanma özelliğini stratejik olarak optimize etmeye hazırsınız.

Gerçek zamanlı geliştirici bildirimlerinden ve Play Billing Lab tamamlayıcı uygulamasından yararlanarak hem tek seferlik satın alma işlemleri hem de abonelikler için satın alma döngüsü etkinliklerini proaktif olarak ele alabilirsiniz.

Bu araçlar sayesinde, uygulamanızı veya oyununuzu güvenle kullanıma sunmak için ilgi çekici yeniden kazanma stratejilerini etkili bir şekilde uygulayabilir, entegrasyon sorunlarını hızlı bir şekilde çözebilir ve nihayetinde kullanıcı deneyimini ve gelir kaynaklarını iyileştirebilirsiniz.

Bu codelab'i tamamlayarak satın alma yolculuğunun tamamını yönetme ve uygulamanızı Play Billing Lab ile titizlikle test etme becerilerine sahip oldunuz. Böylece sorunsuz bir kullanıcı deneyimi sağlayabilir ve Google Play'de para kazanma potansiyelinizi en üst düzeye çıkarabilirsiniz.