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

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

درباره این codelab

subjectآخرین به‌روزرسانی: ژوئیه ۳, ۲۰۲۵
account_circleنویسنده: Fangyi Luo, Steven Natiello

1. نمای کلی

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

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

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

پیش نیازها

چیزی که یاد خواهید گرفت

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

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

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

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

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

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

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

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

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

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

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

3. پیکربندی اعلان‌های برنامه‌نویس در زمان واقعی (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 آشنایی ندارید، راهنمای Quickstart را ببینید.

یک موضوع ایجاد کنید

برای شروع دریافت اعلان‌ها، باید موضوعی ایجاد کنید که Google Play باید اعلان‌ها را در آن منتشر کند. برای ایجاد موضوع، دستورالعمل‌های موجود در ایجاد موضوع را دنبال کنید.

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

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

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

به موضوع خود حقوق انتشار بدهید

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

  1. Google Cloud Console را باز کنید.
  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 خود را به‌طور چشمگیری افزایش دهید. می‌توانید قابلیت اطمینان خرید را با پیام‌های شخصی‌سازی شده بهبود بخشید و همچنین از کلاهبرداری و سوء استفاده برای بهبود ROI کلی خود جلوگیری کنید.

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

نحوه فعال کردن اعلان‌های برنامه‌نویس بلادرنگ برای برنامه خود:

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

a266e5dec5c93cd8.png

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

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

4. اعلان ها را دریافت کنید

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

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

در این بخش، مشترکی ایجاد می‌کنید تا با استفاده از کتابخانه‌های Cloud Pub/Sub Client، پیام‌های ارسال شده به موضوع Cloud Pub/Sub خود را مصرف کند. این کتابخانه ها به زبان های مختلف در دسترس هستند. در بخش‌های بعدی، برای تایید خرید، اعطای حق به کاربر صحیح و تایید/مصرف خرید در سرور، به مشترک اضافه می‌کنیم. برای این کد لبه، ما از جاوا استفاده می کنیم.

هر انتشاری که در یک موضوع 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 برای سرور باطن امن شما برای پردازش پیام‌های 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 را در سرور باطن امن شما مصرف می‌کند. در بخش‌های بعدی، بهترین روش‌ها برای پردازش پیام‌های RTDN در سرور پشتیبان شما را پوشش خواهیم داد.

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

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

در زیر کدهای نمونه برای پیوست کردن شناسه کاربر هنگام راه‌اندازی جریان خرید در برنامه با تنظیم 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);

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

6. قبل از اعطای حق، خریدها را تأیید کنید

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

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

  1. purchaseToken از پیام Pub/Sub تجزیه کنید. شما باید رکوردی از تمام مقادیر purchaseToken برای همه خریدها حفظ کنید.
  2. بررسی کنید که مقدار purchaseToken برای خرید فعلی با مقادیر purchaseToken قبلی مطابقت نداشته باشد. purchaseToken در سطح جهانی منحصر به فرد است، بنابراین می توانید با خیال راحت از این مقدار به عنوان کلید اصلی در پایگاه داده خود استفاده کنید.
  3. از گزینه purchases.products:get در Google Play Developer API استفاده کنید تا با Google تأیید کنید که خرید قانونی است.
  1. اگر خرید قانونی باشد و در گذشته استفاده نشده باشد، می‌توانید با خیال راحت حق اشتراک یا مورد درون‌برنامه را اعطا کنید.
  2. شما باید فقط زمانی که وضعیت خرید PURCHASED است، این حق را اعطا کنید و مطمئن شوید که خریدهای PENDING را به درستی انجام می دهید. می‌توانید اطلاعات بیشتری را در بخش رسیدگی به معاملات معلق بیابید.

مثال کد زیر یک کلاینت API برای Google Play Developer 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: getpoint در Google Play Developer API اضافه کنید.

 /* 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();
 }

7. به Google اطلاع دهید که خرید پردازش شده است

پس از اعطای حق، باید به Google اطلاع دهید که خرید از طریق تماس با purchases.products:consume یا buys.products:Acknowledge points endpoint در Play Developer API از سرور باطن امن خود برای مصرف یک محصول مصرفی یا تأیید یک محصول غیرقابل مصرف، پردازش شده است.

در AndroidPublisherHelper ، روش‌های زیر را برای فراخوانی buys.products:consume یا purchases.products:acnowledge در Google Play Developer API اضافه کنید.

 /* 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 ، خرید محصول مصرفی را مصرف کنید یا پس از اعطای حق در سرور باطن خود، خرید محصول غیر مصرفی را تایید کنید.

 @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);
  ......

 }

تأیید لازم است، زیرا به Google Play اطلاع می دهد که به کاربر حق خرید داده شده است. شما باید بلافاصله پس از اعطای حق، خرید را تایید کنید.

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

8. تست با Play Billing Lab

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

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

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

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

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

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

تست با Response Simulator

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

آزمایش لغو صورت‌حساب را برای کتابخانه صورت‌حساب Play فعال کنید

برای فعال کردن ارتباط بین Response Simulator و برنامه خود، ابتدا باید آزمایش لغو صورت‌حساب را برای کتابخانه صورت‌حساب 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 Response Simulator آماده است.

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

شبیه سازی خطاهای Play Billing Library

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

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

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

داشبورد Billing Lab را با Response Simulator بازی کنید

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

c841baa4c96bf306.png

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

اپلیکیشن خود را تست کنید

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

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

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

9. تبریک می گویم!

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

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

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

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