Tüketilebilir olmayan dijital işlemler oluşturma (Dialogflow)

Bu kılavuzda, kullanıcıların tüketilemez dijital ürünlerinizi satın alabilmesi için dijital işlemleri konuşma işleminize nasıl ekleyeceğiniz açıklanmaktadır.

Anahtar terimler: Tüketilebilir olmayan bir dijital ürün, yalnızca bir kez satın alınabilen bir stok tutma birimidir (SKU).

Tek seferlik tüketilebilir olmayan ürünler hakkında daha fazla bilgi için tek seferlik ürüne özel özellikler konulu Android belgelerine bakın.

Kısıtlamalar ve inceleme kuralları

İşlem içeren işlemler için ek politikalar geçerlidir. İşlemleri içeren işlemleri incelememiz birkaç haftayı bulabilir. Bu nedenle, yayın planınızı planlarken bu süreyi de hesaba katın. İnceleme sürecini kolaylaştırmak için İşleminizi incelemeye göndermeden önce işlemlerle ilgili politikalara ve kurallara uyduğunuzdan emin olun.

Dijital ürün satan işlemler yalnızca aşağıdaki ülkelerde uygulanabilir:

  • Avustralya
  • Brezilya
  • Kanada
  • Endonezya
  • Japonya
  • Meksika
  • Rusya
  • Singapur
  • Tayland
  • Türkiye
  • Birleşik Krallık
  • Amerika Birleşik Devletleri

İşlem akışı

Bu kılavuzda, bir dijital ürün işlem akışında gerçekleşen her geliştirme adımı özetlenmektedir. İşleminiz dijital ürünlerle ilgili işlemleri gerçekleştirirken aşağıdaki akışı kullanır:

  1. Dijital satın almalar API istemcisi oluşturma: İşleminiz Google Play envanterinizle iletişim kurmak ve işlem yapmak için digital purchases API'yi kullanıyor. İşleminiz başka herhangi bir işlem yapmadan önce dijital satın alma API'si ile iletişim kurmak için hizmet anahtarı içeren bir JWT istemcisi oluşturur.
  2. Bilgi toplama: İşleminiz bir işleme hazırlanmak için kullanıcı ve Google Play envanterinizle ilgili temel bilgileri toplar.
    1. İşlem gereksinimlerini doğrulama: İşleminiz, kullanıcının işlem yapabildiğinden emin olmak için satın alma akışının başında dijital işlem gereksinimleri yardımcısını kullanır.
    2. Kullanılabilir envanteri toplama: İşleminiz Google Play envanterinizi kontrol eder ve şu anda hangi öğelerin satın alınabileceğini belirler.
  3. Siparişi oluşturma: İşleminiz kullanıcıya mevcut dijital ürünleri sunar. Böylece kullanıcı satın almak için bir ürün seçebilir.
  4. Satın alma işlemini tamamlama: İşleminiz, kullanıcının Google Play Store'da seçimini kullanarak bir satın alma işlemi başlatmak için dijital satın alma işlemleri API'sini kullanır.
  5. Sonucu işleme: İşleminiz işlem için bir durum kodu alır ve kullanıcıya satın alma işleminin başarılı olduğunu bildirir (veya ek adımlar gerektirdiğini).

Ön koşullar

Dijital işlemleri İşleminize dahil etmeden önce aşağıdaki ön koşulların karşılanması gerekir:

Android Uygulaması İlişkilendirme

Şu anda Google Play Console'da faturalandırma izni olan bir Android uygulamanız yoksa aşağıdaki adımları uygulayın:

  1. Android Studio'da veya istediğiniz Android IDE'de yeni bir proje oluşturun. Çok temel bir uygulama oluşturmak için proje kurulumu sırasındaki seçenekleri belirleyin.
  2. Projeye com.mycompany.myapp gibi bir paket adı verin. com.example içeren paketleri Play Console'a yükleyemeyeceğiniz için bu adı varsayılan olarak bırakmayın.
  3. Uygulamanızın AndroidManifest.xml dosyasını açın.
  4. Aşağıdaki kod satırını manifest öğesinin içine ekleyin:

    <uses-permission android:name="com.android.vending.BILLING" />

    AndroidManifest.xml dosyanız aşağıdaki kod bloğu gibi görünmelidir:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.mycompany.myapp">
        <uses-permission android:name="com.android.vending.BILLING" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme" />
    </manifest>
    
  5. Uygulamanızı imzalı bir APK olarak oluşturun. Android Studio'da şu adımları uygulayın:

    1. Derleme, İmzalanmış Paket / APK Oluştur'a gidin.
    2. İleri'yi tıklayın.
    3. Anahtar deposu yolu bölümünde Yeni oluştur'u tıklayın.
    4. Her bir alanı doldurup ardından OK (Tamam) seçeneğini tıklayın. Anahtar deposu şifrenizi ve Anahtar şifrenizi not edin ve bunları daha sonra kullanacağınız için güvenli bir yerde saklayın.
    5. İleri'yi tıklayın.
    6. Sürüm'ü seçin.
    7. V1 (JAR Signature) (V1 (JAR İmzası)) seçeneğini belirleyin.
    8. Son'u tıklayın.
    9. Birkaç saniye sonra, Android Studio bir app-release.apk dosyası oluşturur. Daha sonra kullanmak için bu dosyayı bulun.
  6. Google Play Console'da yeni bir uygulama oluşturun.

  7. Uygulama sürümleri'ne gidin.

  8. Kapalı kanallar bölümünde Yönet'e, ardından Alfa'ya gidin.

  9. Sürüm Oluştur düğmesini tıklayın.

  10. Google'ın imzalama anahtarınızı yönetmesine ve korumasına izin ver bölümünde imzalama anahtarı bilgilerinizi girin.

  11. APK dosyanızı yükleyin.

  12. Kaydet'i tıklayın.

Dijital ürünlerinizi oluşturun

Şu anda Play Console'da hiç dijital ürününüz yoksa şu adımları uygulayın:

  1. Google Play Console'da Uygulama içi ürünler'e, ardından Yönetilen ürünler'e gidin. Bir uyarı görürseniz Android uygulaması oluşturmak için önceki talimatları uygulayın veya satıcı profili oluşturmak için bağlantıyı tıklayın.
  2. Yönetilen ürün oluştur'u tıklayın.
  3. Dijital ürününüzle ilgili alanları doldurun. İşleminizde bu ürüne nasıl referans vereceğinizi gösteren Ürün Kimliği'ni not edin.
  4. Kaydet'i tıklayın.
  5. Satmak istediğiniz her ürün için 2-4 arasındaki adımları tekrarlayın.

Google Play Console&#39;daki tüketilebilir olmayan ürünler için örnekler.

Actions projenizi hazırlama

Dijital ürünleriniz Google Play Console'da oluşturulduktan sonra dijital işlemleri etkinleştirmeniz ve Actions projenizi Play uygulamanızla ilişkilendirmeniz gerekir.

Actions projenizde dijital ürün işlemlerini etkinleştirmek için şu adımları izleyin:

  1. Actions Console'da projenizi açın veya yeni bir proje oluşturun.
  2. Dağıt'a, ardından Dizin bilgileri'ne gidin.
  3. Ek bilgiler ve İşlemler bölümünde, İşlemleriniz dijital ürünlerle ilgili işlemler yapmak için Dijital Satın Alma API'sini kullanıyor mu? seçeneğinin altındaki Evet kutusunu işaretleyin.
  4. Kaydet'i tıklayın.

Dijital ürünler API anahtarı oluşturma

Digital Products API'ye istek göndermek için Actions konsolu projenizle ilişkilendirilmiş bir JSON hizmet hesabı anahtarı indirmeniz gerekir.

Hizmet hesabı anahtarınızı almak için şu adımları uygulayın:

  1. Actions Console'da sağ üst köşedeki üç nokta simgesini, ardından Proje ayarları'nı tıklayın.
  2. İşleminizin Proje Kimliğini bulun.
  3. "<project_id>" kısmını projenizin kimliğiyle değiştirerek şu bağlantıyı tıklayın: https://console.developers.google.com/apis/credentials?project=project_id
  4. Ana gezinme menüsünde Kimlik bilgileri'ne gidin.
  5. Açılan sayfada Kimlik bilgisi oluştur'u ve ardından Hizmet hesabı anahtarı'nı tıklayın.
  6. Hizmet Hesabı'na gidin ve Yeni Hizmet Hesabı'nı tıklayın.
  7. Hizmet hesabına dijital işlemler gibi bir ad verin.
  8. Oluştur'u tıklayın.
  9. RolProje > Sahip olarak ayarlayın.
  10. Devam'ı tıklayın.
  11. Anahtar Oluştur'u tıklayın.
  12. JSON anahtar türünü seçin.
  13. Create key'i (Anahtar oluştur) tıklayın ve JSON hizmet hesabı anahtarını indirin.

Bu hizmet hesabı anahtarını güvenli bir yere kaydedin. Dijital satın alma işlemleri API'si için bir müşteri oluşturmak amacıyla istek karşılama işleminizde bu anahtarı kullanacaksınız.

Play envanterinize bağlanma

Dijital ürünlerinize Actions projesinden erişmek için web alanınızı ve uygulamanızı projenizle bağlı mülkler olarak ilişkilendirin.

Not: Mülkleriniz doğrulanırken bağlantı adımlarının tamamlanması bir hafta kadar sürebilir. Web siteniz veya uygulamanız bu süre sonunda bağlanmazsa destek ekibiyle iletişime geçin.

Play Console web alanınızı ve uygulamanızı Actions projenize bağlamak için şu adımları uygulayın:

  1. Actions Console'da Dağıt'a ve ardından Marka doğrulaması'na gidin.
  2. Herhangi bir mülk bağlamadıysanız öncelikle bir web sitesi bağlayın:

    1. Web mülkü (</>) düğmesini tıklayın.
    2. Web alanınızın URL'sini girin ve Bağlan'ı tıklayın.

    Google, söz konusu web alanı için Google Search Console'da doğrulanan kişiye daha fazla talimat içeren bir e-posta gönderir. Bu e-postanın alıcısı bu adımları uyguladıktan sonra web sitesi Marka doğrulaması altında görünecektir.

  3. En az bir bağlı web siteniz olduğunda Android uygulamanızı bağlamak için aşağıdaki adımları uygulayın:

    1. Actions Console'da Dağıt'a ve ardından Marka doğrulaması'na gidin.
    2. Uygulama Bağlayın'ı tıklayın.
    3. Görüntülenen sayfada, Play Console'da web alanınızı doğrulama talimatlarını uygulayın. Dijital ürünlerinizi içeren Play uygulamasını seçin ve web alanı URL'sini tam olarak Marka doğrulama sayfasında gösterildiği şekilde girin.

      Google bir kez daha alanın doğrulanmış sahibine bir doğrulama e-postası gönderir. Ekibimiz doğrulamayı onayladıktan sonra Play uygulamanız Marka doğrulaması altında görünecektir.

    4. Play'deki satın alma işlemlerine erişme seçeneğini etkinleştirin.

Actions projesine bağlı web sitesi ve uygulamaları gösteren resim.

Satın alma sürecinizi oluşturun

Actions projeniz ve dijital ürün envanteriniz hazır olduğunda görüşme istek karşılama webhook'unuzda dijital ürün satın alma akışı oluşturun.

1. Digital Purchase API istemcisi ayarlama

Görüşme istek karşılama webhook'unuzda hizmet hesabınızın JSON anahtarı ve https://www.googleapis.com/auth/actions.purchases.digital kapsamıyla bir JWT istemcisi oluşturun.

Aşağıdaki Node.js kodu, dijital satın alma işlemleri API'si için bir JWT istemcisi oluşturur:

  const serviceAccount = {'my-file.json'};
  const request = require('request');
  const {google} = require('googleapis');

  const jwtClient = new google.auth.JWT(
    serviceAccount.client_email, null, serviceAccount.private_key,
    ['https://www.googleapis.com/auth/actions.purchases.digital'],
    null
  );

2. Bilgi toplama

Kullanıcı satın alma işlemi gerçekleştirmeden önce İşleminiz kullanıcının satın alma özelliği ve envanterinizde hangi ürünlerin mevcut olduğu hakkında bilgi toplar.

2. a. İşlem gereksinimlerini doğrulayın

Kullanıcıya satın alma seçeneği sunmadan önce, hesabının işlem gerçekleştirmek üzere ayarlandığından emin olmak iyi bir uygulamadır. Bu adım, kullanıcının yapılandırılmış bir ödeme yöntemine sahip olup olmadığını ve dijital işlemlerin desteklendiği bir yerel ayarda bulunup bulunmadığını kontrol etmeyi içerir. İşlem akışının başında, kullanıcının işlem yapılandırmasını Asistan'la doğrulamak için DIGITAL_PURCHASE_CHECK yardımcısını kullanın.

Aşağıdaki Node.js kodu, görüşmenin başında DIGITAL_PURCHASE_CHECK öğesini kullanır:

app.intent('Default Welcome Intent', async (conv, { SKU }) => {
  // Immediately invoke digital purchase check intent to confirm
  // purchase eligibility.
  conv.ask(new DigitalPurchaseCheck());
});

Bu kontrolün sonucunu ileti dizisi bağımsız değişkenlerinde DIGITAL_PURCHASE_CHECK_RESULT olarak bulabilirsiniz. Bu sonuca göre, işlem akışına devam edin veya değişiklik yapıp Google Pay yapılandırmalarını kontrol etmelerini isteyin.

Aşağıdaki Node.js kodu gereksinim denetimi sonucunu işler :

app.intent('Digital Purchase Check', async (conv) => {
  const arg = conv.arguments.get('DIGITAL_PURCHASE_CHECK_RESULT');
  if (!arg || !arg.resultType) {
    conv.close('Digital Purchase check failed. Please check logs.');
    return;
  }
  // User does not meet necessary conditions for completing a digital purchase
  if (arg.resultType === 'CANNOT_PURCHASE' || arg.resultType === 'RESULT_TYPE_UNSPECIFIED') {
    conv.close(`It looks like you aren't able to make digital purchases. Please check your Google Pay configuration and try again.`);
    return;
  }
  conv.ask('Welcome to the Digital Goods Sample. Would you like to see what I have for sale?');
});

2. b. Kullanılabilir envanteri toplama

Şu anda kullanılabilir olan Play Store envanterinizi istemek için dijital satın almalar API'sini kullanın, ardından bunu her ürün için bir JSON nesnesi dizisi halinde oluşturun. Kullanıcıya satın alınabilecek seçenekleri göstermek için daha sonra bu diziye başvurursunuz.

Dijital ürünlerinizin her biri, JSON biçiminde bir SKU olarak temsil edilir. Aşağıdaki Node.js kodu her SKU'nun beklenen biçimlendirmesini özetlemektedir:

body = {
  skus: [
    skuId: {
      skuType: one of "APP" or "UNSPECIFIED"
      id: string,
      packageName: string
    }
    formattedPrice: string,
    title: string,
    description: string
  ]
}

https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet uç noktasına bir POST isteği gönderin. Burada {packageName}, Google Play Console'da uygulamanızın paket adıdır (ör. com.myapp.digitalgoods) ve sonucu SKU nesnelerinden oluşan bir dizi olarak biçimlendirin.

Ortaya çıkan dizide yalnızca belirli dijital ürünleri almak için body.ids üzerinden satın alınabilir hale getirmek istediğiniz dijital ürünlerin ürün kimliklerini (Google Play Console'da her bir uygulama içi ürünün altında gösterildiği şekilde) listeleyin.

Aşağıdaki Node.js kodu, dijital satın alma işlemleri API'sindeki kullanılabilir ürünlerin listesini ister ve sonucu bir SKU dizisi olarak biçimlendirir:

return jwtClient.authorize((err, tokens) => {
    if (err) {
      throw new Error(`Auth error: ${err}`);
    }

    const packageName = 'com.example.projectname';

    request.post(`https://actions.googleapis.com/v3/packages/${packageName}/skus:batchGet`, {
      'auth': {
        'bearer': tokens.access_token,
      },
      'json': true,
      'body': {
        'conversationId': conversationId,
        'skuType': 'APP',
        // This request is filtered to only retrieve SKUs for the following product IDs
        'ids': ['nonconsumable.1']
      },
    }, (err, httpResponse, body) => {
      if (err) {
        throw new Error(`API request error: ${err}`);
      }
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
      console.log(JSON.stringify(body));
    });
  });
});

3. Siparişi oluşturmak

Kullanıcının dijital satın alma işlemini başlatmak için, satın alınabilecek dijital ürünlerinizin bir listesini sunun. Envanterinizi temsil etmek ve kullanıcıdan seçim yapmasını istemek için çeşitli zengin yanıt türleri kullanabilirsiniz.

Aşağıdaki Node.js kodu, SKU nesnelerinden oluşan bir envanter dizisini okur ve her biri için bir liste öğesi içeren bir liste yanıtı oluşturur:

skus.forEach((sku) => {
  const key = `${sku.skuId.skuType},${sku.skuId.id}`
  list.items[key] = {
    title: sku.title,
    description: `${sku.description} | ${sku.formattedPrice}`,
  };
});

4. Satın alma işlemini tamamlayın

Satın alma işlemini tamamlamak için kullanıcının seçtiği öğeyle birlikte COMPLETE_PURCHASE yardımcı niyetini kullanın.

Aşağıdaki Node.js kodu bir liste yanıtından kullanıcının SKU seçimini işler ve bu bilgilerle COMPLETE_PURCHASE niyetini ister:

app.intent('Send Purchase', (conv, params, option) => {
  let [skuType, id] = option.split(',');

  conv.ask(new CompletePurchase({
    skuId: {
      skuType: skuType,
      id: id,
      packageName: <PACKAGE_NAME>,
    },
  }));
});

5. Sonucu yönetin

Satın alma işlemi tamamlandığında, sonucu açıklayan bir COMPLETE_PURCHASE_VALUE bağımsız değişkeniyle actions_intent_COMPLETE_PURCHASEDialogflow etkinliğini (veya actions.intent.COMPLETE_PURCHASE Actions SDK amacını) tetikler. Bu etkinlik tarafından tetiklenen ve sonucu kullanıcıya ileten bir amaç oluşturun.

Aşağıdaki olası satın alma sonuçlarını ele alın:

  • PURCHASE_STATUS_OK: Satın alma işlemi başarılı oldu. Bu noktada işlem tamamlandığından işlem akışından çıkın ve görüşmenize geri dönün.
  • PURCHASE_STATUS_ALREADY_OWNED: Kullanıcı bu öğeye zaten sahip olduğu için işlem başarısız oldu. Kullanıcının önceki alışverişlerini kontrol ederek ve gösterilen öğeleri, zaten sahip olduğu ürünleri yeniden satın alma seçeneğinin olmaması için uyarlayarak bu hatayı önleyin.
  • PURCHASE_STATUS_ITEM_UNAVAILABLE: İstenen öğe mevcut olmadığından işlem başarısız oldu. Satın alma zamanına yakın olan kullanılabilir SKU'ları kontrol ederek bu hatayı önleyin.
  • PURCHASE_STATUS_ITEM_CHANGE_REQUESTED: Kullanıcı başka bir şey satın almaya karar verdiği için işlem başarısız oldu. Kullanıcının hemen başka bir karar verebilmesi için sipariş oluştururken tekrar istekte bulunun.
  • PURCHASE_STATUS_USER_CANCELLED: Kullanıcı, satın alma akışını iptal ettiği için işlem başarısız oldu. Kullanıcı akıştan erken çıktığı için kullanıcıya işlemi yeniden denemek mi yoksa işlemden birlikte çıkmak mı istediğini sorun.
  • PURCHASE_STATUS_ERROR: İşlem bilinmeyen bir nedenden dolayı başarısız oldu. Kullanıcıya işlemin başarısız olduğunu bildirin ve tekrar denemek isteyip istemediğini sorun.
  • PURCHASE_STATUS_UNSPECIFIED: İşlem bilinmeyen bir nedenden dolayı başarısız oldu ve bilinmeyen bir durumla karşılaştı. Kullanıcıya işlemin başarısız olduğunu bildirerek bu hata durumunu ele alın ve tekrar denemek isteyip istemediğini sorun.

Aşağıdaki Node.js kodu COMPLETE_PURCHASE_VALUE bağımsız değişkenini okur ve her sonucu işler:

app.intent('Purchase Result', (conv) => {
  const arg = conv.arguments.get('COMPLETE_PURCHASE_VALUE');
  console.log('User Decision: ' + JSON.stringify(arg));
  if (!arg || !arg.purchaseStatus) {
    conv.close('Purchase failed. Please check logs.');
    return;
  }
  if (arg.purchaseStatus === 'PURCHASE_STATUS_OK') {
    conv.close(`Purchase completed! You're all set!`);
  } else if (arg.purchaseStatus === 'PURCHASE_STATUS_ALREADY_OWNED') {
    conv.close('Purchase failed. You already own this item.');
  } else if (arg.purchaseStatus === 'PURCHASE_STATUS_ITEM_UNAVAILABLE') {
    conv.close('Purchase failed. Item is not available.');
  } else if (arg.purchaseStatus === 'PURCHASE_STATUS_ITEM_CHANGE_REQUESTED') {
    // Reprompt with your item selection dialog
  }  else {
    conv.close('Purchase Failed:' + arg.purchaseStatus);
  }
});

Kullanıcının satın alma işlemlerini yansıtın

Bir kullanıcı İşleminizi sorguladığında, isteğin JSON user nesnesi, satın alma işlemlerinin bir listesini içerir. Bu bilgileri kontrol edin ve kullanıcının ödeme yaptığı içeriğe göre İşleminizin yanıtını değiştirin.

Aşağıdaki örnek kod, bir isteğin user nesnesini gösterir. Bu nesne, com.digitalgoods.application paketi için önceden yapılan uygulama içi satın alma işlemlerinin packageEntitlements kadarını içerir:

  "user": {
    "userId": "xxxx",
    "locale": "en-US",
    "lastSeen": "2018-02-09T01:49:23Z",
    "packageEntitlements": [
      {
        "packageName": "com.digitalgoods.application",
        "entitlements": [
          {
            "sku": "non-consumable.1",
            "skuType": "APP"
          }
          {
            "sku": "consumable.2",
            "skuType": "APP"
          }
        ]
      },
      {
        "packageName": "com.digitalgoods.application",
        "entitlements": [
          {
            "sku": "annual.subscription",
            "skuType": "SUBSCRIPTION",
            "inAppDetails": {
              "inAppPurchaseData": {
                "autoRenewing": true,
                "purchaseState": 0,
                "productId": "annual.subscription",
                "purchaseToken": "12345",
                "developerPayload": "HSUSER_IW82",
                "packageName": "com.digitalgoods.application",
                "orderId": "GPA.233.2.32.3300783",
                "purchaseTime": 1517385876421
              },
              "inAppDataSignature": "V+Q=="
            }
          }
        ]
      }
    ]
  },
  "conversation": {
    "conversationId": "1518141160297",
    "type": "NEW"
  },
  "inputs": [
    {
      "intent": "actions.intent.MAIN",
      "rawInputs": [
        {
          "inputType": "VOICE",
          "query": "Talk to My Test App"
        }
      ]
    }
  ],
  ...
}