Ödemeleri Digital Goods API ve Payment Request API ile Google Play Faturalandırma üzerinden alma

André Cipriani Bandarra
André Cipriani Bandarra

Uygulamanız Google Play üzerinden dağıtılıyorsa ve dijital ürünler satmak ya da abonelik sunmak istiyorsanız Google Play Faturalandırma'yı kullanmanız gerekir. Google Play Faturalandırma; kataloğunuzu, fiyatlarınızı ve aboneliklerinizi yönetmenizi sağlayan araçlar, faydalı raporlar ve kullanıcılarınıza zaten aşina olan Play Store tarafından desteklenen bir ödeme akışı sunar.

Güvenilir Web Etkinlikleri kullanılarak oluşturulan ve Google Play Store üzerinden yayınlanan uygulamalar için artık Google Play Faturalandırma ile entegrasyon sağlamak üzere Payment Request API'yi ve Digital Goods API'yi kullanabilirsiniz. Android ve ChromeOS için Chrome 101 ve sonraki sürümlerde kullanılabilir.

Bu kılavuzda, PWA'nıza Google Play Faturalandırma desteğini eklemeyi ve hem ChromeOS hem de Play Store'da Google Play Store'da dağıtım için paketlemeyi öğreneceksiniz.

PWA'nıza Play Faturalandırma desteği eklemek için iki web platformu API'si kullanırsınız. Digital Goods API, SKU bilgilerini toplamak ve Play Store'dan satın alma ve yararlanma haklarını kontrol etmek için kullanılır. Ödeme İsteği API'si, ödeme yöntemi olarak Google Play Store'u yapılandırmak ve satın alma akışını tamamlamak için kullanılır.

Play Store'daki uygulamalardan nasıl para kazanılır?

Uygulamanız, Play Store'da Google Play Faturalandırma ile iki şekilde para kazanabilir:

  • Uygulama içi satın alma işlemleri, ek özellikler veya reklamları kaldırma gibi hem dayanıklı hem de tüketilebilir sanal ürünlerin satılmasına olanak tanır.
  • Abonelikler, kullanıcılarınıza haber abonelikleri veya üyelikler gibi yinelenen bir ücret karşılığında içerik veya hizmetlere sürekli erişim imkanı sunar.

Koşullar

Google Play Faturalandırma'yı kurmak için şunlara ihtiyacınız olacaktır:

Bubblewrap projesini güncelleme

Bubblewrap yüklü değilse yüklemeniz gerekir. Nasıl başlayacağınızla ilgili ayrıntılar için Hızlı Başlangıç Kılavuzu'na bakın. Bubblewrap'ı zaten kullanıyorsanız 1.8.2 veya üzeri bir sürüme güncellediğinizden emin olun.

Bubble wrap'ta bu özellik bir bayrağın arkasında da yer almaktadır. Etkinleştirmek için projenin kök dizininde bulunan twa-manifest.json bölümünden proje yapılandırmasını değiştirmeniz ve hem alphaDependencies hem de playBilling özelliğini etkinleştirmeniz gerekir:

  ...,
  "enableNotifications": true,
  "features": {
    "playBilling": {
      "enabled": true
    }
  },
  "alphaDependencies": {
    "enabled": true
  },
  ...

Yapılandırma dosyası güncellendikten sonra, yapılandırmayı projeye uygulamak için bubblewrap update komutunu ve ardından yeni bir Android paketi oluşturmak ve bu paketi Play Store'a yüklemek için bubblewrap build komutunu çalıştırın.

Digital Products API'nin ve Google Play Faturalandırma'nın kullanılabilirliğini algılayan özellik

Digital Goods API, şu anda yalnızca PWA bir Güvenilir Web Etkinliği içinde yürütüldüğünde Chrome tarafından desteklenir ve window nesnesinde getDigitalGoodsService olup olmadığı kontrol edilerek kullanılabilir olup olmadığı tespit edilebilir:

if ('getDigitalGoodsService' in window) {
 // Digital Goods API is supported!
}

Digital Goods API, tüm tarayıcılarda kullanılabilir ve farklı mağazaları destekleyebilir. Belirli bir mağaza arka ucunun desteklenip desteklenmediğini kontrol etmek için mağaza kimliğini parametre olarak ileten getDigitalGoodsService() yöntemini çağırmanız gerekir. Google Play Store, https://play.google.com/billing dizesiyle tanımlanır:

if ('getDigitalGoodsService' in window) {
  // Digital Goods API is supported!
  try {
    const service =
        await window.getDigitalGoodsService('https://play.google.com/billing');
    // Google Play Billing is supported!

  } catch (error) {
    // Google Play Billing is not available. Use another payment flow.
    return;
  }
}

SKU ayrıntılarını alma

Dijital Ürünler API'si getDetails() sayesinde ürün başlığı, açıklama ve en önemlisi fiyat gibi bilgilerin ödeme arka ucundan alınmasını sağlar.

Ardından bu bilgileri kullanıcı arayüzünüzde kullanabilir ve kullanıcıya daha fazla ayrıntı sağlayabilirsiniz:

const skuDetails = await service.getDetails(['shiny_sword', 'gem']);
for (item of skuDetails) {
  // Format the price according to the user locale.
  const localizedPrice = new Intl.NumberFormat(
      navigator.language,
      {style: 'currency', currency: item.price.currency}
    ).format(item.price.value);

  // Render the price to the UI.
  renderProductDetails(
        item.itemId, item.title, localizedPrice, item.description);
}

Satın alma akışını oluşturun

PaymentRequest'i oluşturan kişi iki parametre alır: ödeme yöntemleri listesi ve ödeme ayrıntıları listesi.

Güvenilir Web Etkinliği'ndeyken Google Play faturalandırma ödeme yöntemini kullanmanız gerekir. Bunu yapmak için tanımlayıcı olarak https://play.google.com/billing'i ayarlamanız ve ürün SKU'sunu veri üyesi olarak eklemeniz gerekir:

async function makePurchase(service, sku) {
   // Define the preferred payment method and item ID
   const paymentMethods = [{
       supportedMethods: "https://play.google.com/billing",
       data: {
           sku: sku,
       }
   }];

   ...
}

Ödeme ayrıntıları gerekli olsa bile, Play Faturalandırma bu değerleri göz ardı eder ve Play Console'da SKU'yu oluştururken ayarlanan değerleri kullanır. Böylece bu değerler sahte değerlerle doldurulabilir:

const paymentDetails = {
    total: {
        label: `Total`,
        amount: {currency: `USD`, value: `0`}
    }
};

const request = new PaymentRequest(paymentMethods, paymentDetails);

Ödeme akışını başlatmak için ödeme isteği nesnesinde show() öğesini çağırın. Taahhüt başarılı olursa ödeme başarılı olmuş olabilir. Ödeme başarısız olursa kullanıcı ödemeyi iptal etmiş olabilir.

Vaat başarılı olursa satın alma işlemini doğrulamanız ve onaylamanız gerekir. Sahtekarlığa karşı koruma sağlamak için bu adım, arka ucunuz kullanılarak uygulanmalıdır. Doğrulamayı arka ucunuzda nasıl uygulayacağınızı öğrenmek için Play Faturalandırma belgelerine göz atın. Satın alma işlemini onaylamazsanız üç gün sonra kullanıcıya geri ödeme alır ve Google Play satın alma işlemini iptal eder.

...
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
    const paymentResponse = await request.show();
    const {purchaseToken} = paymentResponse.details;

    // Call backend to validate and acknowledge the purchase.
    if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
        // Optional: tell the PaymentRequest API the validation was
        // successful. The user-agent may show a "payment successful"
        // message to the user.
        const paymentComplete = await paymentResponse.complete('success');
    } else {
        // Optional: tell the PaymentRequest API the validation failed. The
        // user agent may show a message to the user.
        const paymentComplete = await paymentResponse.complete('fail');
    }
} catch(e) {
    // The purchase failed, and we can handle the failure here. AbortError
    // usually means a user cancellation
}
...

İsteğe bağlı olarak, satın alma işlemini "kullanıldı" olarak işaretlemek ve tekrar satın alınmasına izin vermek için purchaseToken'da consume() çağrılabilir.

Her şeyi bir araya getirdiğimizde, satın alma yöntemi şöyle görünür:

async function makePurchase(service, sku) {
    // Define the preferred payment method and item ID
    const paymentMethods = [{
        supportedMethods: "https://play.google.com/billing",
        data: {
            sku: sku,
        }
    }];

    // The "total" member of the paymentDetails is required by the Payment
    // Request API, but is not used when using Google Play Billing. We can
    // set it up with bogus details.
    const paymentDetails = {
        total: {
            label: `Total`,
            amount: {currency: `USD`, value: `0`}
        }
    };

    const request = new PaymentRequest(paymentMethods, paymentDetails);
    try {
        const paymentResponse = await request.show();
        const {purchaseToken} = paymentResponse.details;

        // Call backend to validate and acknowledge the purchase.
        if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
            // Optional: consume the purchase, allowing the user to purchase
            // the same item again.
            service.consume(purchaseToken);

            // Optional: tell the PaymentRequest API the validation was
            // successful. The user-agent may show a "payment successful"
            // message to the user.
            const paymentComplete =
                    await paymentResponse.complete('success');
        } else {
            // Optional: tell the PaymentRequest API the validation failed.
            // The user agent may show a message to the user.
            const paymentComplete = await paymentResponse.complete('fail');
        }
    } catch(e) {
        // The purchase failed, and we can handle the failure here.
        // AbortError usually means a user cancellation
    }
}

Mevcut satın alma işlemlerinin durumunu kontrol etme

Digital Goods API, kullanıcının başka bir cihazdan, önceki bir yüklemeden, bir promosyon kodundan kullanılmış olduğundan veya yalnızca uygulamayı son kez açtığında yararlanma hakkının (henüz kullanılmamış uygulama içi satın alma işlemleri veya devam eden abonelikler) olup olmadığını kontrol etmenizi sağlar.


const service =
     await window.getDigitalGoodsService('https://play.google.com/billing');
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
    // Update the UI with items the user is already entitled to.
    console.log(`Users has entitlement for ${p.itemId}`);
}

Bu, daha önce yapılan ancak onaylanmamış satın alma işlemlerini kontrol etmek için de iyi bir fırsattır. Kullanıcılarınızın yararlanma haklarının uygulamanıza doğru şekilde yansıtılmasını sağlamak için satın alma işlemlerini en kısa sürede onaylamanız önerilir.

const service =
     await window.getDigitalGoodsService("https://play.google.com/billing");
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
    await verifyOrAcknowledgePurchaseOnBackend(p.purchaseToken, p.itemId);

    // Update the UI with items the user is already entitled to.
    console.log(`Users has entitlement for ${p.itemId}`);
}

Entegrasyonunuzu test etme

Geliştirme Android cihazında

Dijital Ürünler API'sı, test amacıyla bir geliştirme Android cihazında etkinleştirilebilir:

  • Geliştirici modunu etkinleştirerek Android 9 veya sonraki bir sürümü kullandığınızdan emin olun.
  • Chrome 101 veya daha yeni bir sürümü yükleyin.
  • Chrome'da chrome://flags adresine gidip işareti arayarak aşağıdaki işaretleri etkinleştirin:
    • #enable-debug-for-store-billing
  • Sitenin bir https protokolü kullanılarak barındırıldığından emin olun. http kullanılması API'nin undefined olmasına neden olur

ChromeOS cihazda

Digital Goods API, 89 sürümünden itibaren ChromeOS kararlı kanalında kullanılabilecek. Bu sırada Digital Products API'yi test etmek de mümkündür:

  • Play Store'dan uygulamanızı cihaza yükleyin.
  • Sitenin bir https protokolü kullanılarak barındırıldığından emin olun. http kullanılması API'nin undefined olmasına neden olur

Test kullanıcıları ve kalite güvencesi ekipleriyle

Play Store, kullanıcı test hesapları ve test SKU'ları dahil olmak üzere test için çeşitli imkanlar sunar. Daha fazla bilgi için Google Play Faturalandırma test dokümanlarına göz atın.

Sonraki adımlar

Bu belgede açıklandığı gibi, Play Faturalandırma API'sinin Dijital Ürünler API'si tarafından yönetilen istemci tarafı bileşenleri ve sunucu tarafı bileşenler vardır.