يشرح هذا الدليل كيفية إضافة معاملات الاشتراك الرقمية إلى محادثاتك. إجراء، حتى يتمكّن المستخدمون من شراء اشتراكاتك
المصطلحات الرئيسية: السلعة الرقمية للاشتراك هي وحدة لحفظ المخزون (SKU) رسومًا متكررة من المستخدم، مثل مجلة على الإنترنت هذا هو مختلفة عن السلعة الرقمية الاستهلاكية التي يجب على المستخدم إعادة الشراء أو سلعة رقمية غير استهلاكية يتم الاحتفاظ بها تلقائيًا يتم شراؤه مرة واحدة فقط.
للحصول على مزيد من المعلومات حول الاشتراكات الرقمية، يمكنك الرجوع إلى نظام Android وثائق حول الميزات الخاصة بالاشتراكات.
إرشادات المراجعة والقيود
تنطبق سياسات إضافية على الإجراءات التي تتضمّن معاملات. قد يستغرق الأمر منا أسبوعًا لمراجعة الإجراءات التي تتضمن معاملات، لذا ضع هذا الوقت في الاعتبار التخطيط لجدول الإصدار لديك. لتسهيل عملية المراجعة، احرص على الالتزام مع السياسات والإرشادات المتعلقة بالمعاملات قبل إرسال الإجراء للمراجعة.
لا يمكن نشر الإجراءات التي تبيع السلع الرقمية إلا في البلدان التالية:
- أستراليا
- البرازيل
- كندا
- إندونيسيا
- اليابان
- المكسيك
- روسيا
- سنغافورة
- تايلاند
- تركيا
- المملكة المتحدة
- الولايات المتحدة
تدفق المعاملة
يوضح هذا الدليل كل خطوة تطوير عند حدوثها في سلع رقمية وتدفق المعاملات. عندما يعالج الإجراء الخاص بك معاملات السلع الرقمية التدفق التالي:
- إعداد عميل واجهة برمجة التطبيقات لعمليات الشراء الرقمية: يستخدم الإجراء الخاص بك البيانات الرقمية purchase API للتواصل مع مستودعك ومعاملاتك على Google Play. قبل أن يفعل الإجراء الخاص بك أي شيء آخر، فإنه ينشئ عميل JWT به مفتاح الخدمة للاتصال بواجهة برمجة تطبيقات عمليات الشراء الرقمية.
- جمع المعلومات: يجمع الإجراء الخاص بك معلومات أساسية حول
المستخدم ومستودعك على Google Play للتحضير للمعاملة.
- التحقّق من صحة متطلبات المعاملة: يستخدم الإجراء الخاص بك البيانات الرقمية ومتطلبات المعاملات في بداية تدفق الشراء إلى للتأكد من أن المستخدم يمكنه إجراء المعاملات.
- جمع المستودع الإعلاني المتاح: يتحقّق الإجراء الخاص بك من حسابك على Google Play. المستودع ويحدد السلع المتوفرة حاليًا للشراء.
- إنشاء الترتيب: يعرض الإجراء الخاص بك السلع الرقمية المتاحة المستخدم حتى يتمكن من اختيار واحدة لشرائها.
- إكمال عملية الشراء: يستخدم الإجراء الخاص بك واجهة برمجة التطبيقات لعمليات الشراء الرقمية من أجل بدء عملية شراء باختيار المستخدم إلى "متجر Google Play"
- التعامل مع النتيجة: يتلقّى الإجراء الخاص بك رمز حالة مع إعلام المستخدم بنجاح عملية الشراء (أو الحصول خطوات إضافية).
المتطلبات الأساسية
قبل دمج المعاملات الرقمية في العمل، تحتاج إلى المتطلبات الأساسية التالية:
حاسمة حساب مطوِّر و حساب التاجر في Google Play، لإدارة سلعك الرقمية في Google Play Console
نطاق ويب على Google Search Console لا يلزم ربط هذا النطاق بموقع إلكتروني تم إطلاقه للجمهور العام. نحتاج فقط إلى الإشارة إلى نطاق الويب الخاص بك.
تطبيق Android يتضمّن
com.android.vending.BILLING
الإذن في Google Play Console. ستكون السلع الرقمية "عمليات شراء داخل التطبيق" المرتبطة بهذا التطبيق في Google Play Console.وعليك أيضًا إنشاء إصدار في Play Console باستخدام هذا التطبيق، ولكن إذا إذا كنت لا تريد أن يكون الإصدار علنيًا، يمكنك إنشاء إصدار أولي مغلق الإصدار.
إذا لم يكن لديك تطبيق Android حاليًا، اتّبِع تعليمات ربط تطبيق Android
اشتراك واحد أو أكثر في Google Play Console، وهي السلع الرقمية التي تبيعها باستخدام Action (الإجراء). لاحظ أنه لا يمكنك إنشاء اشتراكات في Play Console إلا بعد إعداد المتطلبات الأساسية لتطبيق Android.
إذا لم يكن لديك اشتراكات، اتّبِع إنشاء تعليمات السلع الرقمية
ربط تطبيق Android
إذا لم يكن لديك حاليًا تطبيق Android حاصل على إذن الفوترة في Google Play Console، اتّبِع الخطوات التالية:
- في استوديو Android أو بيئة تطوير متكاملة لنظام التشغيل Android من اختيارك، وإنشاء مشروع جديد تحديد الخيارات في مطالبات إعداد المشروع بإنشاء تطبيق أساسي للغاية.
- أدخِل اسم حزمة للمشروع، مثل
com.mycompany.myapp
. لا تترك هذا الاسم كخيار افتراضي، لأنه لا يمكنك تحميل الحزم التي تضمينcom.example
في Play Console. - افتح ملف
AndroidManifest.xml
الخاص بتطبيقك. أضِف سطر الرمز التالي داخل العنصر
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>
أنشئ تطبيقك كملف APK موقَّع. في "استوديو Android"، اتّبِع الخطوات التالية:
- انتقِل إلى الإصدار، Create Signed Bundle / APK.
- انقر على التالي.
- ضمن مسار تخزين المفاتيح، انقر على إنشاء مسار جديد.
- املأ كل حقل ثم انقر على حسنًا. تدوين ملاحظات عن ملف تخزين المفاتيح وكلمة المرور وكلمة المرور الرئيسية وتخزينها في مكان آمن، نظرًا ستستخدمها لاحقًا.
- انقر على التالي.
- اختَر إصدار.
- اختَر V1 (توقيع JAR).
- انقر على إنهاء.
- بعد بضع ثوانٍ، سينشئ "استوديو Android" ملف
app-release.apk
. تحديد موقع هذا الملف لاستخدامه لاحقًا
في جلسة المعمل، Google Play Console، إنشاء تطبيق جديد.
انتقِل إلى إصدارات التطبيق.
ضمن مسارات الاختبار المغلق، انتقِل إلى إدارة ثم الإصدار الأولي.
انقر على الزر إنشاء إصدار.
ضمن السماح لشركة Google بإدارة مفتاح التوقيع وحمايته، أدخِل توقيعك. المعلومات الأساسية.
حمِّل ملف APK.
انقر على حفظ.
إنشاء سلعك الرقمية
إذا لم يكن لديك حاليًا أي سلع رقمية في Play Console، يُرجى اتّباع الخطوات التالية: الخطوات:
- في جلسة المعمل، Google Play Console، انتقِل إلى المنتجات داخل التطبيق ثم إلى الاشتراكات. إذا رأيت تحذيرًا، اتبع التعليمات السابقة لإنشاء تطبيق Android أو انقر على الرابط لإنشاء ملف شخصي للتاجر
- انقر على إنشاء اشتراك.
- املأ الحقول الخاصة بمنتجك الرقمي. قم بتدوين معرف المنتج، وهي الطريقة التي ستشير بها إلى هذا المنتج من الإجراء الخاص بك.
- انقر على حفظ.
- كرِّر الخطوات من 2 إلى 4 لكل منتج تريد بيعه.
إعداد مشروع "المهام مع مساعد Google"
يجب تفعيل السلع الرقمية التي تم إعدادها في Google Play Console المعاملات الرقمية وربط مشروع "المهام" بتطبيقك على Play.
لتفعيل معاملات السلع الرقمية في مشروع "المهام مع مساعد Google"، يُرجى اتّباع الخطوات التالية: الخطوات:
- في وحدة تحكُّم الإجراءات، افتح مشروعك أو أنشئ مشروعًا جديدًا.
- انتقِل إلى نشر ثم إلى معلومات الدليل.
- ضمن معلومات إضافية والمعاملات، ضَع علامة في المربّع نعم. ضمن هل تستخدم "مهامك" واجهة برمجة التطبيقات لعمليات الشراء الرقمية (DMA) لإجراء المعاملات. السلع الرقمية
- انقر على حفظ.
إنشاء مفتاح واجهة برمجة تطبيقات للسلع الرقمية
لإرسال طلبات إلى واجهة برمجة تطبيقات السلع الرقمية، يجب تنزيل خدمة JSON. مفتاح الحساب المرتبط بمشروع وحدة تحكّم المهام.
لاسترداد مفتاح حساب الخدمة، اتّبِع الخطوات التالية:
- في وحدة تحكّم المهام، النقر على رمز النقاط الثلاث في أعلى يسار الصفحة ثم إعدادات المشروع
- ابحث عن رقم تعريف المشروع للإجراء الخاص بك.
- يُرجى النقر على هذا الرابط مع استبدال "
<project_id>
". بمعرف مشروعك:https://console.developers.google.com/apis/credentials?project=project_id
- في شريط التنقل الرئيسي، انتقِل إلى بيانات الاعتماد.
- في الصفحة التي تظهر، انقر على إنشاء بيانات اعتماد، ثم على الخدمة مفتاح الحساب.
- انتقِل إلى حساب الخدمة، وانقر على حساب خدمة جديد.
- أدخِل اسمًا لحساب الخدمة، مثل Digitaltransactions.
- انقر على إنشاء.
- اضبط الدور على مشروع >. المالك:
- انقر على متابعة.
- انقر على إنشاء مفتاح.
- اختَر نوع مفتاح JSON.
- انقر على إنشاء مفتاح ونزِّل مفتاح حساب خدمة JSON.
يجب حفظ مفتاح حساب الخدمة هذا في مكان آمن. ستستخدم هذا المفتاح في التنفيذ لإنشاء عميل لواجهة برمجة تطبيقات عمليات الشراء الرقمية.
الربط بمستودعك على Play
للوصول إلى سلعك الرقمية من مشروع ضمن المهام، اربط نطاق الويب والتطبيق مع مشروعك المواقع المرتبطة.
ملاحظة: قد يستغرق إكمال خطوات الربط مدة تصل إلى أسبوع أثناء عملية التحقّق. مواقعك. إذا لم يتم ربط موقعك الإلكتروني أو تطبيقك بعد هذه الفترة، يمكنك التواصل مع فريق الدعم.
لربط نطاق الويب والتطبيق في Play Console بمشروع "المهام"، يُرجى اتّباع الخطوات التالية: الخطوات التالية:
- في وحدة تحكّم المهام، انتقِل إلى نشر، ثم إثبات ملكية العلامة التجارية.
إذا لم تكن قد ربطت أيّ مواقع، عليك أولاً ربط موقع إلكتروني:
- انقر على زر موقع الويب (</>).
- أدخِل عنوان URL لنطاق الويب الخاص بك وانقر على ربط.
ترسل Google رسالة إلكترونية تتضمن المزيد من التعليمات إلى الشخص تم إثبات ملكيته لنطاق الويب هذا في Google Search Console بعد أن يتبع مستلم هذه الرسالة الإلكترونية هذه الخطوات، يجب على موقع الويب ضمن إثبات ملكية العلامة التجارية.
بعد أن يكون لديك موقع إلكتروني واحد مرتبط على الأقل، عليك اتّباع الخطوات التالية ربط تطبيق Android:
- في وحدة تحكّم المهام، انتقِل إلى نشر، ثم إثبات ملكية العلامة التجارية.
- انقر على ربط التطبيق.
في الصفحة التي تظهر، اتّبِع التعليمات لإثبات ملكية موقعك الإلكتروني. النطاق على Play Console. اختَر تطبيق Play الذي يتضمّن السلع الرقمية، ثم أدخِل عنوان URL لنطاق الويب تمامًا كما يظهر على إثبات ملكية العلامة التجارية.
مرة أخرى، ترسل Google رسالة تحقق إلى مالك العنوان المعتمَد المجال. بعد موافقته على عملية التحقّق، من المفترض أن يكون تطبيقك على Play ضمن إثبات ملكية العلامة التجارية.
فعِّل الوصول إلى عمليات الشراء في Play.
بناء مسار الشراء
من خلال إعداد مشروعك على "المهام" ومخزون السلع الرقمية، يمكنك إنشاء نموذج تدفق شراء السلع في الرد التلقائي على الويب لتنفيذ محادثتك.
1. إعداد عميل واجهة برمجة تطبيقات عمليات الشراء الرقمية
في الردّ التلقائي على الويب لتنفيذ المحادثة، أنشِئ برنامج JWT باستخدام خدمتك.
مفتاح JSON للحساب
نطاق واحد (https://www.googleapis.com/auth/actions.purchases.digital
).
ينشئ رمز Node.js التالي برنامج JWT لواجهة برمجة التطبيقات لعمليات الشراء الرقمية:
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. جمع المعلومات
قبل أن يتمكّن المستخدم من إجراء عملية شراء، يجمع الإجراء معلومات حول قدرة المستخدم على إجراء عمليات الشراء والسلع المتوفرة من المستودع.
2. أ. التحقّق من صحة متطلبات المعاملة
من الممارسات الجيدة التأكد من أن حساب المستخدم تم إعداده لأداء
المعاملات، قبل منحهم خيار إجراء عملية شراء. هذه الخطوة
تشمل التحقّق من أنّ المستخدم لديه طريقة دفع تم إعدادها وأنّه في
مكان يتم فيه دعم المعاملات الرقمية. في بداية المعاملة
يمكنك استخدام مساعد "DIGITAL_PURCHASE_CHECK
" للتحقّق من صحة معاملة المستخدم.
من خلال "مساعد Google".
يستخدم رمز 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. ب. جمع المستودع المتاح
يمكنك استخدام واجهة برمجة التطبيقات لعمليات الشراء الرقمية لطلب تطبيقك من "متجر Play" المتاح حاليًا. ثم دمج تلك البيانات في مصفوفة من كائنات JSON لكل منتج. أنت تشير إلى هذا الصفيف لاحقًا لتوضح للمستخدم الخيارات المتاحة للشراء.
ويتم تمثيل كل سلعة رقمية كرمز تخزين تعريفي بتنسيق JSON. تشير رسالة الأشكال البيانية يوضح رمز Node.js التالي التنسيق المتوقع لكل رمز تخزين تعريفي:
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
)، وتنسيق النتيجة في
مصفوفة كائنات رمز التخزين التعريفي.
لاسترداد سلع رقمية معيّنة فقط في المصفوفة الناتجة، إدراج المنتج
معرّفات السلع الرقمية (كما هو موضّح أسفل كل منتج داخل التطبيق في Google Play)
Console) التي تريد إتاحتها للشراء في body.ids
.
ويطلب رمز Node.js التالي قائمة بالسلع المتاحة من واجهة برمجة التطبيقات لعمليات الشراء وتنسق النتيجة في صورة مصفوفة من رموز التخزين التعريفية:
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 التالي مصفوفة مستودع من كائنات رمز التخزين التعريفي وينشئ رد القائمة مع عنصر قائمة واحد كل منها:
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 التالي مع اختيار رمز التخزين التعريفي للمستخدم من استجابة قائمة
ويطلب الغرض من 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 (أو هدف حزمة تطوير البرامج (SDK) لـ "الإجراءات" (actions.intent.COMPLETE_PURCHASE
)) مع
وسيطة COMPLETE_PURCHASE_VALUE
تصف النتيجة. بناء النية،
عن طريق هذا الحدث، والذي توصل النتيجة إلى المستخدم.
التعامل مع نتائج الشراء المحتملة التالية:
PURCHASE_STATUS_OK
: تمت عملية الشراء بنجاح. المعاملة اكتملت في هذه المرحلة، لذا اخرج من مسار المعاملات وعُد إلى لمحادثتك.PURCHASE_STATUS_ALREADY_OWNED
: تعذّر إجراء المعاملة لأنّ المستخدم يمتلك هذا العنصر بالفعل. يمكنك تجنُّب هذا الخطأ من خلال التحقّق من طلب المستخدم السابق. المشتريات وتفصيل السلع المعروضة حتى لا يتاح لهم خيار إعادة شراء العناصر التي يمتلكونها بالفعل.PURCHASE_STATUS_ITEM_UNAVAILABLE
: تعذُّر إكمال المعاملة لأنّ العنصر المطلوب غير متوفر. يمكنك تجنُّب هذا الخطأ من خلال التحقّق من الخيارات المتاحة. رموز التخزين التعريفية عند اقتراب وقت الشراء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);
}
});
أن تعكس عمليات الشراء التي أجراها المستخدم
عندما يطلب أحد المستخدمين الإجراء الخاص بك، يشتمل كائن user
في الطلب JSON على قائمة.
مشترياتهم. يُرجى الاطّلاع على هذه المعلومات وتغيير ردّ الإجراء.
استنادًا إلى المحتوى الذي دفعه المستخدم.
يعرض الرمز النموذجي التالي عنصر 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"
}
]
}
],
...
}