ایجاد تراکنش های اشتراک دیجیتال (Dialogflow)

این راهنما نحوه افزودن تراکنش های اشتراک دیجیتال را به Action مکالمه خود توضیح می دهد تا کاربران بتوانند اشتراک های شما را خریداری کنند.

اصطلاحات کلیدی: یک کالای دیجیتال اشتراکی یک واحد انبارداری (SKU) است که مانند یک مجله آنلاین نیاز به هزینه مکرر از کاربر دارد. این با یک کالای دیجیتال مصرفی که کاربر باید به صورت دستی دوباره خریداری کند یا یک کالای دیجیتال غیر مصرفی که به طور خودکار فقط یک بار خریداری می شود متفاوت است.

برای اطلاعات بیشتر در مورد اشتراک های دیجیتال، به مستندات Android در مورد ویژگی های خاص اشتراک مراجعه کنید.

محدودیت ها و دستورالعمل های بازبینی

خط‌مشی‌های اضافی برای اقدامات با تراکنش‌ها اعمال می‌شود. بررسی اقداماتی که شامل تراکنش‌ها می‌شود ممکن است چند هفته طول بکشد، بنابراین هنگام برنامه‌ریزی زمان‌بندی انتشار خود، آن زمان را در نظر بگیرید. برای تسهیل روند بازبینی، قبل از ارسال Action برای بررسی، مطمئن شوید که از خط‌مشی‌ها و دستورالعمل‌های تراکنش‌ها پیروی می‌کنید.

اقداماتی که کالاهای دیجیتال می فروشند فقط در کشورهای زیر قابل اجرا هستند:

  • استرالیا
  • برزیل
  • کانادا
  • اندونزی
  • ژاپن
  • مکزیک
  • روسیه
  • سنگاپور
  • تایلند
  • بوقلمون
  • انگلستان
  • ایالات متحده

جریان تراکنش

این راهنما هر مرحله توسعه را که در جریان تراکنش کالاهای دیجیتال رخ می دهد، تشریح می کند. وقتی Action شما تراکنش‌های کالاهای دیجیتال را انجام می‌دهد، از جریان زیر استفاده می‌کند:

  1. یک کلاینت API خریدهای دیجیتال راه اندازی کنید : Action شما از API خریدهای دیجیتال برای برقراری ارتباط با موجودی Google Play شما و انجام تراکنش استفاده می کند. قبل از اینکه Action شما هر کار دیگری انجام دهد، یک سرویس گیرنده JWT با یک کلید سرویس برای ارتباط با API خریدهای دیجیتال ایجاد می کند.
  2. جمع‌آوری اطلاعات : Your Action اطلاعات اولیه کاربر و موجودی Google Play شما را جمع‌آوری می‌کند تا برای تراکنش آماده شود.
    1. اعتبارسنجی الزامات تراکنش : اقدام شما از کمک کننده الزامات تراکنش های دیجیتال در شروع جریان خرید استفاده می کند تا مطمئن شود کاربر می تواند تراکنش انجام دهد.
    2. موجودی موجود را جمع آوری کنید : اقدام شما موجودی Google Play شما را بررسی می کند و مشخص می کند چه مواردی در حال حاضر برای خرید در دسترس هستند.
  3. سفارش را بسازید : اکشن شما کالاهای دیجیتالی موجود را به کاربر ارائه می دهد تا بتواند یکی را برای خرید انتخاب کند.
  4. تکمیل خرید : Your Action از API خریدهای دیجیتال برای شروع خرید با انتخاب کاربر در فروشگاه Google Play استفاده می کند.
  5. کنترل نتیجه : Action شما یک کد وضعیت برای تراکنش دریافت می کند و به کاربر اطلاع می دهد که خرید با موفقیت انجام شده است (یا مراحل دیگری را انجام می دهد).

پیش نیازها

قبل از اینکه تراکنش های دیجیتال را در Action خود بگنجانید، به پیش نیازهای زیر نیاز دارید:

یک برنامه اندروید را مرتبط کنید

اگر در حال حاضر برنامه Android با مجوز صورت‌حساب در کنسول Google Play ندارید، این مراحل را دنبال کنید:

  1. در Android Studio یا Android IDE مورد نظر خود، یک پروژه جدید ایجاد کنید. برای ایجاد یک برنامه بسیار ابتدایی، گزینه‌هایی را در دستورات راه‌اندازی پروژه انتخاب کنید.
  2. به پروژه یک نام بسته بدهید، مانند com.mycompany.myapp . این نام را به‌عنوان پیش‌فرض نگذارید، زیرا نمی‌توانید بسته‌هایی را که شامل com.example هستند در کنسول Play آپلود کنید.
  3. فایل AndroidManifest.xml برنامه خود را باز کنید.
  4. خط کد زیر را در عنصر manifest اضافه کنید:

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

    فایل AndroidManifest.xml شما باید شبیه بلوک کد زیر باشد:

    <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. برنامه خود را به عنوان یک APK امضا شده بسازید. در Android Studio مراحل زیر را دنبال کنید:

    1. به Build بروید، دسته امضا شده / APK را ایجاد کنید .
    2. روی Next کلیک کنید.
    3. در زیر مسیر فروشگاه کلید ، روی ایجاد جدید کلیک کنید.
    4. هر فیلد را پر کنید سپس روی OK کلیک کنید. گذرواژه و رمز عبور Key Store Store خود را یادداشت کنید و آنها را در مکانی امن ذخیره کنید، زیرا بعداً از آنها استفاده خواهید کرد.
    5. روی Next کلیک کنید.
    6. انتشار را انتخاب کنید.
    7. V1 (JAR Signature) را انتخاب کنید.
    8. روی Finish کلیک کنید.
    9. پس از چند ثانیه، Android Studio یک فایل app-release.apk تولید می کند. این فایل را برای استفاده بعدی پیدا کنید.
  6. در کنسول Google Play ، یک برنامه جدید ایجاد کنید.

  7. به انتشارات برنامه بروید.

  8. در قسمت Closed Tracks ، به Manage سپس Alpha بروید.

  9. روی دکمه Create Release کلیک کنید.

  10. در زیر اجازه دهید Google کلید امضای شما را مدیریت و محافظت کند ، اطلاعات کلید امضای خود را وارد کنید.

  11. فایل APK خود را آپلود کنید.

  12. روی ذخیره کلیک کنید.

کالاهای دیجیتال خود را ایجاد کنید

اگر در حال حاضر هیچ کالای دیجیتالی در کنسول Play ندارید، این مراحل را دنبال کنید:

  1. در کنسول Google Play ، به محصولات درون برنامه و سپس اشتراک ها بروید. در صورت مشاهده اخطار، دستورالعمل‌های قبلی را برای ایجاد یک برنامه Android دنبال کنید یا برای ایجاد نمایه تاجر روی پیوند کلیک کنید.
  2. روی ایجاد اشتراک کلیک کنید.
  3. فیلدهای محصول دیجیتال خود را پر کنید. به شناسه محصول توجه داشته باشید، که به این صورت است که این محصول را از Action خود ارجاع می دهید.
  4. روی ذخیره کلیک کنید.
  5. مراحل 2-4 را برای هر محصولی که می خواهید بفروشید تکرار کنید.

اشتراک‌های مثال در کنسول Google Play.

پروژه Actions خود را آماده کنید

با راه‌اندازی کالاهای دیجیتال شما در کنسول Google Play، باید تراکنش‌های دیجیتال را فعال کنید و پروژه Actions خود را با برنامه Play خود مرتبط کنید.

برای روشن کردن تراکنش‌های کالاهای دیجیتال در پروژه Actions، این مراحل را دنبال کنید:

  1. در کنسول Actions ، پروژه خود را باز کنید یا یک پروژه جدید ایجاد کنید.
  2. به Deploy سپس اطلاعات Directory بروید.
  3. در بخش اطلاعات اضافی و تراکنش‌ها ، کادر بله را در زیر آیا اقدامات شما از API خرید دیجیتال برای انجام تراکنش‌های کالاهای دیجیتال استفاده می‌کند، علامت بزنید.
  4. روی ذخیره کلیک کنید.

یک کلید API کالاهای دیجیتال ایجاد کنید

برای ارسال درخواست‌ها به API کالاهای دیجیتال، باید یک کلید حساب سرویس JSON مرتبط با پروژه کنسول Actions خود را دانلود کنید.

برای بازیابی کلید حساب سرویس خود، این مراحل را دنبال کنید:

  1. در کنسول Actions ، روی نماد سه نقطه در گوشه سمت راست بالا و سپس تنظیمات پروژه کلیک کنید.
  2. شناسه پروژه Action خود را پیدا کنید.
  3. این پیوند را دنبال کنید و شناسه پروژه خود را جایگزین « <project_id> » کنید: https://console.developers.google.com/apis/credentials?project=project_id
  4. در پیمایش اصلی، به اعتبارنامه بروید.
  5. در صفحه ای که ظاهر می شود، روی Create credentials و سپس Service key account کلیک کنید.
  6. به حساب سرویس بروید و حساب کاربری جدید را کلیک کنید.
  7. به حساب سرویس نامی مانند معاملات دیجیتال بدهید.
  8. روی ایجاد کلیک کنید.
  9. Role را روی Project > Owner قرار دهید.
  10. روی Continue کلیک کنید.
  11. روی ایجاد کلید کلیک کنید.
  12. نوع کلید JSON را انتخاب کنید.
  13. روی ایجاد کلید کلیک کنید و کلید حساب سرویس JSON را دانلود کنید.

این کلید حساب سرویس را در مکانی امن ذخیره کنید. از این کلید برای ایجاد مشتری برای API خریدهای دیجیتال استفاده خواهید کرد.

به موجودی Play خود متصل شوید

برای دسترسی به کالاهای دیجیتالی خود از پروژه Actions، دامنه وب و برنامه خود را به عنوان ویژگی های متصل به پروژه خود مرتبط کنید.

توجه: مراحل اتصال ممکن است تا یک هفته طول بکشد تا زمانی که ویژگی‌های شما را تأیید کنیم. اگر وب‌سایت یا برنامه شما پس از آن زمان پیوند داده نشد، با پشتیبانی تماس بگیرید .

برای اتصال دامنه وب کنسول Play و برنامه خود به پروژه Actions، این مراحل را دنبال کنید:

  1. در کنسول Actions ، به Deploy و سپس تأیید برند بروید.
  2. اگر هیچ خاصیتی را متصل نکرده اید، ابتدا یک وب سایت را متصل کنید:

    1. روی دکمه ویژگی وب ( </> ) کلیک کنید.
    2. URL دامنه وب خود را وارد کنید و روی اتصال کلیک کنید.

    Google ایمیلی حاوی دستورالعمل‌های بیشتر برای فردی که برای آن دامنه وب در کنسول جستجوی Google تأیید شده است ارسال می‌کند. هنگامی که گیرنده این ایمیل این مراحل را دنبال کرد، وب‌سایت باید در قسمت تأیید نام تجاری ظاهر شود.

  3. هنگامی که حداقل یک وب سایت متصل دارید، مراحل زیر را برای اتصال برنامه Android خود انجام دهید:

    1. در کنسول Actions ، به Deploy و سپس تأیید برند بروید.
    2. روی اتصال برنامه کلیک کنید.
    3. در صفحه ای که ظاهر می شود، دستورالعمل ها را دنبال کنید تا دامنه وب خود را در کنسول Play تأیید کنید. برنامه Play را که حاوی کالاهای دیجیتال شما است انتخاب کنید و URL دامنه وب را دقیقاً همانطور که در صفحه تأیید نام تجاری نشان داده شده است وارد کنید.

      یک بار دیگر، گوگل یک ایمیل تأیید برای مالک تأیید شده دامنه ارسال می کند. پس از تأیید تأیید، برنامه Play شما باید در قسمت تأیید نام تجاری ظاهر شود.

    4. خریدهای Access Play را فعال کنید.

تصویری که وب سایت و برنامه های متصل به پروژه Actions را نشان می دهد.

جریان خرید خود را ایجاد کنید

با پروژه Actions و موجودی کالاهای دیجیتالی آماده شده، یک جریان خرید کالاهای دیجیتال را در وب هوک انجام مکالمه خود ایجاد کنید.

1. یک کلاینت API خرید دیجیتال راه اندازی کنید

در وب هوک تکمیل مکالمه خود، با کلید JSON حساب سرویس خود و https://www.googleapis.com/auth/actions.purchases.digital دیجیتال یک کلاینت JWT ایجاد کنید.

کد Node.js زیر یک کلاینت JWT برای API خریدهای دیجیتال ایجاد می کند:

  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. اطلاعات جمع آوری کنید

قبل از اینکه کاربر بتواند خریدی انجام دهد، Action شما اطلاعاتی در مورد توانایی کاربر برای خرید و کالاهای موجود از موجودی شما جمع آوری می کند.

2. الف. الزامات تراکنش را تأیید کنید

این یک تمرین خوب است که مطمئن شوید حساب کاربر برای انجام تراکنش‌ها تنظیم شده است، قبل از اینکه به او گزینه خرید بدهید. این مرحله شامل بررسی اینکه کاربر یک روش پرداخت را پیکربندی کرده و در محلی است که تراکنش‌های دیجیتالی پشتیبانی می‌شوند، است. در شروع جریان تراکنش، از کمک کننده DIGITAL_PURCHASE_CHECK برای اعتبارسنجی پیکربندی تراکنش کاربر با دستیار استفاده کنید.

کد Node.js زیر از DIGITAL_PURCHASE_CHECK در شروع مکالمه استفاده می کند:

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

نتیجه این بررسی را در آرگومان های مکالمه به عنوان DIGITAL_PURCHASE_CHECK_RESULT بیابید. بر اساس این نتیجه، یا جریان تراکنش را ادامه دهید یا دور شوید و از آنها بخواهید پیکربندی Google Pay خود را بررسی کنند.

کد Node.js زیر نتایج بررسی الزامات را کنترل می کند:

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. ب. موجودی موجود را جمع آوری کنید

از API خریدهای دیجیتال برای درخواست موجودی فروشگاه Play خود استفاده کنید، سپس آن را در آرایه ای از اشیاء JSON برای هر محصول بسازید. بعداً به این آرایه ارجاع می دهید تا به کاربر نشان دهید چه گزینه هایی برای خرید در دسترس است.

هر یک از کالاهای دیجیتال شما به عنوان SKU در قالب JSON نشان داده می شود. کد Node.js زیر قالب بندی مورد انتظار هر SKU را مشخص می کند:

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

یک درخواست POST به https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet نقطه پایانی ارسال کنید، جایی که {packageName} نام بسته برنامه شما در کنسول Google Play است (به عنوان مثال، com.myapp.digitalgoods )، و نتیجه را به آرایه ای از اشیاء SKU قالب بندی کنید.

برای اینکه فقط کالاهای دیجیتالی خاصی را در آرایه به دست آمده بازیابی کنید، شناسه های محصول را برای کالاهای دیجیتال (همانطور که در زیر هر محصول درون برنامه ای در کنسول Google Play نشان داده شده است) که می خواهید برای خرید در body.ids در دسترس قرار دهید، فهرست کنید.

کد Node.js زیر لیستی از کالاهای موجود را از API خریدهای دیجیتال درخواست می کند و نتیجه را به صورت آرایه ای از 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': ['annual.subscription']
      },
    }, (err, httpResponse, body) => {
      if (err) {
        throw new Error(`API request error: ${err}`);
      }
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
      console.log(JSON.stringify(body));
    });
  });
});

3. نظم را بسازید

برای شروع خرید دیجیتالی کاربر، لیستی از کالاهای دیجیتالی خود را که برای خرید موجود است ارائه دهید. می‌توانید از انواع مختلفی از پاسخ‌های غنی برای نشان دادن سهام خود استفاده کنید و از کاربر بخواهید انتخاب کند.

کد Node.js زیر یک آرایه موجودی از اشیاء SKU را می خواند و یک پاسخ لیست با یک آیتم لیست برای هر کدام ایجاد می کند:

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

4. خرید را کامل کنید

برای تکمیل خرید، از هدف کمکی COMPLETE_PURCHASE با موردی که کاربر انتخاب کرده است استفاده کنید.

کد Node.js زیر انتخاب SKU کاربر از یک پاسخ لیست را مدیریت می کند و قصد COMPLETE_PURCHASE را با آن اطلاعات درخواست می کند:

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. نتیجه را مدیریت کنید

هنگامی که خرید کامل شد، رویداد actions_intent_COMPLETE_PURCHASE Dialogflow (یا actions.intent.COMPLETE_PURCHASE Actions SDK intent) را با آرگومان COMPLETE_PURCHASE_VALUE که نتیجه را توصیف می کند، راه اندازی می کند. هدفی ایجاد کنید که توسط این رویداد ایجاد می شود و نتیجه را به کاربر منتقل می کند.

نتایج خرید احتمالی زیر را مدیریت کنید:

  • PURCHASE_STATUS_OK : خرید با موفقیت انجام شد. تراکنش در این مرحله کامل شده است، بنابراین از جریان تراکنش خارج شوید و به مکالمه خود برگردید.
  • PURCHASE_STATUS_ALREADY_OWNED : تراکنش ناموفق بود زیرا کاربر قبلاً مالک آن مورد است. با بررسی خریدهای قبلی کاربر و تنظیم اقلام نشان داده شده به گونه ای که آنها گزینه ای برای خرید مجدد اقلامی که قبلاً دارند، نداشته باشند، از این خطا جلوگیری کنید.
  • PURCHASE_STATUS_ITEM_UNAVAILABLE : تراکنش انجام نشد زیرا مورد درخواستی در دسترس نیست. با بررسی SKUهای موجود نزدیک به زمان خرید از این خطا جلوگیری کنید.
  • PURCHASE_STATUS_ITEM_CHANGE_REQUESTED : تراکنش ناموفق بود زیرا کاربر تصمیم گرفت چیز دیگری بخرد. دوباره با ساختن سفارش خود تماس بگیرید تا کاربر بتواند بلافاصله تصمیم دیگری بگیرد.
  • PURCHASE_STATUS_USER_CANCELLED : تراکنش ناموفق بود زیرا کاربر جریان خرید را لغو کرد. از آنجایی که کاربر پیش از موعد از جریان خارج شده است، از کاربر بپرسید که آیا می‌خواهد تراکنش را دوباره امتحان کند یا کلاً از تراکنش خارج شود.
  • PURCHASE_STATUS_ERROR : تراکنش به دلیل نامعلومی شکست خورد. به کاربر اطلاع دهید که تراکنش شکست خورده است و از او بپرسید که آیا می‌خواهد دوباره امتحان کند.
  • PURCHASE_STATUS_UNSPECIFIED : تراکنش به دلیل نامعلومی با شکست مواجه شد و در نتیجه وضعیت نامشخصی ایجاد شد. با این وضعیت خطا به کاربر اطلاع دهید که تراکنش شکست خورده است، و بپرسید که آیا می‌خواهد دوباره امتحان کند.

کد Node.js زیر آرگومان COMPLETE_PURCHASE_VALUE را می خواند و هر نتیجه را مدیریت می کند:

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

خریدهای کاربر را منعکس کنید

هنگامی که یک کاربر Action شما را پرس و جو می کند، شی user JSON درخواست شامل لیستی از خریدهای او می شود. این اطلاعات را بررسی کنید و پاسخ Action خود را بر اساس محتوایی که کاربر برای آن هزینه کرده است تغییر دهید.

کد نمونه زیر شی user درخواست را نشان می دهد که شامل packageEntitlements خریدهای درون برنامه ای قبلی است که برای بسته 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"
        }
      ]
    }
  ],
  ...
}