Tworzenie transakcji cyfrowych przydatnych dla użytkowników (Dialogflow)

Z tego przewodnika dowiesz się, jak dodać transakcje cyfrowe do rozmowy Działanie, dzięki któremu użytkownicy mogą kupić Twoje zużywalne produkty cyfrowe.

Kluczowe terminy: produkt cyfrowy to jednostka magazynowa (SKU), użytkownik może dokonać zakupu więcej niż raz, np. określoną ilość waluty w grze w przypadku gry na Androida. Ten towar cyfrowy różni się od nieużywanego. towaru cyfrowego, który użytkownik może kupić tylko raz.

Więcej informacji o produktach jednorazowych znajdziesz w sekcji dotyczącej urządzeń z Androidem dokumentacja dotycząca jednorazowe funkcje, które są dostępne w ramach danej usługi.

Ograniczenia i wytyczne dotyczące sprawdzania

W przypadku akcji z transakcjami obowiązują dodatkowe zasady. Może nam to zająć tygodni, aby sprawdzić Działania, które obejmują transakcje. Uwzględniaj czas w planowaniu harmonogramu publikacji. Aby uprościć proces weryfikacji, przestrzegaj z zasadami i wytycznymi dotyczącymi transakcji przed przesłaniem Akcji do sprawdzenia.

Działania związane ze sprzedażą produktów cyfrowych mogą być wdrażane tylko w tych krajach:

  • Australia
  • Brazylia
  • Kanada
  • Indonezja
  • Japonia
  • Meksyk
  • Rosja
  • Singapur
  • Tajlandia
  • Turcja
  • Wielka Brytania
  • Stany Zjednoczone
.

Przepływ transakcji

W tym przewodniku opisujemy każdy etap tworzenia produktu cyfrowego, który występuje w przypadku produktów cyfrowych. procesu transakcji. Gdy akcja obsługuje transakcje dotyczące towarów cyfrowych, korzysta z takiego procesu:

  1. Skonfiguruj klienta interfejsu API zakupów cyfrowych: akcja używa kodu cyfrowego na potrzeby komunikacji z zasobami reklamowymi w Google Play i transakcji. Zanim akcja wykona cokolwiek, tworzy klienta JWT z klucz usługi do komunikowania się z cyfrowym interfejsem API zakupów.
  2. Gromadzenie informacji: akcja zbiera podstawowe informacje o jak i zasobami reklamowymi w Google Play, aby przygotować się do transakcji.
    1. Weryfikacja wymagań dotyczących transakcji: akcja korzysta z kodu cyfrowego wymagań dotyczących transakcji na początku procesu zakupowego aby umożliwić użytkownikowi przeprowadzenie transakcji.
    2. Zbierz dostępne zasoby reklamowe: akcja sprawdza Google Play. zasobów reklamowych i określa, które produkty są obecnie dostępne do zakupu.
  3. Uporządkuj kolejność: akcja prezentuje dostępne produkty cyfrowe użytkownika, aby mógł wybrać reklamę, którą chce kupić.
  4. Sfinalizuj zakup: akcja używa interfejsu API zakupów cyfrowych do: rozpocząć zakup produktów wybraną przez użytkownika w Sklepie Google Play.
  5. Obsługa wyniku: akcja otrzymuje kod stanu dla atrybutu transakcji i powiadamia użytkownika, że zakup został zrealizowany (lub czynności dodatkowych).
  6. Spraw, aby zakup powtarzał się: akcja używa zakupów cyfrowych. Interfejs API do wykorzystania kupionego produktu i udostępnia go do zakupu; przez tego użytkownika.

Wymagania wstępne

Zanim uwzględnisz transakcje cyfrowe w Akcji, potrzebujesz następujące warunki wstępne:

Powiąż aplikację na Androida

Jeśli nie masz obecnie aplikacji na Androida z uprawnieniami do płatności na W Konsoli Google Play, wykonaj te czynności:

  1. W Android Studio lub w środowisku IDE Androida, utwórz nowy projekt. Wybierz opcje w z prośbą o konfigurację projektu i stworzenie bardzo podstawowej aplikacji.
  2. Nadaj projektowi nazwę pakietu, np. com.mycompany.myapp. Nie zostawiaj tej nazwy domyślnej, bo nie można przesyłać pakietów, które dodaj com.example do Konsoli Play.
  3. Otwórz plik AndroidManifest.xml aplikacji.
  4. Dodaj ten wiersz kodu do elementu manifest:

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

    Twój plik AndroidManifest.xml powinien wyglądać jak ten blok kodu:

    <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. Utwórz aplikację jako podpisany pakiet APK. W Android Studio wykonaj te czynności:

    1. Otwórz Kompilacja, a następnie Wygeneruj podpisany pakiet / plik APK.
    2. Kliknij Dalej.
    3. W sekcji Ścieżka magazynu kluczy kliknij Utwórz nową.
    4. Wypełnij wszystkie pola i kliknij OK. Zanotuj swój magazyn kluczy hasła i Klucza dostępu. Przechowuj je w bezpiecznym miejscu. użyjesz ich później.
    5. Kliknij Dalej.
    6. Wybierz release (Wersja).
    7. Wybierz V1 (Podpis JAR).
    8. Kliknij Zakończ.
    9. Po kilku sekundach Android Studio generuje plik app-release.apk. Znajdź ten plik do późniejszego użycia.
  6. W Konsola Google Play, utwórz nową aplikację.

  7. Otwórz Wersje aplikacji.

  8. W sekcji Zamknięte ścieżki kliknij Zarządzaj, a następnie Alfa.

  9. Kliknij przycisk Utwórz wersję.

  10. W sekcji Pozwól Google na zarządzanie Twoim kluczem podpisywania i ochronę jego wpisz treść podpisu kluczowych informacji.

  11. Prześlij plik APK.

  12. Kliknij Zapisz.

Tworzenie towarów cyfrowych

Jeśli nie masz obecnie żadnych produktów cyfrowych w Konsoli Play, postępuj zgodnie z tymi instrukcjami: kroki:

  1. W Konsola Google Play, kliknij Produkty w aplikacji, a następnie Produkty zarządzane. Jeśli zobaczysz ostrzeżenie, postępuj zgodnie z poprzednimi instrukcjami, aby utworzyć aplikację na Androida, lub kliknij link aby utworzyć profil sprzedawcy.
  2. Kliknij Utwórz produkt zarządzany.
  3. Wypełnij pola produktu cyfrowego. Zanotuj identyfikator produktu, – w ten sposób odwołujesz się do produktu w akcji.
  4. Kliknij Zapisz.
  5. Powtórz kroki 2–4 w przypadku każdego produktu, który chcesz sprzedawać.

Przykładowe produkty konsumpcyjne w Konsoli Google Play.

Przygotowywanie projektu w Actions

Po skonfigurowaniu produktów cyfrowych w Konsoli Google Play musisz włączyć transakcji cyfrowych i powiązać projekt w Actions z aplikacją Google Play.

Aby włączyć transakcje dotyczące produktów cyfrowych w projekcie Actions, postępuj zgodnie z tymi instrukcjami: kroki:

  1. W konsoli Actions otwórz projekt lub utwórz nowy.
  2. Kliknij Deploy (Wdrażanie) i wybierz Directory information (Informacje o katalogu).
  3. W sekcji Dodatkowe informacje i Transakcje zaznacz pole Tak w sekcji Czy Twoje akcje używają interfejsu Digital Purchase API do realizowania transakcji? towarów cyfrowych.
  4. Kliknij Zapisz.

Tworzenie klucza interfejsu API produktów cyfrowych

Aby wysyłać żądania do interfejsu API produktów cyfrowych, musisz pobrać usługę JSON klucz konta powiązany z projektem w Konsoli Actions.

Aby pobrać klucz konta usługi, wykonaj te czynności:

  1. W Konsoli Actions kliknij ikonę z 3 kropkami w prawym górnym rogu. i wybierz Ustawienia projektu.
  2. Znajdź identyfikator projektu akcji.
  3. Kliknij ten link, zastępując „<project_id>” identyfikatorem projektu: https://console.developers.google.com/apis/credentials?project=project_id
  4. W głównym menu nawigacyjnym kliknij Dane logowania.
  5. Na stronie, która się wyświetli, kliknij Utwórz dane logowania, a następnie Usługa klucz konta.
  6. Otwórz Konto usługi i kliknij Nowe konto usługi.
  7. Nadaj kontu usługi nazwę, na przykład digitaltransactions.
  8. Kliknij Utwórz.
  9. Ustaw Rola na Projekt > Właściciel.
  10. Kliknij Dalej.
  11. Kliknij Utwórz klucz.
  12. Wybierz typ klucza JSON.
  13. Kliknij Utwórz klucz i pobierz klucz konta usługi JSON.

Zapisz ten klucz konta usługi w bezpiecznym miejscu. Będziesz używać tego kluczyka w w celu utworzenia klienta dla interfejsu API zakupów cyfrowych.

Połącz z zasobami reklamowymi Google Play

Aby uzyskać dostęp do swoich produktów cyfrowych z poziomu projektu w Actions, powiąż przy użyciu domeny internetowej i aplikacji z projektem jako połączonych usług.

Uwaga: w związku z weryfikacją połączenie może potrwać nawet tydzień. Twoich usług. Jeśli po upływie tego czasu Twoja witryna lub aplikacja nie będą połączone, skontaktuj się z zespołem pomocy.

Aby połączyć domenę internetową i aplikację z Konsoli Play z projektem w Actions, postępuj zgodnie z instrukcjami wykonaj te czynności:

  1. W konsoli działań kliknij Wdróż, a następnie Weryfikacja marki.
  2. Jeśli nie masz połączonych żadnych usług, najpierw połącz witrynę:

    1. Kliknij przycisk usługi internetowej (&lt;/&gt;).
    2. Wpisz adres URL domeny internetowej i kliknij Połącz.

    Google wyśle e-maila z dalszymi instrukcjami do osoby, która i weryfikacji danej domeny Google Search Console. Gdy odbiorca wykona te czynności, witryna powinna pojawią się w sekcji Weryfikacja marki.

  3. Gdy masz już co najmniej 1 połączoną witrynę, wykonaj te czynności, aby: Połącz swoją aplikację na Androida:

    1. W konsoli działań kliknij Wdróż, a następnie Weryfikacja marki.
    2. Kliknij Połącz aplikację.
    3. Na wyświetlonej stronie postępuj zgodnie z instrukcjami, aby zweryfikować swoją sieć. w Konsoli Play. Wybierz aplikację Google Play, która zawiera produktów cyfrowych i wpisać URL domeny internetowej dokładnie w takiej postaci, w jakiej jest on wyświetlany Weryfikacja marki.

      Google ponownie wysyła e-maila weryfikacyjnego do zweryfikowanego właściciela witryny w całej domenie. Gdy administrator zatwierdzi weryfikację, aplikacja Google Play powinna pojawią się w sekcji Weryfikacja marki.

    4. Włącz Dostęp do zakupów w Google Play.

Obraz przedstawiający witrynę i aplikacje połączone z projektem Actions.

Opracuj proces zakupu

Po przygotowaniu projektu w Actions i asortymencie produktów cyfrowych utwórz procesu zakupu produktów w webhooku realizacji rozmowy.

1. Konfigurowanie klienta interfejsu API zakupów cyfrowych

Utwórz w webhooku realizacji rozmowy klienta JWT z usługą klucz JSON konta i Zakres: https://www.googleapis.com/auth/actions.purchases.digital.

Ten kod Node.js tworzy klienta JWT dla interfejsu API zakupów cyfrowych:

  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. Zbieranie informacji

Zanim użytkownik będzie mógł coś kupić, akcja zbierze informacje o możliwości dokonywania zakupów oraz jakie towary są dostępne w zasobów reklamowych.

2. a. Wymagania dotyczące weryfikowania transakcji

Warto upewnić się, że konto użytkownika jest skonfigurowane pod kątem skuteczności przed dokonaniem zakupu. Ten krok obejmuje sprawdzenie, czy użytkownik ma skonfigurowaną formę płatności i czy jest regionu, w którym obsługiwane są transakcje cyfrowe. Na początku transakcji procesu, użyj Asystenta DIGITAL_PURCHASE_CHECK, aby zweryfikować transakcję użytkownika za pomocą Asystenta.

Ten kod Node.js używa DIGITAL_PURCHASE_CHECK na początku rozmowa:

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

Wynik tej kontroli znajdziesz w argumentach rozmowy jako DIGITAL_PURCHASE_CHECK_RESULT Na podstawie tego wyniku możesz kontynuować w procesie transakcji lub zrezygnować z dalszego korzystania z Google Pay konfiguracji.

Ten kod Node.js obsługuje wynik kontroli wymagań :

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. Zbieranie dostępnych zasobów reklamowych

Aby przesłać prośbę o dostęp do aktualnie dostępnego Sklepu Play, użyj interfejsu API zakupów cyfrowych w zasobach reklamowych, a potem wbuduj je w tablicę obiektów JSON dla każdego produktu. Odwołujesz się do tej tablicy później, aby pokazać użytkownikowi, jakie opcje są dostępne do zakupu.

Każdy produkt cyfrowy jest przedstawiony jako kod SKU w formacie JSON. ten kod Node.js zawiera omówienie oczekiwanego formatowania poszczególnych kodów SKU:

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

Wyślij żądanie POST do https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet gdzie {packageName} to nazwa pakietu aplikacji w Google Play w konsoli (np. com.myapp.digitalgoods) i sformatuj wynik w formacie tablica obiektów SKU.

Aby pobrać z tablicy wynikowej tylko określone produkty cyfrowe, wymień produkt identyfikatory produktów cyfrowych (widoczne pod każdym produktem w aplikacji w Google Play, konsoli), które chcesz udostępnić do zakupu w aplikacji body.ids.

Ten kod Node.js prosi o listę dostępnych towarów z do zakupów API i formatuje wynik w postaci tablicy kodów SKU:

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': ['consumable.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. Tworzenie zamówienia

Aby rozpocząć zakup cyfrowy przez użytkownika, przedstaw listę swoich produktów cyfrowych dostępnych do zakupu. Możesz wykorzystać różne multimedialne typy odpowiedzi odzwierciedlające na giełdzie i poprosi użytkownika o dokonanie wyboru.

Poniższy kod Node.js odczytuje tablicę zasobów reklamowych obiektów SKU i tworzy wyświetl odpowiedź z listy z jednym elementem listy dla każdy:

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

4. Sfinalizuj zakup

Aby sfinalizować zakup, użyj intencji pomocniczej COMPLETE_PURCHASE z parametrem wybrany przez użytkownika element.

Ten kod Node.js obsługuje wybór kodu SKU użytkownika przez użytkownika w odpowiedzi z listą i żąda intencji COMPLETE_PURCHASE z tymi informacjami:

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. Obsługa wyników

Po zakończeniu zakupu aktywuje actions_intent_COMPLETE_PURCHASE Zdarzenie Dialogflow (lub intencja actions.intent.COMPLETE_PURCHASE Actions SDK) z argument COMPLETE_PURCHASE_VALUE opisujący wynik. Zbuduj intencję, wywołanych przez to zdarzenie i informujące użytkownika o wyniku.

Zajmij się tymi możliwymi wynikami zakupu:

  • PURCHASE_STATUS_OK: zakup został zrealizowany. Transakcja więc wyjdź z procesu transakcji i wróć do do rozmowy z klientami.
  • PURCHASE_STATUS_ALREADY_OWNED: transakcja nie powiodła się, ponieważ użytkownik ma już ten element. Aby uniknąć tego błędu, sprawdź poprzednie dane użytkownika do ich kupna i dostosowania wyświetlanych produktów, tak aby użytkownik nie miał możliwości ponownie kupić swoje produkty.
  • PURCHASE_STATUS_ITEM_UNAVAILABLE: transakcja nie powiodła się, ponieważ żądany element jest niedostępny. Aby uniknąć tego błędu, sprawdź dostępne Kody SKU bliższe momentowi zakupu.
  • PURCHASE_STATUS_ITEM_CHANGE_REQUESTED: transakcja nie powiodła się, ponieważ użytkownik zdecydował się kupić coś innego. Ponownie prześlij zapytanie w ramach procesu tworzenia zamówienia. aby użytkownik mógł od razu podjąć inną decyzję.
  • PURCHASE_STATUS_USER_CANCELLED: transakcja nie powiodła się, ponieważ użytkownik Użytkownik anulował proces zakupu. Użytkownik przedwcześnie opuścił proces, więc zapytaj użytkownika, aby spróbować ponownie przeprowadzić transakcję lub ją opuścić. a nawet ich anulowania.
  • PURCHASE_STATUS_ERROR: transakcja nie powiodła się z nieznanego powodu. Daj znać użytkownik wie, że transakcja się nie powiodła, i zapyta, czy chce spróbować ponownie.
  • PURCHASE_STATUS_UNSPECIFIED: transakcja nie powiodła się z nieznanego powodu, co skutkuje nieznanym stanem. Obsługuj ten stan błędu, zezwalając użytkownikowi wie, że transakcja się nie powiodła, i zapytaj, czy chce spróbować ponownie.

Ten kod Node.js odczytuje argument COMPLETE_PURCHASE_VALUE i obsługuje każdy wynik:

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);
  }
});

6. Spraw, aby zakup był powtarzalny

Aby przesłać prośbę o dostęp do aktualnie dostępnego Sklepu Play, użyj interfejsu API zakupów cyfrowych w zasobach reklamowych, a potem wbuduj je w tablicę obiektów JSON dla każdego produktu. Odwołujesz się do tej tablicy później, aby pokazać użytkownikowi, jakie opcje są dostępne do zakupu.

Każdy produkt cyfrowy jest przedstawiony jako kod SKU w formacie JSON. ten kod Node.js zawiera omówienie oczekiwanego formatowania poszczególnych kodów SKU:

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

Wyślij żądanie POST do https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet gdzie {packageName} to nazwa pakietu aplikacji w Google Play w konsoli (np. com.myapp.digitalgoods) i sformatuj wynik w formacie tablica obiektów SKU.

Aby pobrać z tablicy wynikowej tylko określone produkty cyfrowe, wymień produkt identyfikatory produktów cyfrowych (widoczne pod każdym produktem w aplikacji w Google Play, konsoli), które chcesz udostępnić do zakupu w aplikacji body.ids.

Ten kod Node.js prosi o listę dostępnych towarów z do zakupów API i formatuje wynik w postaci tablicy kodów SKU:

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': ['consumable.1']
      },
    }, (err, httpResponse, body) => {
      if (err) {
        throw new Error(`API request error: ${err}`);
      }
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
      console.log(JSON.stringify(body));
    });
  });
});

odzwierciedlać zakupy użytkownika,

Gdy użytkownik wysyła zapytanie do akcji, obiekt user żądania JSON żądania zawiera listę zakupów. Sprawdź te informacje i zmień odpowiedź na akcję uzależnione od tego, za jakie treści użytkownik zapłacił.

Poniższy przykładowy kod pokazuje obiekt user żądania, który zawiera packageEntitlements wcześniejszych zakupów w aplikacji Pakiet com.digitalgoods.application:

  "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"
        }
      ]
    }
  ],
  ...
}