یکپارچه‌سازی صورت‌حساب Play خود را به حداکثر برسانید

۱. مرور کلی

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

ما به شما کمک خواهیم کرد تا اعلان‌های توسعه‌دهنده‌ی بلادرنگ (RTDN) و آزمایشگاه پرداخت Play را برای اشتراک‌ها و محصولات یکبار مصرف برای برنامه‌ها و بازی‌های خود تنظیم کنید. شما یاد خواهید گرفت که چگونه ریزش مشترکین را کاهش دهید؛ در برابر کلاهبرداری و سوءاستفاده محافظت کنید؛ موارد پیشرفته را آزمایش کنید؛ مشکلات بالقوه را شبیه‌سازی، بازتولید و برطرف کنید؛ و پیشنهادات و تغییرات قیمت را بدون تأثیرگذاری بر کاربران آزمایش کنید.

در پایان، شما آماده خواهید بود تا استراتژی‌های بازگشت سرمایه را پیاده‌سازی کنید، چالش‌های ادغام را به سرعت حل کنید، بازگشت سرمایه را بهبود بخشید، یک تجربه عالی ارائه دهید و برنامه و به‌روزرسانی‌های خود را با اطمینان منتشر کنید.

پیش‌نیازها

آنچه یاد خواهید گرفت

  • چگونه چرخه عمر خرید خود را به درستی مدیریت کنید تا با تکنیک‌هایی برای بهبود تبدیل‌های خرید و حفظ مشتری، به بهینه‌سازی رشد کمک کنید.
  • نحوه تنظیم اعلان‌های توسعه‌دهنده بلادرنگ (RTDN) با استفاده از Google Cloud Pub/Sub، که می‌توان از آن برای اجرای کمپین‌های بازگشت به چرخه حیات و سایر استراتژی‌های مدیریت چرخه عمر استفاده کرد.
  • نحوه تنظیم یک گیرنده در سرور backend شما برای مدیریت ایمن اعلان‌ها با ردیابی دقیق و احراز هویت برای کاهش بازپرداخت‌های ناخواسته یا خطرات کلاهبرداری و سوءاستفاده
  • چگونه با استفاده از Play Billing Lab، یکپارچه‌سازی خود را آزمایش کرده و خطاها را شبیه‌سازی کنید تا تجربه کاربری خود را بهبود بخشیده و در عین حال هزینه‌های توسعه را کاهش دهید

آنچه نیاز دارید

۲. استراتژی‌های کسب درآمد برای اشتراک‌ها و خریدهای یک‌باره

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

یک جریان خرید رایج برای خرید یا اشتراک یک‌باره شامل چندین مرحله خواهد بود:

  1. کاربر اقلام را برای خرید مرور می‌کند.
  2. جریان خرید را برای کاربر راه‌اندازی کنید تا خرید و پرداخت را تکمیل کند.
  3. به سرور خود در مورد خرید تکمیل شده اطلاع دهید
  4. خرید را روی سرور خود تأیید کنید.
  5. محتوا را به کاربر بدهید.
  6. تحویل محتوا را تأیید کنید. برای محصولات مصرفی، خرید را در زمان مناسب انجام دهید تا کاربر بتواند دوباره آن کالا را خریداری کند.

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

اعلان‌های توسعه‌دهنده‌ی بلادرنگ (RTDN) راهی عالی برای تشخیص این مراحل مختلف در چرخه‌ی خرید هستند و می‌توانند به طور مؤثر هم به عنوان یک ابزار ردیابی عملکرد بلادرنگ و هم به عنوان ابزاری برای فعال کردن استراتژی‌های بازگشت مشترکین مورد استفاده قرار گیرند.

برای مثال: فرض کنید کاربر شما به تازگی یک کالای جدید خریداری کرده یا پرداخت خود را انجام نداده است، بنابراین اشتراک وارد دوره مهلت شده است. با RTDN مناسب، می‌توانید تقریباً در لحظه تشخیص دهید که وضعیت کاربر تغییر کرده است و بر اساس آن عمل کنید، یا با درگیر کردن بیشتر کاربر با کالایی که تازه خریداری کرده یا با ارسال ایمیل‌های یادآوری برای به‌روزرسانی جزئیات پرداخت خود برای ادامه اشتراک.

RTDNها همچنین راهی عالی برای افزودن کنترل‌های اضافی سمت سرور هستند تا به شما در مدیریت خریدها حتی زمانی که کلاینت کاربر با مشکل مواجه است، کمک کنند. فرض کنید کاربری خرید موفقی انجام داده و از گوگل تأیید دریافت کرده است، اما دستگاه او قبل از اینکه دستگاهش اتصال به شبکه را از دست بدهد، از طریق شنونده خرید، اعلان خرید را دریافت می‌کند. با RTDNها، شما یک اعلان مستقل از طریق سرور خود دریافت خواهید کرد که به شما امکان می‌دهد خرید را تشخیص داده و حق استفاده را مستقل از مشکل کلاینت به کاربر اعطا کنید و فرآیند خرید قابل اعتمادی را تضمین کنید.

می‌توانید در اینجا درباره انواع RTDN های پشتیبانی‌شده فعلی بیشتر بیاموزید. هر نوع RTDN وضعیت خرید متمایزی را نشان می‌دهد. پیاده‌سازی مکانیسم‌های مدیریت مربوطه برای اطمینان از پردازش صحیح در موارد استفاده شما بسیار مهم است. این آزمایشگاه کد، مثالی را ارائه می‌دهد که پیام RTDN را در سرور امن backend شما مدیریت می‌کند، از جمله دریافت پیام، اعتبارسنجی خرید و اعطای مجوز به کاربر صحیح، زمانی که کاربر با موفقیت خریدی را در برنامه شما انجام می‌دهد. و در مرحله بعد، نحوه پیکربندی RTDN ها را برای برنامه شما نشان خواهیم داد.

۳. پیکربندی اعلان‌های توسعه‌دهنده‌ی بلادرنگ (RTDN)

اعلان‌های توسعه‌دهنده‌ی بلادرنگ (RTDN) از Google Cloud Pub/Sub بهره می‌برند تا به شما امکان دهند فوراً به تغییرات وضعیت خرید واکنش نشان دهید. Cloud Pub/Sub یک سرویس پیام‌رسانی بلادرنگ کاملاً مدیریت‌شده است که می‌توانید از آن برای ارسال و دریافت پیام بین برنامه‌های مستقل استفاده کنید. Google Play از Cloud Pub/Sub برای انتشار اعلان‌های فوری در مورد موضوعاتی که در آنها مشترک می‌شوید، استفاده می‌کند.

برای فعال کردن RTDN، ابتدا باید Cloud Pub/Sub را با استفاده از پروژه Google Cloud Platform (GCP) خود راه‌اندازی کنید و سپس اعلان‌ها را برای برنامه خود فعال کنید. اگر با GCP و Cloud Pub/Sub آشنا نیستید، به راهنمای شروع سریع مراجعه کنید.

ایجاد تاپیک

برای شروع دریافت اعلان‌ها، باید موضوعی ایجاد کنید که گوگل پلی باید اعلان‌ها را در آن منتشر کند. برای ایجاد یک موضوع، دستورالعمل‌های موجود در «ایجاد موضوع» را دنبال کنید.

ایجاد اشتراک Pub/Sub

برای دریافت پیام‌های منتشر شده در یک موضوع، باید یک اشتراک انتشار/زیرمجموعه برای آن موضوع ایجاد کنید. برای ایجاد اشتراک انتشار/زیرمجموعه، موارد زیر را انجام دهید:

  1. برای آشنایی با نحوه پیکربندی اشتراک به صورت push subscription یا pull subscription ، راهنمای Cloud Pub/Sub Subscriber را مطالعه کنید. در این آزمایشگاه کد، ما با یک اشتراک pull کار خواهیم کرد که به سرور backend امن شما نیاز دارد تا درخواست‌ها را به سرور Cloud Pub/Sub برای بازیابی پیام‌ها آغاز کند.
  1. برای ایجاد اشتراک، دستورالعمل‌های موجود در بخش «افزودن اشتراک» را دنبال کنید.

اعطای حق انتشار در موضوع شما

Cloud Pub/Sub مستلزم آن است که به Google Play امتیازات لازم برای انتشار اعلان‌ها در موضوع خود را اعطا کنید.

  1. کنسول ابری گوگل را باز کنید.
  2. پروژه خود را انتخاب کنید و سپس در نوار جستجو عبارت " Pub/Sub" را جستجو کنید و به صفحه پیکربندی Pub/Sub بروید. Search and land on the Pub/Sub config page
  3. موضوع مورد نظر خود را پیدا کنید و تنظیمات مجوزها را باز کنید. Open the permission setting
  4. برای افزودن حساب سرویس google-play-developer-notifications@system.gserviceaccount.com روی ADD PRINCIPAL کلیک کنید و به آن نقش Pub/Sub Publisher بدهید. Add the service account google-play-developer-notifications@system.gserviceaccount.com, and grant it the role of Pub/Sub Publisher
  5. برای تکمیل تنظیمات موضوع، روی ذخیره کلیک کنید. Click Save to complete the topic set up.

فعال کردن RTDN برای برنامه شما

یاد بگیرید که اعلان‌های توسعه‌دهنده‌ی بلادرنگ (RTDN) را تنظیم کنید تا ادغام Play Billing خود را به طور قابل توجهی بهبود بخشید. می‌توانید با پیام‌رسانی شخصی‌سازی‌شده، قابلیت اطمینان خرید را بهبود بخشید و همچنین از کلاهبرداری و سوءاستفاده جلوگیری کنید تا بازگشت سرمایه کلی خود را بهبود بخشید.

RTDNها به‌روزرسانی‌های فوری سرور به سرور را مستقیماً از Google Play برای رویدادهای کلیدی، مانند تمدید اشتراک، خریدهای جدید و مشکلات پرداخت، ارائه می‌دهند. آن‌ها به سیستم‌های backend شما کمک می‌کنند تا به‌طور خودکار با وضعیت واقعی حقوق کاربر همگام‌سازی شوند، فراتر از محدودیت‌های سمت کلاینت حرکت کنند و شما را قادر سازند تا فوراً و به‌طور مناسب واکنش نشان دهید.

نحوه فعال کردن اعلان‌های توسعه‌دهنده در لحظه برای برنامه شما:

  1. کنسول گوگل پلی را باز کنید.
  2. برنامه خود را انتخاب کنید.
  3. به «کسب درآمد از طریق بازی» > «تنظیمات کسب درآمد» بروید.
  4. به بخش اعلان‌های توسعه‌دهنده‌ی بلادرنگ (Real-time developer notifications) بروید.
  5. گزینه فعال کردن اعلان‌های بلادرنگ را تیک بزنید.
  6. در فیلد نام موضوع (Topic name )، نام کامل موضوع Cloud Pub/Sub را که قبلاً پیکربندی کرده‌اید، وارد کنید. نام موضوع باید به فرمت projects/{project_id}/topics/{topic_name} باشد که در آن project_id شناسه منحصر به فرد پروژه شما و topic_name نام موضوعی است که قبلاً ایجاد شده است.
  7. برای ارسال یک پیام آزمایشی، روی «ارسال پیام آزمایشی» کلیک کنید. انجام یک انتشار آزمایشی به شما کمک می‌کند تا از تنظیم و پیکربندی صحیح همه چیز اطمینان حاصل کنید. اگر انتشار آزمایشی با موفقیت انجام شود، پیامی نمایش داده می‌شود که نشان می‌دهد انتشار آزمایشی موفقیت‌آمیز بوده است. اگر برای این موضوع، اشتراکی پیوست کرده‌اید، باید پیام آزمایشی را دریافت کنید. برای اشتراک pull، به اشتراک در Cloud Console بروید، روی «مشاهده پیام‌ها» کلیک کنید و به دریافت پیام‌ها ادامه دهید. برای جلوگیری از ارسال مکرر توسط Cloud Pub/Sub، باید هر پیامی را که pull کرده‌اید، تأیید کنید. برای اشتراک push ، بررسی کنید که آیا پیام آزمایشی به نقطه پایانی push شما تحویل داده شده است یا خیر. یک کد پاسخ موفقیت‌آمیز به عنوان پیام تأیید عمل می‌کند. اگر انتشار با شکست مواجه شود، خطایی نشان داده می‌شود. مطمئن شوید که نام موضوع صحیح است و حساب سرویس google-play-developer-notifications@system.gserviceaccount.com به موضوع دسترسی Pub/Sub Publisher دارد.
  8. انواع اعلان‌هایی را که می‌خواهید دریافت کنید، انتخاب کنید.
  • برای اشتراک‌ها و تمام خریدهای لغو شده اعلان دریافت کنید - اعلان‌های توسعه‌دهنده را در لحظه مربوط به اشتراک‌ها و خریدهای لغو شده دریافت کنید. برای خریدهای یکباره محصول اعلان دریافت نخواهید کرد.
  • دریافت همه اعلان‌ها برای اشتراک‌ها و محصولات یکبار مصرف - برای همه رویدادهای اشتراک و خرید لغو شده اعلان دریافت کنید. همچنین رویدادهای خرید محصول یکبار مصرف، مانند ONE_TIME_PRODUCT_PURCHASED و ONE_TIME_PRODUCT_CANCELED را دریافت خواهید کرد. برای کسب اطلاعات بیشتر در مورد این رویدادهای خرید، به چرخه عمر خرید یکبار مصرف مراجعه کنید.

a266e5dec5c93cd8.png

  1. روی ذخیره تغییرات کلیک کنید.

اکنون اعلان‌های توسعه‌دهنده‌ی بلادرنگ را برای برنامه‌ی خود تکمیل کرده‌اید و ابزارهایی را برای مقابله با چالش‌های رایج، مانند ریزش کاربر از طریق پیام‌های بازگشت به سایت، یا کلاهبرداری و سوءاستفاده، در اختیار دارید. در بخش بعدی، یک مشترک در سرور امن backend شما ایجاد خواهیم کرد تا پیام‌های ارسالی به Cloud Pub/Sub topic شما را مصرف کند.

۴. دریافت اعلان‌ها

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

این امر مستلزم آن است که تکمیل خرید به موقع شناسایی و پردازش شود. کتابخانه صورتحساب Play روش‌های متعددی برای شناسایی خریدها در برنامه شما ارائه می‌دهد. پس از تشخیص یک خرید تکمیل شده، برنامه شما باید به سرور backend خود اطلاع دهد تا خرید را تأیید کند، محتوا را به کاربر صحیح اعطا کند و سپس به Google اطلاع دهد که خرید پردازش شده است. با این حال، ممکن است اتفاق بیفتد که برنامه شما به دلایل مختلف خرید را به موقع تشخیص نداده باشد. به عنوان مثال، یک کاربر می‌تواند خرید موفقی انجام دهد و از Google تأیید دریافت کند، اما دستگاه او قبل از اینکه دستگاهش اتصال شبکه را از دست بدهد و برنامه شما از طریق رابط کتابخانه صورتحساب Play اعلان دریافت کند، اتصال به شبکه را از دست می‌دهد. RTDN کنترل‌های سمت سرور اضافی را برای کمک به شما در مدیریت خریدها حتی زمانی که مشتری کاربر مشکلی دارد، فراهم می‌کند. RTDN اعلان‌های مستقل به سرور شما را پس از تغییرات وضعیت خرید تضمین می‌کند و به شما این امکان را می‌دهد که تغییرات وضعیت خرید را تقریباً بلافاصله از طریق یک مسیر دوم مستقل از مشکلات احتمالی مشتری تشخیص دهید و فرآیند خرید قابل اعتمادتری را تضمین کنید.

در این بخش، شما یک مشترک (subscriber) ایجاد خواهید کرد تا پیام‌های ارسالی به موضوع Cloud Pub/Sub شما را با استفاده از کتابخانه‌های Cloud Pub/Sub Client دریافت کند. این کتابخانه‌ها به زبان‌های مختلفی در دسترس هستند. در بخش‌های بعدی، ما به مشترک (subscriber) اضافه خواهیم کرد تا خرید را تأیید کند، به کاربر صحیح مجوز دسترسی بدهد و خرید را در سرور تأیید/مصرف کند. برای این آزمایشگاه کد، ما از جاوا استفاده می‌کنیم.

هر انتشاری که در یک موضوع Cloud Pub/Sub انجام می‌شود، شامل یک فیلد داده کدگذاری شده با base64 است.

{
 "message": {
   "attributes": {
     "key": "value"
   },
   "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
   "messageId": "136969346945"
 },
 "subscription": "projects/myproject/subscriptions/mysubscription"
}

پس از رمزگشایی فیلد داده کدگذاری شده با base64، DeveloperNotification شامل فیلدهای زیر خواهد بود:

{
 "version": string,
 "packageName": string,
 "eventTimeMillis": long,
 "oneTimeProductNotification": OneTimeProductNotification,
 "subscriptionNotification": SubscriptionNotification,
 "voidedPurchaseNotification": VoidedPurchaseNotification,
 "testNotification": TestNotification
}

برای اطلاعات بیشتر، لطفاً به مرجع اعلان‌های توسعه‌دهنده در لحظه مراجعه کنید.

کد نمونه‌ی یک NotificationReceiver برای سرور امن backend شما جهت پردازش پیام‌های Pub/Sub در زیر آمده است. برای احراز هویت در مرکز فرماندهی امنیت، اعتبارنامه‌های پیش‌فرض برنامه را تنظیم کنید، به بخش تنظیم احراز هویت برای یک محیط توسعه‌ی محلی مراجعه کنید.

import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.Base64;
import org.json.JSONObject;

/** Real-time developer notifications receiver. */
public class NotificationReceiver {

 private NotificationReceiver() {}

 /*
  * Receive notification messages from the subscription.
  *
  * @param projectId The project ID of your Google Cloud Project.
  * @param subscriptionId The subscription ID of the subscriber to the pub/sub topic.
  */
 public static void receiveNotificationMessages(String projectId, String subscriptionId) {
   ProjectSubscriptionName subscriptionName =
       ProjectSubscriptionName.of(projectId, subscriptionId);

   try {
     Subscriber subscriber =
         Subscriber.newBuilder(subscriptionName, new NotificationMessageReceiver()).build();
     // Start the subscriber.
     subscriber.startAsync().awaitRunning();

     subscriber.awaitTerminated();
   } catch (IllegalStateException e) {
     System.out.println("Subscriber stopped: " + e);
   }
 }

 static class NotificationMessageReceiver implements MessageReceiver {

   @Override
   public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
     // Decode the data into a String from the message data field.
     String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
     // Parse the String into a JSON object.
     JSONObject messageJson = new JSONObject(jsonString);

     // Fetch the value for certain fields.
     String version = messageJson.getString("version");
     String packageName = messageJson.getString("packageName");
     System.out.println("version: " + version);
     System.out.println("packageName: " + packageName);

     // Validate the purchase and grant the entitlement as needed.
     // More details in the following sections.
     // ......

     // Acknowledge the message to avoid repeated delivery.
     consumer.ack();
   }
 }
}

اکنون، شما یک گیرنده اعلان دارید که پیام‌های ارسالی به موضوع Cloud Pub/Sub شما را در سرور backend امن شما دریافت می‌کند. در بخش‌های بعدی، بهترین شیوه‌ها برای پردازش پیام‌های RTDN در سرور backend شما را پوشش خواهیم داد.

۵. شناسه‌های کاربر را در جریان خرید برنامه خود ضمیمه کنید

وقتی سرور شما پیام RTDN مربوط به به‌روزرسانی وضعیت خرید را دریافت می‌کند، باید بداند کدام کاربر خرید را انجام داده تا آن را پردازش کند، مثلاً محتوا را به کاربر صحیح تحویل دهد. می‌توانید با پیوست کردن هرگونه شناسه کاربری که برای کاربر خریدار دارید، با استفاده از obfuscatedAccountId هنگام راه‌اندازی جریان خرید در برنامه خود، به این هدف دست یابید. یک شناسه نمونه می‌تواند یک نسخه مبهم از ورود کاربر در سیستم شما باشد. تنظیم این پارامتر می‌تواند به گوگل در تشخیص کلاهبرداری کمک کند. علاوه بر این، می‌تواند به شما کمک کند تا اطمینان حاصل کنید که خریدها به کاربر صحیح نسبت داده می‌شوند، همانطور که در اعطای حقوق به کاربران بحث شده است.

کد زیر کدهای نمونه‌ای را برای پیوست کردن شناسه کاربر هنگام راه‌اندازی جریان خرید در برنامه با تنظیم obfuscatedAccountId نشان می‌دهد.

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// A user identifier, e.g. an obfuscated user id in your system.
String obfuscatedAccountId = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
            // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // set the offer token to specify the offer to purchase when applicable, e.g., subscription products
            // .setOfferToken(offerToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .setObfuscatedAccountId(obfuscatedAccountId)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

همانطور که در بخش بعدی خواهید دید، شناسه کاربری تنظیم شده در جریان خرید، در خرید لحاظ می‌شود و می‌توان از آن برای اعطای مجوز به کاربر صحیح استفاده کرد.

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

در این بخش، بهترین شیوه‌ها برای تأیید خریدها قبل از اعطای مجوز در سرور امن backend شما را بررسی خواهیم کرد.

پس از اینکه کاربر یک خرید محصول یکباره انجام داد، مشترک Pub/Sub در سرور امن backend شما یک پیام Pub/Sub دریافت خواهد کرد. شما باید موارد زیر را در سرور backend خود انجام دهید:

  1. purchaseToken از پیام Pub/Sub تجزیه کنید. شما باید سابقه‌ای از تمام مقادیر purchaseToken را برای همه خریدها نگهداری کنید.
  2. تأیید کنید که مقدار purchaseToken برای خرید فعلی با هیچ یک از مقادیر purchaseToken قبلی مطابقت ندارد. purchaseToken به صورت جهانی منحصر به فرد است، بنابراین می‌توانید با خیال راحت از این مقدار به عنوان کلید اصلی در پایگاه داده خود استفاده کنید.
  3. از نقطه پایانی purchases.products:get در API توسعه‌دهندگان گوگل پلی برای تأیید قانونی بودن خرید توسط گوگل استفاده کنید.
  1. اگر خرید قانونی باشد و قبلاً استفاده نشده باشد، می‌توانید با خیال راحت حق استفاده از آیتم یا اشتراک درون‌برنامه‌ای را اعطا کنید.
  2. شما باید فقط زمانی که وضعیت خرید، خریداری PURCHASED است، مجوز خرید (Assignment) بدهید و مطمئن شوید که خریدهای PENDING را به درستی مدیریت می‌کنید. می‌توانید اطلاعات بیشتر را در بخش «مدیریت تراکنش‌های در حال انتظار» (Managing Pending transactions) بیابید.

مثال کد زیر یک کلاینت API برای API توسعه‌دهندگان گوگل پلی ایجاد می‌کند. ما بعداً از آن برای فراخوانی‌های API استفاده خواهیم کرد.

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.androidpublisher.AndroidPublisher;
import com.google.api.services.androidpublisher.AndroidPublisherScopes;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

/** Helper class to initialize the publisher APIs client library. */
public class AndroidPublisherHelper {
 /* Your application name */
 private static final String APPLICATION_NAME = "YourApplicationName";

 /* Load credentials from a JSON key file. Replace with the actual path to your downloaded service
  * account key file.
  */
 private static final String RESOURCES_CLIENT_SECRETS_JSON =
     "/path/to/your/service_account_key.json";

 /** Global instance of the JSON factory. */
 private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

 /* The API client */
 private static final AndroidPublisher ANDROID_PUBLISHER = init();

 /**
  * Performs all necessary setup steps for running requests against the API.
  *
  * @return the {@link AndroidPublisher} service
  */
 private static AndroidPublisher init(){
   try {
     // Authorization.
     Credential credential =
         GoogleCredential.fromStream(
                 AndroidPublisherHelper.class.getResourceAsStream(RESOURCES_CLIENT_SECRETS_JSON))
             .createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

     // Set up and return API client.
     return new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, credential)
         .setApplicationName(ApplicationConfig.APPLICATION_NAME)
         .build();
   } catch (GeneralSecurityException | IOException ex) {
     throw new RuntimeException("fail to initialize the publisher APIs client library", ex);
   }
 }
}

سپس، منطق لازم برای فراخوانی API را اضافه می‌کنیم و گیرنده‌ای که قبلاً ساخته شده را اصلاح می‌کنیم تا خرید را اعتبارسنجی کرده و مجوز را به کاربر صحیح اعطا کند.

در AndroidPublisherHelper ، متد زیر را برای دریافت ProductPurchase از نقطه پایانی Purchases.products:get در API توسعه‌دهنده Google Play اضافه کنید.

 /* Fetch the ProductPurchase for the one-time product purchase from
  * Purchases.products.get endpoint in the Google Play Developer API
  */
 public static ProductPurchase executeProductPurchasesGet(
     String packageName, String sku, String purchaseToken) {
   try {
     ProductPurchase productPurchase =
         ANDROID_PUBLISHER.purchases().products().get(packageName, sku, purchaseToken).execute();
     return productPurchase;
   } catch (IOException ex) {
     log.error("Exception was thrown while getting a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to fetch the purchase in case of transient failures.
     return null;
   }
 }

در NotificationMessageReceiver ، خرید را تأیید کنید و بر اساس داده‌های موجود در اعلان، مجوز را به کاربر صحیح در سیستم خود اعطا کنید. شما باید purchaseToken را در سرور خود پیگیری کنید تا از پردازش تکراری جلوگیری شود.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   // Decode the data into a String from the message data field.
   String jsonString = new String(Base64.getDecoder().decode(message.getData().toStringUtf8()));
   // Parse the String into a JSON object.
   JSONObject messageJson = new JSONObject(jsonString);

   // Fetch the value for certain fields.
   String version = messageJson.getString("version");
   String packageName = messageJson.getString("packageName");

   // Process notification data based on your business requirements.
   // Process oneTimeProductNotification in the message.
   JSONObject oneTimeProductNotificationJson =
       messageJson.getJSONObject("oneTimeProductNotification");
   if (oneTimeProductNotificationJson != null) {
     String purchaseToken = oneTimeProductNotificationJson.getString("purchaseToken");
     String sku = oneTimeProductNotificationJson.getString("sku");
     int notificationType = oneTimeProductNotificationJson.getInt("notificationType");

     if (notificationType == 1) {
       // ONE_TIME_PRODUCT_PURCHASED - A one-time product was successfully purchased by a user.
       // Verify that the purchaseToken value does not match any previous purchaseToken values in
       // your backend system to avoid duplicate processing.
       ......
       // Fetch the ProductPurchase from Purchases.products.get endpoint
       ProductPurchase productPurchase =
         AndroidPublisherHelper.executeProductPurchasesGet(packageName, sku, purchaseToken);
       if (productPurchase != null && productPurchase.getPurchaseState() == 0) {
         // The purchase is valid and in PURCHASED state.

         // The account Id set in the App when launching the billing flow.
         String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
         // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
         // system.
       ......
       }
     }
     // Process subscriptionNotification in the message.
     JSONObject subscriptionNotificationJson = messageJson.getJSONObject("subscriptionNotification");
     if (subscriptionNotificationJson != null) {
       ......
     }
     // Process other notification data in the message as needed.
     ......
   }

   // Acknowledge the message to avoid repeated delivery.
   consumer.ack();
 }

۷. به گوگل اطلاع دهید که خرید پردازش شده است

پس از اعطای مجوز، باید با فراخوانی نقاط پایانی purchases.products:consume یا purchases.products:acknowledge در Play Developer API از سرور امن backend خود، به گوگل اطلاع دهید که خرید پردازش شده است تا یک محصول مصرفی را مصرف یا یک محصول غیر مصرفی را تأیید کند.

در AndroidPublisherHelper ، متدهای زیر را برای فراخوانی purchases.products:consume یا purchases.products:acknowledge در API توسعه‌دهنده Google Play اضافه کنید.

 /* Consume the one-time product purchase by calling
  * Purchases.products.consume endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesConsume(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().consume(packageName, sku, purchaseToken).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while consuming a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly consumed in case of transient failures.
   }
 }

 /* Acknowledge the one-time product purchase by calling
  * Purchases.products.acknowledge endpoint in the Google Play Developer API
  */
 public static void executeProductPurchasesAcknowledge(
     String packageName, String sku, String purchaseToken) {
   try {
     ANDROID_PUBLISHER
       .purchases().products().acknowledge(packageName, sku, purchaseToken, new ProductPurchasesAcknowledgeRequest()).execute();
   } catch (IOException ex) {
     log.error("Exception was thrown while acknowledging a product purchase", ex);
     // It is recommended to apply some retry mechanism, such as exponential backoff, to ensure the purchase is correctly acknowledged in case of transient failures.
   }
 }

در NotificationMessageReceiver ، پس از اعطای مجوز در سرور backend خود، خرید محصول مصرفی را مصرف کنید یا خرید محصول غیر مصرفی را تأیید کنید.

 @Override
 public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
   ......
       String obfuscatedExternalAccountId = productPurchase.getObfuscatedExternalAccountId();
       // Grant the entitlement to the correct account for obfuscatedExternalAccountId in your
       // system.
       ......
       // If the product is a consumable product, consume the purchase.
       AndroidPublisherHelper.executeProductPurchasesConsume(packageName, sku, purchaseToken);
       // Or if the product is a non-consumable product, acknowledge the purchase.
       // AndroidPublisherHelper.executeProductPurchasesAcknowledge(packageName, sku, purchaseToken);
  ......

 }

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

عالی بود! شما با موفقیت اعلان‌های توسعه‌دهنده‌ی بلادرنگ را ادغام کردید و پردازش خرید قابل اعتمادی را همانطور که در این آزمایشگاه کد نشان داده شده است، فعال کردید. اکنون، برای اطمینان از عملکرد بی‌نقص همه چیز، بیایید آزمایشگاه پرداخت Play را بررسی کنیم، ابزاری کاربرپسند که برای کمک به آزمایش ادغام پرداخت Play شما طراحی شده است.

۸. با Play Billing Lab تست کنید

برای اینکه با اطمینان خاطر شروع به کار کنید، باید در طول توسعه، ادغام خود را آزمایش کنید. Play Billing Lab یک برنامه اندروید رایگان است که به توسعه‌دهندگان کمک می‌کند تا ادغام خود را با سیستم پرداخت گوگل پلی آزمایش کنند و راهی آسان و راحت برای توسعه‌دهندگان فراهم می‌کند تا ویژگی‌های Play Billing را آزمایش کنند، سریع‌تر ادغام شوند و با اطمینان بیشتری شروع به کار کنند.

آزمایشگاه پرداخت Play ویژگی‌های آزمایشی مختلفی را برای کمک به آزمایش سناریوهای مختلف ارائه می‌دهد، از جمله:

ما به طور مداوم قابلیت‌های تست جدیدی را به برنامه Play Billing Lab اضافه می‌کنیم. می‌توانید Play Billing Lab را از فروشگاه Play دانلود و نصب کنید، یا برای اطلاعات بیشتر در مورد تست با Play Billing Lab، به بخش «تست ادغام» مراجعه کنید.

برای آزمایش BillingResponseCode از Play Billing Lab استفاده کنید

هنگام ادغام برنامه خود با کتابخانه صورتحساب Play، آزمایش تمام جریان‌های BillingResponseCode یک چالش رایج است، زیرا شما کنترل زیادی بر ارتباط بین فروشگاه Play و backend Play ندارید. ویژگی Response Simulator در برنامه Play Billing Lab به شما امکان می‌دهد پاسخ‌های کد خطا را برای کتابخانه صورتحساب Play پیکربندی کنید تا سناریوهای مختلف خطای پیچیده را آزمایش کنید.

برای مثال، شما منطق برنامه خود را طوری پیاده‌سازی کرده‌اید که پس از تشخیص موفقیت‌آمیز بودن خرید، خرید را انجام دهد. شما می‌خواهید سناریویی را آزمایش کنید که در آن برنامه شما به دلیل خرابی شبکه، خرید را انجام نداده و گیرنده RTDN در سرور backend شما پیام را دریافت کرده و خرید را به درستی مدیریت می‌کند. می‌توانید از شبیه‌ساز پاسخ (Response Simulator) برای شبیه‌سازی سناریوی آزمایش خود استفاده کنید. موارد زیر شما را در مراحل آزمایش با شبیه‌ساز پاسخ Play Billing Lab راهنمایی می‌کند.

تست با شبیه‌ساز پاسخ

هنگام آزمایش با Response Simulator، برنامه شما با Play Billing Lab ارتباط برقرار می‌کند تا کد پاسخی را که در Play Billing Lab Response Simulator پیکربندی کرده‌اید، دریافت کند.

فعال کردن تست لغو صورتحساب برای کتابخانه صورتحساب Play

برای فعال کردن ارتباط بین شبیه‌ساز پاسخ و برنامه‌تان، ابتدا باید تست لغو صورتحساب را برای کتابخانه صورتحساب Play از داخل برنامه‌تان فعال کنید. برای انجام این کار، تگ‌های متادیتای زیر را به فایل AndroidManifest.xml برنامه‌تان اضافه کنید.

<manifest ... >
  <application ... >
    ...
     <meta-data
      android:name="com.google.android.play.largest_release_audience.NONPRODUCTION"
      android:value="" />
    <meta-data
      android:name="com.google.android.play.billingclient.enableBillingOverridesTesting"
      android:value="true" />
  </application>
</manifest>

برنامه خود را با فایل AndroidManifest.xml به‌روزرسانی‌شده بسازید. اکنون، برنامه شما برای شبیه‌ساز پاسخ Play Billing Lab آماده است.

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

خطاهای کتابخانه پرداخت Play را شبیه‌سازی کنید

برای آزمایش با خطاهای شبیه‌سازی‌شده‌ی کتابخانه‌ی پرداخت Play، ابتدا کد پاسخ را در برنامه‌ی Play Billing Lab پیکربندی کنید، سپس آزمایش را در برنامه‌ی خود انجام دهید.

پیکربندی کد پاسخ

  1. با یک حساب کاربری تست کننده مجوز برای برنامه خود، وارد برنامه Play Billing Lab شوید. تصویر زیر داشبورد Play Billing Lab، شامل کارت شبیه ساز پاسخ را نشان می‌دهد.

داشبورد آزمایشگاه صورتحساب را با شبیه‌ساز پاسخ بازی کنید

  1. برای رفتن به صفحه شبیه‌ساز پاسخ، روی مدیریت (Manage) در کارت شبیه‌ساز پاسخ کلیک کنید.
  2. وقتی از شما خواسته شد، به اعلان‌های Play Billing Lab اجازه دهید وضعیت اتصال برنامه شما را ببینند.
  3. اگر سوئیچ پاسخ Simulate Play Billing Library فعال نیست، آن را فعال کنید.

c841baa4c96bf306.png

  1. یک کد پاسخ برای APIهای کتابخانه پرداخت Play که می‌خواهید آزمایش کنید، انتخاب کنید. برای شبیه‌سازی خطای خرید مصرفی، یک کد خطا برای API consumeAsync انتخاب کنید. انتخاب‌های شما به‌طور خودکار ذخیره می‌شوند. اکنون شبیه‌ساز پاسخ آماده ارسال کدهای پاسخ انتخاب‌شده به برنامه شما است.

برنامه خود را آزمایش کنید

اکنون می‌توانید برنامه خود را آزمایش کنید تا مطمئن شوید که آیا همه چیز طبق انتظار در سناریوی خطای پیکربندی شده کار می‌کند یا خیر. برنامه خود را باز کنید و متد API کتابخانه صورتحساب Play را فعال کنید. اگر برنامه شما فراخوانی consumeAsync را برای مصرف خرید انجام دهد، برنامه شما کد خطا را همانطور که پیکربندی کرده‌اید دریافت خواهد کرد. می‌توانید تأیید کنید که آیا برنامه شما به درستی روی کد خطا کار می‌کند و سرور backend شما خرید را به درستی پردازش می‌کند یا خیر.

بعد از اینکه آزمایش خود را انجام دادید، کافیست سوئیچ پاسخ Simulate Play Billing Library را خاموش کنید تا شبیه‌سازی پاسخ متوقف شود.

درباره آزمایش با Play Billing Lab بیشتر بدانید، یا برای اطلاعات بیشتر در مورد آزمایش صورتحساب درون‌برنامه‌ای با License Testers به ​​مرکز راهنمایی مراجعه کنید.

۹. تبریک می‌گویم!

شما این آزمایشگاه کدنویسی را به پایان رسانده‌اید و اکنون مجهز به بهینه‌سازی استراتژیک کسب درآمد از اپلیکیشن خود هستید تا تجربه کاربری خود را بهبود بخشید و رضایت کاربر، نرخ تبدیل خرید و ریزش مشترکین را افزایش دهید.

با بهره‌گیری از اعلان‌های توسعه‌دهنده‌ی بلادرنگ و اپلیکیشن همراه Play Billing Lab ، می‌توانید به صورت پیشگیرانه رویدادهای چرخه‌ی خرید را برای خریدهای یک‌باره و اشتراک‌ها مدیریت کنید.

با استفاده از این ابزارها، می‌توانید به طور مؤثر استراتژی‌های جذاب بازگشت به عقب را پیاده‌سازی کنید، به سرعت چالش‌های ادغام را حل کنید و در نهایت تجربه کاربری و جریان‌های درآمدی را بهبود بخشید تا برنامه یا بازی خود را با اطمینان راه‌اندازی کنید.

با تکمیل این آزمایشگاه کد، اکنون مهارت‌های لازم برای مدیریت کل فرآیند خرید و آزمایش دقیق پیاده‌سازی خود با آزمایشگاه صورتحساب Play را دارید، که تضمین‌کننده یک تجربه کاربری یکپارچه و به حداکثر رساندن پتانسیل کسب درآمد شما در Google Play است.