إنشاء معاملات رقمية غير استهلاكية (Dialogflow)

يشرح هذا الدليل كيفية إضافة معاملات رقمية إلى الإجراءات الحوارية، حتى يتمكّن المستخدمون من شراء سلعك الرقمية غير الاستهلاكية.

المصطلحات الرئيسية: السلعة الرقمية غير الاستهلاكية هي وحدة تخزين (SKU) لا يمكن شراؤها سوى مرة واحدة، مثل الوصول المدفوع إلى محتوى إضافي في تطبيق "المهام" أو تطبيق Android. يختلف هذا النوع من المنتجات عن السلع الرقمية الاستهلاكية التي يمكن شراؤها واستخدامها وإعادة شراؤها.

لمزيد من المعلومات حول المنتجات غير الاستهلاكية التي تُستخدم لمرة واحدة، راجع مستندات Android حول الميزات الخاصة بالمنتجات التي تُستخدم لمرة واحدة.

القيود وإرشادات المراجعة

تنطبق سياسات إضافية على الإجراءات التي تتضمن معاملات. قد تستغرق مراجعة الإجراءات التي تتضمن معاملات بضعة أسابيع، لذا يُرجى أخذ هذا الوقت في الاعتبار عند التخطيط للجدول الزمني للإصدار. لتيسير عملية المراجعة، احرص على الالتزام بالسياسات والإرشادات المتعلّقة بالمعاملات قبل إرسال الإجراء الخاص بك للمراجعة.

لا يمكن نشر الإجراءات التي تبيع سلعًا رقمية إلا في البلدان التالية:

  • أستراليا
  • البرازيل
  • كندا
  • إندونيسيا
  • اليابان
  • المكسيك
  • روسيا
  • سنغافورة
  • تايلاند
  • تركيا
  • المملكة المتحدة
  • الولايات المتحدة

مسار المعاملة

يوضح هذا الدليل كل خطوة تطوير عند حدوثها في تدفق معاملة السلع الرقمية. عندما يعالج الإجراء الخاص بك معاملات للسلع الرقمية، فإنه يستخدم المسار التالي:

  1. إعداد عميل واجهة برمجة تطبيقات عمليات الشراء الرقمية: يستخدم الإجراء الخاص بك واجهة برمجة تطبيقات عمليات الشراء الرقمية للتواصل مع مستودعك الإعلاني على Google Play ومعاملاتك. قبل أن يفعل الإجراء الخاص بك أي شيء آخر، فإنه ينشئ عميل JWT باستخدام مفتاح خدمة للاتصال بواجهة برمجة تطبيقات عمليات الشراء الرقمية.
  2. جمع المعلومات: يجمع الإجراء الخاص بك معلومات أساسية حول المستخدم ومستودع Google Play الخاص بك للتحضير لمعاملة.
    1. التحقق من متطلبات المعاملات: يستخدم الإجراء الخاص بك مساعد متطلبات المعاملات الرقمية في بداية عملية الشراء للتأكّد من أنّ المستخدم يمكنه إجراء المعاملات.
    2. جمع المستودع الإعلاني المتاح: يتحقّق الإجراء الخاص بك من مستودعك على Google Play ويحدّد السلع المتاحة حاليًا للشراء.
  3. إنشاء الطلب: يعرض الإجراء الخاص بك السلع الرقمية المتاحة للمستخدم حتى يتمكّن من اختيار سلعة لشرائها.
  4. إكمال عملية الشراء: يستخدم الإجراء الخاص بك واجهة برمجة تطبيقات عمليات الشراء الرقمية لبدء عملية شراء من خلال اختيار المستخدم على "متجر Google Play".
  5. معالجة النتيجة: يتلقّى الإجراء الخاص بك رمز حالة للمعاملة ويُبلغ المستخدم بأنّ عملية الشراء تمّت بنجاح (أو يتطلّب خطوات إضافية).

المتطلبات الأساسية

قبل دمج المعاملات الرقمية في الإجراء الخاص بك، عليك استيفاء المتطلبات الأساسية التالية:

  • حساب مطوّر برامج وحساب تاجر على 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، وهي السلع الرقمية التي تبيعها من خلال الإجراء الخاص بك. تجدر الإشارة إلى أنّه لا يمكنك إنشاء منتجات مُدارة في Play Console إلا بعد إعداد المتطلبات الأساسية لتطبيق Android.

    إذا لم تكن لديك منتجات مُدارة، اتّبِع تعليمات إنشاء السلع الرقمية الخاصة بك.

ربط تطبيق Android

إذا لم يكن لديك حاليًا تطبيق Android بإذن الفوترة في Google Play Console، يُرجى اتّباع الخطوات التالية:

  1. في استوديو Android أو بيئة التطوير المتكاملة لـ Android التي تختارها، أنشئ مشروعًا جديدًا. حدد الخيارات في مطالبات إعداد المشروع لإنشاء تطبيق أساسي للغاية.
  2. أدخِل اسم حزمة للمشروع، مثل com.mycompany.myapp. لا تترك هذا الاسم كخيار تلقائي، لأنه لا يمكنك تحميل الحِزم التي تتضمّن com.example إلى Play Console.
  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"، اتّبِع الخطوات التالية:

    1. انتقِل إلى الإصدار، ثم إنشاء حزمة Signed Bundle / حِزمة APK.
    2. انقر على التالي.
    3. ضِمن مسار متجر المفاتيح، انقر على إنشاء جديد.
    4. املأ كل حقل، ثم انقر على حسنًا. دوِّن كلمة مرور متجر المفاتيح وكلمة مرور المفتاح، وخزّنهما في مكان آمن، لأنهما ستستخدمهما لاحقًا.
    5. انقر على التالي.
    6. اختَر إصدار.
    7. اختَر V1 (توقيع JAR).
    8. انقر على إنهاء.
    9. بعد بضع ثوانٍ، سينشئ "استوديو Android" ملف app-release.apk. حدِّد موقع هذا الملف لاستخدامه لاحقًا.
  6. في Google Play Console، أنشئ تطبيقًا جديدًا.

  7. انتقِل إلى إصدارات التطبيقات.

  8. ضمن قنوات مغلقة، انتقِل إلى إدارة ثم إصدار أولي.

  9. انقر على الزر إنشاء إصدار.

  10. ضمن السماح لشركة Google بإدارة مفتاح التوقيع وحمايته، أدخِل معلومات مفتاح التوقيع.

  11. حمِّل ملف APK.

  12. انقر على حفظ.

إنشاء السلع الرقمية

إذا لم تكن لديك حاليًا أي سلع رقمية في Play Console، يُرجى اتّباع الخطوات التالية:

  1. في Google Play Console، انتقِل إلى المنتجات داخل التطبيق ثم المنتجات المُدارة. إذا ظهر لك تحذير، اتّبِع التعليمات السابقة لإنشاء تطبيق Android أو انقر على الرابط لإنشاء ملف شخصي للتاجر.
  2. انقر على إنشاء منتج مُدار.
  3. املأ الحقول الخاصة بمنتجك الرقمي. دوِّن معرّف المنتج، وهو الطريقة التي ستشير بها إلى هذا المنتج من الإجراء الخاص بك.
  4. انقر على حفظ.
  5. كرِّر الخطوات من 2 إلى 4 لكل منتج تريد بيعه.

مثال على سلع غير استهلاكية في Google Play Console

تحضير مشروع المهام

عند إعداد السلع الرقمية في Google Play Console، عليك تفعيل المعاملات الرقمية وربط مشروع "المهام" بتطبيق Play.

لتفعيل معاملات السلع الرقمية في مشروع Actions (الإجراءات)، يُرجى اتّباع الخطوات التالية:

  1. في وحدة تحكُّم الإجراءات، افتح مشروعك أو أنشئ مشروعًا جديدًا.
  2. يُرجى الانتقال إلى نشر ثم معلومات الدليل.
  3. ضمن معلومات إضافية والمعاملات، ضَع علامة في المربّع نعم ضمن هل تستخدِم إجراءاتك واجهة برمجة تطبيقات الشراء الرقمي لإجراء معاملات السلع الرقمية.
  4. انقر على حفظ.

إنشاء مفتاح واجهة برمجة تطبيقات للسلع الرقمية

لإرسال طلبات إلى واجهة برمجة تطبيقات السلع الرقمية، عليك تنزيل مفتاح حساب خدمة JSON المرتبط بمشروع وحدة تحكّم المهام.

لاسترداد مفتاح حساب الخدمة، اتّبِع الخطوات التالية:

  1. في وحدة تحكم الإجراءات، انقر على رمز النقاط الثلاث في الزاوية العلوية اليسرى، ثم إعدادات المشروع.
  2. ابحث عن رقم تعريف مشروع الإجراء.
  3. يُرجى اتّباع هذا الرابط واستبدال "<project_id>" بمعرّف المشروع: https://console.developers.google.com/apis/credentials?project=project_id
  4. في شريط التنقّل الرئيسي، انتقِل إلى بيانات الاعتماد.
  5. في الصفحة التي تظهر، انقر على إنشاء بيانات اعتماد، ثم مفتاح حساب الخدمة.
  6. انتقِل إلى حساب الخدمة، وانقر على حساب خدمة جديد.
  7. امنح حساب الخدمة اسمًا مثل Digitaltransactions.
  8. انقر على إنشاء.
  9. اضبط الدور على المشروع > المالك.
  10. انقر على متابعة.
  11. انقر على إنشاء مفتاح.
  12. اختَر نوع المفتاح JSON.
  13. انقر على إنشاء مفتاح ونزِّل مفتاح حساب خدمة JSON.

احفظ مفتاح حساب الخدمة هذا في مكان آمن. ستستخدم هذا المفتاح في التنفيذ لإنشاء عميل لواجهة برمجة تطبيقات عمليات الشراء الرقمية.

الربط بمستودعك على Play

للوصول إلى السلع الرقمية من مشروع Actions، عليك ربط نطاق الويب والتطبيق بمشروعك كـ مواقع مرتبطة.

ملاحظة: قد يستغرق إكمال خطوات الربط مدة تصل إلى أسبوع أثناء إثبات ملكية مواقعك الإلكترونية. وإذا لم يتم ربط موقعك الإلكتروني أو تطبيقك بعد هذه الفترة، يمكنك التواصل مع فريق الدعم.

لربط تطبيق ونطاق الويب في Play Console بمشروع الإجراءات، اتّبِع الخطوات التالية:

  1. في وحدة تحكّم الإجراءات، انتقِل إلى نشر ثم إثبات ملكية العلامة التجارية.
  2. إذا لم تكن قد ربطت أي مواقع، عليك ربط موقع إلكتروني أولاً:

    1. انقر على زر موقع الويب (</>).
    2. أدخِل عنوان URL لنطاق الويب وانقر على ربط.

    ترسل Google رسالة إلكترونية تتضمّن المزيد من التعليمات إلى الفرد الذي تم إثبات ملكيته لنطاق الويب هذا في Google Search Console. بعد أن يتّبع مستلِم هذه الرسالة الإلكترونية هذه الخطوات، من المفترض أن يظهر الموقع الإلكتروني ضمن إثبات ملكية العلامة التجارية.

  3. بعد أن يصبح لديك موقع ويب مرتبط واحد على الأقل، نفِّذ الخطوات التالية لربط تطبيق Android:

    1. في وحدة تحكّم الإجراءات، انتقِل إلى نشر ثم إثبات ملكية العلامة التجارية.
    2. انقر على ربط التطبيق.
    3. في الصفحة التي تظهر، اتّبِع التعليمات لإثبات ملكية نطاق الويب على Play Console. اختَر تطبيق Play الذي يتضمّن السلع الرقمية ثم أدخِل عنوان URL لنطاق الويب كما يظهر بالضبط في صفحة إثبات ملكية العلامة التجارية.

      ترسل Google مرة أخرى رسالة تحقق إلى المالك المعتمد للنطاق. بعد موافقته على إثبات الملكية، من المفترض أن يظهر تطبيقك على Play ضمن التحقق من العلامة التجارية.

    4. تفعيل الوصول إلى عمليات الشراء في Play

صورة تعرض الموقع الإلكتروني والتطبيقات المرتبطة بمشروع &quot;المهام&quot;

بناء تدفق الشراء

بعد تجهيز مشروع "المهام" ومستودع السلع الرقمية، يمكنك إنشاء تدفق شراء السلع الرقمية في الرد التلقائي على الويب لتنفيذ المحادثات.

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 Console (على سبيل المثال، com.myapp.digitalgoods)، وتنسيق النتيجة في مصفوفة من كائنات رموز التخزين التعريفية.

لاسترداد سلع رقمية معيّنة فقط في المصفوفة الناتجة، أدرِج أرقام تعريف المنتجات الرقمية (كما هو موضّح أسفل كل منتج داخل التطبيق في Google Play Console) تريد إتاحتها للشراء في body.ids.

يطلب رمز Node.js التالي قائمة بالسلع المتاحة من Digital purchases API وينسق النتيجة كمصفوفة من رموز التخزين التعريفية:

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. بناء الطلب

لبدء عملية الشراء الرقمية للمستخدم، قدم قائمة بالسلع الرقمية المتاحة للشراء. يمكنك استخدام مجموعة متنوعة من أنواع الردود التفاعلية لتمثيل سهمك ومطالبة المستخدم بالاختيار.

يقرأ رمز 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 التالي مع اختيار رمز التخزين التعريفي للمستخدم من استجابة القائمة ويطلب الغرض 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. التعامل مع النتيجة

عند اكتمال عملية الشراء، يتم تشغيل حدث Dialogflow actions_intent_COMPLETE_PURCHASE (أو هدف حزمة 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"
        }
      ]
    }
  ],
  ...
}