১. সংক্ষিপ্ত বিবরণ
গুগল প্লে-এর এই প্লে বিলিং লাইব্রেরি ইন্টিগ্রেশন কোডল্যাবের মাধ্যমে আপনার আয়ের উৎসগুলোকে অপ্টিমাইজ করুন এবং আত্মবিশ্বাসের সাথে আপনার অ্যাপ চালু করুন। এই সুসংগঠিত কোডল্যাবটি আপনাকে নির্ভরযোগ্য ক্রয় প্রক্রিয়াকরণ সেট আপ, পরীক্ষা এবং বাস্তবায়নের বিষয়ে নির্দেশনা দেয়, যা আপনাকে আপনার নগদীকরণের লক্ষ্য অর্জনে সহায়তা করে এবং ব্যবহারকারীদের আরও নির্বিঘ্ন অভিজ্ঞতা প্রদান করে।
আমরা আপনাকে আপনার অ্যাপ এবং গেমের জন্য সাবস্ক্রিপশন ও এককালীন প্রোডাক্টের জন্য রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) এবং প্লে বিলিং ল্যাব সেট আপ করতে সাহায্য করব। আপনি শিখবেন কীভাবে সাবস্ক্রাইবার হারানোর হার কমাতে হয়; জালিয়াতি এবং অপব্যবহার থেকে সুরক্ষা দিতে হয়; ব্যতিক্রমী পরিস্থিতি পরীক্ষা করতে হয়; সম্ভাব্য সমস্যাগুলো অনুকরণ, পুনরুৎপাদন এবং সমাধান করতে হয়; এবং ব্যবহারকারীদের প্রভাবিত না করে অফার ও মূল্য পরিবর্তন নিয়ে পরীক্ষা-নিরীক্ষা করতে হয়।
এই কোর্স শেষে, আপনি গ্রাহক ফিরিয়ে আনার কৌশল বাস্তবায়ন করতে, ইন্টিগ্রেশনের প্রতিবন্ধকতা দ্রুত সমাধান করতে, বিনিয়োগের উপর আয় (ROI) বাড়াতে, একটি প্রিমিয়াম অভিজ্ঞতা প্রদান করতে এবং আত্মবিশ্বাসের সাথে আপনার অ্যাপ ও আপডেটগুলো চালু করতে প্রস্তুত থাকবেন।
পূর্বশর্ত
- প্লে বিলিং লাইব্রেরি ইন্টিগ্রেশনের মৌলিক বিষয়গুলির সাথে পরিচিতি
- অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্ট (জাভা) সম্পর্কে পরিচিতি
আপনি যা শিখবেন
- ক্রয় রূপান্তর এবং গ্রাহক ধরে রাখার কৌশল ব্যবহার করে কীভাবে আপনার ক্রয় জীবনচক্র সঠিকভাবে পরিচালনা করলে প্রবৃদ্ধি অপ্টিমাইজ করা যায়
- গুগল ক্লাউড পাব/সাব ব্যবহার করে কীভাবে রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) সেট আপ করবেন, যা পরবর্তীতে উইন-ব্যাক ক্যাম্পেইন এবং অন্যান্য লাইফসাইকেল ম্যানেজমেন্ট কৌশল বাস্তবায়নের জন্য কাজে লাগানো যেতে পারে।
- অনাকাঙ্ক্ষিত রিফান্ড বা জালিয়াতি এবং অপব্যবহারের ঝুঁকি কমাতে, সঠিক ট্র্যাকিং ও এনটাইটেলমেন্ট সহ নোটিফিকেশনগুলো নিরাপদে পরিচালনা করার জন্য আপনার ব্যাকএন্ড সার্ভারে কীভাবে একটি রিসিভার সেট আপ করবেন।
- ডেভেলপমেন্ট খরচ কমানোর পাশাপাশি ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে প্লে বিলিং ল্যাব ব্যবহার করে কীভাবে আপনার ইন্টিগ্রেশন পরীক্ষা করবেন এবং ত্রুটি অনুকরণ করবেন
আপনার যা যা লাগবে
- Google Play Console- এ আপনার অ্যাপের জন্য Play Developer অ্যাকাউন্টে অ্যাক্সেস
- Google Play Developer API সক্রিয় করা থাকলে আপনার Google Cloud Platform প্রজেক্টে অ্যাক্সেস করতে পারবেন।
- আপনার অ্যান্ড্রয়েড অ্যাপের অ্যাকাউন্ট এবং অধিকারসমূহ পরিচালনা করার জন্য একটি ব্যাকএন্ড সার্ভার
- প্লে ডেভেলপার কনসোলে আপনার অ্যাপের জন্য লাইসেন্স পরীক্ষকদের নিবন্ধন করুন
- আপনার টেস্টিং ডিভাইসে বিলিং ল্যাব ইনস্টল করুন।
২. সাবস্ক্রিপশন এবং এককালীন ক্রয়ের জন্য রাজস্ব আয়ের কৌশল
আপনার অ্যাপের মাধ্যমে ডিজিটাল পণ্য বিক্রি করার সময়, একটি সফল মনিটাইজেশন কৌশলে এককালীন কেনাকাটা এবং সাবস্ক্রিপশন—উভয়ের ক্ষেত্রেই ব্যবহারকারীর সম্পূর্ণ অভিজ্ঞতা বিবেচনা করতে হবে। একটি নির্বিঘ্ন অভিজ্ঞতা কেনার আগ্রহ বাড়াতে এবং গ্রাহক হারানোর হার কমাতে পারে।
এককালীন ক্রয় বা সাবস্ক্রিপশনের জন্য একটি সাধারণ ক্রয় প্রক্রিয়ায় একাধিক পর্যায় অন্তর্ভুক্ত থাকবে:
- ব্যবহারকারী কেনার জন্য জিনিসপত্র দেখেন।
- ব্যবহারকারীর ক্রয় ও অর্থপ্রদান সম্পন্ন করার জন্য ক্রয় প্রক্রিয়াটি চালু করুন।
- ক্রয় সম্পন্ন হওয়ার বিষয়ে আপনার সার্ভারকে অবহিত করুন।
- আপনার সার্ভারে ক্রয়টি যাচাই করুন।
- ব্যবহারকারীকে বিষয়বস্তু প্রদান করুন।
- কন্টেন্ট ডেলিভারি হওয়ার বিষয়টি স্বীকার করুন। ব্যবহারযোগ্য পণ্যের ক্ষেত্রে, সঠিক সময়ে ক্রয়কৃত পণ্যটি ব্যবহার করুন, যাতে ব্যবহারকারী পণ্যটি পুনরায় কিনতে পারেন।
ইন-অ্যাপ ইন্টিগ্রেশন আপনাকে পারচেজ ফ্লো চালু করতে এবং ইউজার এক্সপেরিয়েন্স পরিচালনা করতে সাহায্য করে, কিন্তু ব্যবহারকারীরা যে এনটাইটেলমেন্টগুলো কিনছেন, সে বিষয়ে আপনার ব্যাকএন্ডকে হালনাগাদ রাখা অত্যন্ত জরুরি। কেনাকাটা ট্র্যাক করতে এবং ইউজার এক্সপেরিয়েন্সের অন্যান্য দিক, যেমন ক্রস-প্ল্যাটফর্ম এনটাইটেলমেন্ট, পরিচালনা করার জন্য এটি গুরুত্বপূর্ণ।
রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) হলো ক্রয় জীবনচক্রের এই বিভিন্ন পর্যায়গুলো শনাক্ত করার একটি চমৎকার উপায় এবং এটিকে রিয়েল-টাইম পারফরম্যান্স ট্র্যাকিং টুল হিসেবে ও সাবস্ক্রাইবারদের ফিরিয়ে আনার কৌশল বাস্তবায়নের হাতিয়ার হিসেবে কার্যকরভাবে ব্যবহার করা যেতে পারে।
উদাহরণস্বরূপ: ধরুন আপনার ব্যবহারকারী এইমাত্র একটি নতুন পণ্য কিনেছেন অথবা পেমেন্ট করতে ভুলে গেছেন, ফলে সাবস্ক্রিপশনটি গ্রেস পিরিয়ডে প্রবেশ করেছে। সঠিক RTDN-এর সাহায্যে, আপনি প্রায় রিয়েল টাইমে ব্যবহারকারীর অবস্থার পরিবর্তন শনাক্ত করতে পারবেন এবং সেই অনুযায়ী ব্যবস্থা নিতে পারবেন। যেমন—ব্যবহারকারীকে তার সদ্য কেনা পণ্যটির প্রতি আরও বেশি আগ্রহী করে তোলা, অথবা সাবস্ক্রিপশন চালিয়ে যাওয়ার জন্য পেমেন্টের বিবরণ আপডেট করতে রিমাইন্ডার ইমেল পাঠানো।
ব্যবহারকারীর ক্লায়েন্টে সমস্যা থাকলেও, কেনাকাটা পরিচালনা করার জন্য অতিরিক্ত সার্ভার-সাইড নিয়ন্ত্রণ যোগ করতে RTDN একটি চমৎকার উপায়। ধরুন, একজন ব্যবহারকারী সফলভাবে কেনাকাটা করেছেন এবং গুগল থেকে নিশ্চিতকরণ পেয়েছেন, কিন্তু পারচেজ লিসেনারের মাধ্যমে তার ডিভাইস এবং আপনার অ্যাপ কেনাকাটার নোটিফিকেশন পাওয়ার আগেই তার ডিভাইসটির নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হয়ে যায়। RTDN ব্যবহার করলে আপনি আপনার সার্ভারের মাধ্যমে একটি স্বতন্ত্র নোটিফিকেশন পাবেন, যা আপনাকে ক্লায়েন্টের সমস্যা নির্বিশেষে কেনাকাটাটি শনাক্ত করতে এবং ব্যবহারকারীকে এনটাইটেলমেন্ট প্রদান করতে সাহায্য করবে, ফলে কেনাকাটার একটি নির্ভরযোগ্য প্রক্রিয়া নিশ্চিত হবে।
বর্তমানে সমর্থিত সব ধরনের RTDN সম্পর্কে আপনি এখানে আরও জানতে পারবেন। প্রতিটি ধরনের RTDN একটি স্বতন্ত্র ক্রয় স্থিতি নির্দেশ করে। আপনার ব্যবহারের ক্ষেত্রে প্রয়োজন অনুযায়ী সঠিক প্রক্রিয়াকরণ নিশ্চিত করতে সংশ্লিষ্ট হ্যান্ডলিং ব্যবস্থা প্রয়োগ করা অত্যন্ত গুরুত্বপূর্ণ। এই কোডল্যাবটি আপনাকে এমন একটি উদাহরণের মাধ্যমে নিয়ে যাবে যা আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারে RTDN বার্তাটি পরিচালনা করে। এর মধ্যে রয়েছে বার্তা গ্রহণ, ক্রয় যাচাই করা এবং সঠিক ব্যবহারকারীকে এনটাইটেলমেন্ট প্রদান করা, যখন কোনো ব্যবহারকারী আপনার অ্যাপে সফলভাবে একটি ক্রয় সম্পন্ন করেন। এবং এরপরে, আমরা আপনাকে দেখাবো কিভাবে আপনার অ্যাপের জন্য RTDN কনফিগার করতে হয়।
৩. রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) কনফিগার করুন
রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) আপনাকে ক্রয়ের অবস্থার পরিবর্তনে তাৎক্ষণিকভাবে প্রতিক্রিয়া জানাতে Google Cloud Pub/Sub ব্যবহার করে। Cloud Pub/Sub হলো একটি সম্পূর্ণ পরিচালিত রিয়েল-টাইম মেসেজিং পরিষেবা যা আপনি স্বাধীন অ্যাপ্লিকেশনগুলির মধ্যে বার্তা পাঠাতে এবং গ্রহণ করতে ব্যবহার করতে পারেন। Google Play আপনার সাবস্ক্রাইব করা বিষয়গুলিতে পুশ নোটিফিকেশন প্রকাশ করতে Cloud Pub/Sub ব্যবহার করে।
RTDN চালু করতে, আপনাকে প্রথমে আপনার নিজস্ব গুগল ক্লাউড প্ল্যাটফর্ম (GCP) প্রজেক্ট ব্যবহার করে ক্লাউড পাব/সাব সেট আপ করতে হবে এবং তারপরে আপনার অ্যাপের জন্য নোটিফিকেশন চালু করতে হবে। আপনি যদি GCP এবং ক্লাউড পাব/সাব সম্পর্কে পরিচিত না হন, তাহলে কুইকস্টার্ট গাইডটি দেখুন।
একটি বিষয় তৈরি করুন
নোটিফিকেশন পেতে শুরু করতে, আপনাকে একটি টপিক তৈরি করতে হবে যেখানে গুগল প্লে নোটিফিকেশনগুলো প্রকাশ করবে। টপিক তৈরি করতে, ‘টপিক তৈরি করুন’ অংশে দেওয়া নির্দেশাবলী অনুসরণ করুন।
একটি পাব/সাব সাবস্ক্রিপশন তৈরি করুন
কোনো টপিকে প্রকাশিত মেসেজ পেতে হলে, আপনাকে সেই টপিকের জন্য একটি পাব/সাব সাবস্ক্রিপশন তৈরি করতে হবে। পাব/সাব সাবস্ক্রিপশন তৈরি করতে, নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:
- সাবস্ক্রিপশনকে পুশ সাবস্ক্রিপশন বা পুল সাবস্ক্রিপশন হিসেবে কীভাবে কনফিগার করতে হয়, তা জানতে ক্লাউড পাব/সাব সাবস্ক্রাইবার গাইডটি পড়ুন। এই কোডল্যাবে, আমরা একটি পুল সাবস্ক্রিপশন নিয়ে কাজ করব, যার জন্য আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারকে মেসেজ সংগ্রহের উদ্দেশ্যে ক্লাউড পাব/সাব সার্ভারে রিকোয়েস্ট পাঠাতে হবে।
- একটি সাবস্ক্রিপশন তৈরি করতে ‘অ্যাড আ সাবস্ক্রিপশন’ (Add a subscription) এর নির্দেশাবলী অনুসরণ করুন।
আপনার বিষয়ে প্রকাশের অধিকার প্রদান করুন
আপনার টপিকে নোটিফিকেশন প্রকাশ করার জন্য Cloud Pub/Sub-কে Google Play-কে অনুমতি প্রদান করতে হবে।
- গুগল ক্লাউড কনসোল খুলুন।
- আপনার প্রজেক্টটি নির্বাচন করুন, এরপর সার্চ বারে ' Pub/Sub' লিখে সার্চ করুন এবং Pub/Sub কনফিগ পেজে যান।

- আপনার বিষয়টি খুঁজুন এবং অনুমতি সেটিংস খুলুন।

- সার্ভিস অ্যাকাউন্ট
google-play-developer-notifications@system.gserviceaccount.comযোগ করতে ADD PRINCIPAL-এ ক্লিক করুন এবং এটিকে Pub/Sub Publisher- এর ভূমিকা প্রদান করুন।
- টপিক সেটআপ সম্পন্ন করতে সেভ-এ ক্লিক করুন।

আপনার অ্যাপের জন্য RTDN সক্রিয় করুন
আপনার প্লে বিলিং ইন্টিগ্রেশনকে উল্লেখযোগ্যভাবে উন্নত করতে রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) সেট আপ করতে শিখুন। আপনি ব্যক্তিগতকৃত মেসেজিংয়ের মাধ্যমে ক্রয়ের নির্ভরযোগ্যতা বাড়াতে পারেন এবং জালিয়াতি ও অপব্যবহার প্রতিরোধ করে আপনার সামগ্রিক ROI উন্নত করতে পারেন।
RTDN-গুলি সাবস্ক্রিপশন নবায়ন, নতুন কেনাকাটা এবং পেমেন্ট সংক্রান্ত সমস্যার মতো গুরুত্বপূর্ণ ঘটনাগুলির জন্য সরাসরি গুগল প্লে থেকে সার্ভার-টু-সার্ভার তাৎক্ষণিক আপডেট প্রদান করে। এগুলি আপনার ব্যাকএন্ড সিস্টেমগুলিকে ব্যবহারকারীর প্রাপ্যতার প্রকৃত অবস্থার সাথে স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করতে সাহায্য করে, যা ক্লায়েন্ট-সাইডের সীমাবদ্ধতা অতিক্রম করে এবং আপনাকে সঙ্গে সঙ্গে ও যথাযথভাবে প্রতিক্রিয়া জানাতে সক্ষম করে।
আপনার অ্যাপের জন্য রিয়েল-টাইম ডেভেলপার নোটিফিকেশন কীভাবে চালু করবেন:
- গুগল প্লে কনসোল খুলুন।
- আপনার অ্যাপটি নির্বাচন করুন।
- প্লে-এর মাধ্যমে অর্থ উপার্জন করুন > অর্থ উপার্জন সেটআপ- এ যান।
- রিয়েল-টাইম ডেভেলপার নোটিফিকেশন বিভাগে স্ক্রোল করুন।
- রিয়েল-টাইম নোটিফিকেশন সক্ষম করুন বিকল্পটি চেক করুন।
- 'টপিক নেম' ফিল্ডে, পূর্বে কনফিগার করা সম্পূর্ণ ক্লাউড পাব/সাব টপিক নামটি লিখুন। টপিক নামটি projects/{project_id}/topics/{topic_name} ফরম্যাটে হতে হবে, যেখানে project_id হলো আপনার প্রজেক্টের অনন্য শনাক্তকারী এবং topic_name হলো পূর্বে তৈরি করা টপিকের নাম।
- একটি টেস্ট মেসেজ পাঠাতে 'Send Test Message'-এ ক্লিক করুন। একটি টেস্ট পাবলিশ করলে সবকিছু সঠিকভাবে সেট আপ এবং কনফিগার করা হয়েছে কিনা তা নিশ্চিত করতে সাহায্য করে। যদি টেস্ট পাবলিশ সফল হয়, তাহলে একটি মেসেজ প্রদর্শিত হবে যেখানে বলা থাকবে যে টেস্ট পাবলিশটি সফল হয়েছে। আপনি যদি এই টপিকের জন্য একটি সাবস্ক্রিপশন সংযুক্ত করে থাকেন, তাহলে আপনার টেস্ট মেসেজটি পাওয়ার কথা। একটি পুল সাবস্ক্রিপশনের জন্য, ক্লাউড কনসোলে সাবস্ক্রিপশনটিতে যান, 'View Messages'-এ ক্লিক করুন এবং মেসেজ পুল করার জন্য এগিয়ে যান। ক্লাউড পাব/সাব দ্বারা বারবার ডেলিভারি এড়াতে আপনার পুল করা যেকোনো মেসেজের স্বীকৃতি (acknowledge) দেওয়া উচিত। একটি পুশ সাবস্ক্রিপশনের জন্য, টেস্ট মেসেজটি আপনার পুশ এন্ডপয়েন্টে পৌঁছেছে কিনা তা পরীক্ষা করুন। একটি সফল রেসপন্স কোড স্বীকৃতির মেসেজ হিসেবে কাজ করবে। যদি পাবলিশ ব্যর্থ হয়, তাহলে একটি এরর দেখানো হবে। নিশ্চিত করুন যে টপিকের নামটি সঠিক এবং
google-play-developer-notifications@system.gserviceaccount.comসার্ভিস অ্যাকাউন্টটির টপিকটিতে পাব/সাব পাবলিশার অ্যাক্সেস আছে। - আপনি কোন ধরনের বিজ্ঞপ্তি পেতে চান তা বেছে নিন।
- সাবস্ক্রিপশন এবং বাতিল হওয়া সমস্ত কেনাকাটার জন্য বিজ্ঞপ্তি পান - সাবস্ক্রিপশন এবং বাতিল হওয়া কেনাকাটা সম্পর্কিত রিয়েল-টাইম ডেভেলপার বিজ্ঞপ্তি গ্রহণ করুন। এককালীন পণ্য কেনাকাটার জন্য আপনি কোনো বিজ্ঞপ্তি পাবেন না।
- সাবস্ক্রিপশন এবং এককালীন পণ্যের জন্য সমস্ত বিজ্ঞপ্তি পান - সমস্ত সাবস্ক্রিপশন এবং বাতিল হওয়া ক্রয় ইভেন্টের জন্য বিজ্ঞপ্তি গ্রহণ করুন। আপনি এককালীন পণ্য ক্রয়ের ইভেন্টগুলিও পাবেন, যেমন
ONE_TIME_PRODUCT_PURCHASEDএবংONE_TIME_PRODUCT_CANCELED। এই ক্রয় ইভেন্টগুলি সম্পর্কে আরও জানতে এককালীন ক্রয়ের জীবনচক্র দেখুন।

- পরিবর্তনগুলি সংরক্ষণ করুন -এ ক্লিক করুন।
এখন আপনি আপনার অ্যাপের জন্য রিয়েল-টাইম ডেভেলপার নোটিফিকেশন সম্পন্ন করেছেন, যা আপনাকে উইন-ব্যাক মেসেজিংয়ের মাধ্যমে ব্যবহারকারী চলে যাওয়া (user churn), বা জালিয়াতি ও অপব্যবহারের মতো সাধারণ সমস্যাগুলো মোকাবেলা করার সরঞ্জাম সরবরাহ করে। পরবর্তী অংশে, আমরা আপনার ক্লাউড পাব/সাব টপিকে পাঠানো মেসেজগুলো গ্রহণ করার জন্য আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারে একটি সাবস্ক্রাইবার তৈরি করব।
৪. বিজ্ঞপ্তি গ্রহণ করুন
আপনার অ্যাপে সেরা ব্যবহারকারী অভিজ্ঞতা নিশ্চিত করার জন্য, কেনাকাটার অবস্থা সম্পর্কে আপনার ব্যাকএন্ড সার্ভারকে হালনাগাদ রাখা অত্যন্ত গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যখন কোনো ব্যবহারকারী অ্যাপের মাধ্যমে অর্থপ্রদান করে সফলভাবে কেনাকাটা সম্পন্ন করেন, তখন যত দ্রুত সম্ভব তাদের অ্যাকাউন্টে সেই সামগ্রীটি পৌঁছে দেওয়া উচিত।
এর জন্য কেনাকাটা সম্পন্ন হওয়াকে সময়মতো শনাক্ত ও প্রক্রিয়া করা প্রয়োজন। প্লে বিলিং লাইব্রেরি আপনার অ্যাপে কেনাকাটা শনাক্ত করার জন্য একাধিক উপায় প্রদান করে। একটি সম্পন্ন কেনাকাটা শনাক্ত হওয়ার পর, আপনার অ্যাপকে অবশ্যই আপনার ব্যাকএন্ড সার্ভারকে জানাতে হবে যাতে কেনাকাটাটি যাচাই করা যায়, সঠিক ব্যবহারকারীকে কন্টেন্টটি প্রদান করা যায় এবং তারপর গুগলকে জানানো যায় যে কেনাকাটাটি প্রক্রিয়া করা হয়েছে। তবে, বিভিন্ন কারণে এমন হতে পারে যে আপনার অ্যাপ সময়মতো কেনাকাটাটি শনাক্ত করতে পারেনি। উদাহরণস্বরূপ, একজন ব্যবহারকারী সফলভাবে কেনাকাটা করতে পারেন এবং গুগল থেকে নিশ্চিতকরণ পেতে পারেন, কিন্তু প্লে বিলিং লাইব্রেরি ইন্টারফেসের মাধ্যমে তার ডিভাইস এবং আপনার অ্যাপ বিজ্ঞপ্তি পাওয়ার আগেই তার ডিভাইসের নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হয়ে যায়। ব্যবহারকারীর ক্লায়েন্টে সমস্যা থাকলেও কেনাকাটা পরিচালনা করতে সাহায্য করার জন্য RTDN অতিরিক্ত সার্ভার-সাইড নিয়ন্ত্রণ প্রদান করে। RTDN কেনাকাটার অবস্থার পরিবর্তনের সাথে সাথে আপনার সার্ভারে স্বাধীন বিজ্ঞপ্তি পাঠানোর নিশ্চয়তা দেয়, যা আপনাকে সম্ভাব্য ক্লায়েন্ট সমস্যা থেকে স্বাধীনভাবে একটি দ্বিতীয় পথের মাধ্যমে প্রায় সঙ্গে সঙ্গেই কেনাকাটার অবস্থার পরিবর্তন শনাক্ত করতে সাহায্য করে এবং কেনাকাটার একটি আরও নির্ভরযোগ্য প্রক্রিয়া নিশ্চিত করে।
এই অংশে আপনি ক্লাউড পাব/সাব ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার ক্লাউড পাব/সাব টপিকে পাঠানো মেসেজগুলো গ্রহণ করার জন্য একটি সাবস্ক্রাইবার তৈরি করবেন। এই লাইব্রেরিগুলো বিভিন্ন ভাষায় উপলব্ধ। পরবর্তী অংশগুলোতে, আমরা সাবস্ক্রাইবারে ক্রয় যাচাই করা, সঠিক ব্যবহারকারীকে এনটাইটেলমেন্ট প্রদান করা এবং সার্ভারে ক্রয়টি স্বীকার ও গ্রহণ করার ব্যবস্থা যুক্ত করব। এই কোডল্যাবের জন্য আমরা জাভা ব্যবহার করছি।
ক্লাউড পাব/সাব টপিকে করা প্রতিটি পাবলিশে একটিমাত্র বেস৬৪-এনকোডেড ডেটা ফিল্ড থাকে।
{
"message": {
"attributes": {
"key": "value"
},
"data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
"messageId": "136969346945"
},
"subscription": "projects/myproject/subscriptions/mysubscription"
}
বেস৬৪-এনকোডেড ডেটা ফিল্ডটি ডিকোড করার পর, DeveloperNotification নিম্নলিখিত ফিল্ডগুলো থাকে:
{
"version": string,
"packageName": string,
"eventTimeMillis": long,
"oneTimeProductNotification": OneTimeProductNotification,
"subscriptionNotification": SubscriptionNotification,
"voidedPurchaseNotification": VoidedPurchaseNotification,
"testNotification": TestNotification
}
আরও তথ্যের জন্য অনুগ্রহ করে রিয়েল-টাইম ডেভেলপার নোটিফিকেশন রেফারেন্সটি দেখুন।
আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারের জন্য পাব/সাব বার্তাগুলি প্রক্রিয়া করার জন্য নিম্নলিখিতটি একটি নোটিফিকেশন রিসিভারের নমুনা কোড। সিকিউরিটি কমান্ড সেন্টারে প্রমাণীকরণের জন্য, অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল সেট আপ করুন, দেখুন "একটি স্থানীয় ডেভেলপমেন্ট পরিবেশের জন্য প্রমাণীকরণ সেট আপ করুন" ।
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();
}
}
}
এখন, আপনার একটি নোটিফিকেশন রিসিভার আছে যা আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারে আপনার ক্লাউড পাব/সাব টপিকে পাঠানো মেসেজগুলো গ্রহণ করে। পরবর্তী বিভাগগুলোতে, আমরা আপনার ব্যাকএন্ড সার্ভারে RTDN মেসেজগুলো প্রসেস করার সেরা পদ্ধতিগুলো নিয়ে আলোচনা করব।
৫. আপনার অ্যাপের ক্রয় প্রক্রিয়ায় ব্যবহারকারী শনাক্তকারী সংযুক্ত করুন।
যখন আপনার সার্ভার ক্রয়ের স্ট্যাটাস আপডেট সম্পর্কিত 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);
পরবর্তী বিভাগে আপনি দেখতে পাবেন, ক্রয় প্রক্রিয়ায় সেট করা ব্যবহারকারী শনাক্তকারীটি ক্রয়ের অন্তর্ভুক্ত হবে এবং সঠিক ব্যবহারকারীকে অধিকার প্রদানের জন্য ব্যবহার করা যাবে।
৬. অধিকার প্রদানের পূর্বে ক্রয় যাচাই করুন।
এই অংশে, আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারে এনটাইটেলমেন্ট মঞ্জুর করার আগে ক্রয় যাচাই করার সর্বোত্তম পদ্ধতিগুলো নিয়ে আলোচনা করা হবে।
কোনো ব্যবহারকারী এককালীন পণ্য কেনার পর, আপনার সুরক্ষিত ব্যাকএন্ড সার্ভারে থাকা পাব/সাব সাবস্ক্রাইবার একটি পাব/সাব বার্তা পাবেন। আপনার ব্যাকএন্ড সার্ভারে নিম্নলিখিত কাজগুলো করতে হবে:
- পাব/সাব মেসেজ থেকে
purchaseTokenপার্স করুন। আপনার প্রতিটি ক্রয়ের জন্যpurchaseTokenমানগুলোর একটি রেকর্ড রাখা উচিত। - যাচাই করুন যে বর্তমান ক্রয়ের
purchaseTokenমানটি পূর্ববর্তী কোনোpurchaseTokenমানের সাথে মেলে না।purchaseTokenবিশ্বব্যাপী অনন্য, তাই আপনি নিরাপদে এই মানটি আপনার ডেটাবেসে প্রাইমারি কী হিসাবে ব্যবহার করতে পারেন। - ক্রয়টি বৈধ কিনা তা গুগলের কাছে যাচাই করতে Google Play Developer API-এর purchases.products:get এন্ডপয়েন্টটি ব্যবহার করুন।
- যদি ক্রয়টি বৈধ হয় এবং অতীতে ব্যবহার করা না হয়ে থাকে, তাহলে আপনি নিরাপদে অ্যাপের ভেতরের আইটেম বা সাবস্ক্রিপশনটির অধিকার প্রদান করতে পারেন।
- ক্রয়ের অবস্থা 'ক্রয়কৃত'
PURCHASEDহলেই কেবল অধিকার প্রদান করবেন এবংPENDINGক্রয়গুলো সঠিকভাবে পরিচালনা করা নিশ্চিত করবেন। 'অপেক্ষমাণ লেনদেন পরিচালনা' (Handling pending transactions) অংশে আপনি আরও তথ্য পেতে পারেন।
নিম্নলিখিত কোড উদাহরণটি গুগল প্লে ডেভেলপার এপিআই-এর জন্য একটি এপিআই ক্লায়েন্ট তৈরি করে। আমরা পরবর্তীতে এপিআই কল করার জন্য এটি ব্যবহার করব।
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);
}
}
}
তারপর, আমরা এপিআই কল করার জন্য লজিক যোগ করি এবং ক্রয়টি যাচাই করে সঠিক ব্যবহারকারীকে এনটাইটেলমেন্ট প্রদান করার জন্য পূর্বে তৈরি করা রিসিভারটিকে পরিবর্তন করি।
Google Play Developer API-এর Purchases.products:get এন্ডপয়েন্ট থেকে ProductPurchase ফেচ করার জন্য AndroidPublisherHelper এ নিম্নলিখিত মেথডটি যোগ করুন।
/* 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 এন্ডপয়েন্ট পয়েন্ট কল করে গুগলকে জানাতে হবে যে ক্রয়টি সম্পন্ন হয়েছে।
Google Play Developer API-তে purchases.products:consume অথবা purchases.products:acknowledge কল করার জন্য AndroidPublisherHelper এ নিম্নলিখিত মেথডগুলো যোগ করুন।
/* 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);
......
}
স্বীকৃতি প্রদান করা আবশ্যক, কারণ এটি গুগল প্লে-কে জানিয়ে দেয় যে ব্যবহারকারীকে ক্রয়টি করার অধিকার দেওয়া হয়েছে। অধিকার দেওয়ার পরপরই আপনার ক্রয়টি স্বীকার করে নেওয়া উচিত।
চমৎকার কাজ! আপনি সফলভাবে রিয়েল-টাইম ডেভেলপার নোটিফিকেশনের সাথে ইন্টিগ্রেট করেছেন, যা এই কোডল্যাবে প্রদর্শিত নির্ভরযোগ্য ক্রয় প্রক্রিয়াকরণ সক্ষম করে। এখন, সবকিছু নিখুঁতভাবে কাজ করছে কিনা তা নিশ্চিত করতে, চলুন প্লে বিলিং ল্যাবটি ঘুরে দেখি। এটি একটি ব্যবহারকারী-বান্ধব টুল যা আপনার প্লে বিলিং ইন্টিগ্রেশন পরীক্ষা করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে।
৮. প্লে বিলিং ল্যাব দিয়ে পরীক্ষা করুন
আত্মবিশ্বাসের সাথে লঞ্চ করার জন্য, ডেভেলপমেন্টের পুরো সময় জুড়েই আপনার ইন্টিগ্রেশন পরীক্ষা করা উচিত। প্লে বিলিং ল্যাব একটি বিনামূল্যের অ্যান্ড্রয়েড অ্যাপ যা ডেভেলপারদের গুগল প্লে-এর বিলিং সিস্টেমের সাথে তাদের ইন্টিগ্রেশন পরীক্ষা করতে সাহায্য করে। এটি ডেভেলপারদের জন্য প্লে বিলিং ফিচারগুলো পরীক্ষা করা, দ্রুত ইন্টিগ্রেট করা এবং আরও বেশি আত্মবিশ্বাসের সাথে লঞ্চ করার একটি সহজ ও সুবিধাজনক উপায় প্রদান করে।
প্লে বিলিং ল্যাব বিভিন্ন সিনারিও পরীক্ষা করার জন্য নানা রকম টেস্টিং ফিচার প্রদান করে, যার মধ্যে রয়েছে:
- প্লে বিলিং ল্যাব থেকে প্লে কান্ট্রি পরিবর্তন করুন এবং আপনার টেস্টে সেটিংস প্রয়োগ করুন। এর ফলে পরীক্ষক শারীরিকভাবে যেখানেই পরীক্ষা করুন না কেন , বিভিন্ন দেশ/অঞ্চলে কাস্টম ইউজার-এক্সপেরিয়েন্স পরীক্ষা করা সম্ভব হয়।
- একই অ্যাকাউন্ট দিয়ে বারবার ট্রায়াল বা পরিচিতিমূলক অফারগুলো পরীক্ষা করুন।
- অন্যান্য সক্রিয় গ্রাহকদের প্রভাবিত না করেই টেস্ট সাবস্ক্রিপশনের মূল্য পরিবর্তন করা হয়।
- বিভিন্ন ত্রুটির পরিস্থিতিতে পরীক্ষা করার জন্য প্লে বিলিং লাইব্রেরির প্রতিক্রিয়া কোড অনুকরণ করুন।
- টেস্টিং দ্রুত করার জন্য সাবস্ক্রিপশন নবায়ন ত্বরান্বিত করুন।
- ক্রয় প্রবাহের নির্দিষ্ট ঝুঁকি সংকেত এড়াতে আসল পেমেন্ট পদ্ধতি দিয়ে পরীক্ষা করুন
আমরা প্লে বিলিং ল্যাব অ্যাপে ক্রমাগত নতুন পরীক্ষার সুবিধা যোগ করছি। আপনি প্লে স্টোর থেকে প্লে বিলিং ল্যাব ডাউনলোড ও ইনস্টল করতে পারেন, অথবা প্লে বিলিং ল্যাব দিয়ে পরীক্ষা করার বিষয়ে আরও তথ্যের জন্য 'আপনার ইন্টিগ্রেশন পরীক্ষা করুন' অংশটি দেখতে পারেন।
BillingResponseCode পরীক্ষা করতে Play Billing Lab ব্যবহার করুন।
আপনার অ্যাপকে প্লে বিলিং লাইব্রেরির সাথে ইন্টিগ্রেট করার সময় সমস্ত BillingResponseCode ফ্লো পরীক্ষা করা একটি সাধারণ চ্যালেঞ্জ, কারণ প্লে স্টোর এবং প্লে-এর ব্যাকএন্ডের মধ্যেকার যোগাযোগের উপর আপনার খুব বেশি নিয়ন্ত্রণ থাকে না। প্লে বিলিং ল্যাব অ্যাপের রেসপন্স সিমুলেটর ফিচারটি আপনাকে প্লে বিলিং লাইব্রেরির জন্য এরর কোড রেসপন্স কনফিগার করতে দেয়, যার মাধ্যমে আপনি বিভিন্ন জটিল এরর সিনারিও পরীক্ষা করতে পারেন।
উদাহরণস্বরূপ, আপনি আপনার অ্যাপে এমন লজিক প্রয়োগ করেছেন যে, সফল কেনাকাটা শনাক্ত করার পর অ্যাপটি সেই কেনাকাটাটি গ্রহণ করবে। আপনি এমন একটি পরিস্থিতি পরীক্ষা করতে চান যেখানে নেটওয়ার্ক ব্যর্থতার কারণে আপনার অ্যাপটি কেনাকাটাটি গ্রহণ করতে পারেনি, কিন্তু আপনার ব্যাকএন্ড সার্ভারের RTDN রিসিভার বার্তাটি গ্রহণ করে কেনাকাটাটি সঠিকভাবে সম্পন্ন করেছে। আপনার পরীক্ষার জন্য এই পরিস্থিতিটি অনুকরণ করতে আপনি রেসপন্স সিমুলেটর (Response Simulator) ব্যবহার করতে পারেন। প্লে বিলিং ল্যাব রেসপন্স সিমুলেটর (Play Billing Lab Response Simulator) ব্যবহার করে পরীক্ষা করার ধাপগুলো নিচে দেওয়া হলো।
রেসপন্স সিমুলেটর দিয়ে পরীক্ষা করুন
রেসপন্স সিমুলেটর দিয়ে পরীক্ষা করার সময়, আপনার অ্যাপটি প্লে বিলিং ল্যাব রেসপন্স সিমুলেটরে কনফিগার করা রেসপন্স কোডটি পাওয়ার জন্য প্লে বিলিং ল্যাবের সাথে যোগাযোগ করবে।
প্লে বিলিং লাইব্রেরির জন্য বিলিং ওভাররাইড টেস্টিং সক্ষম করুন
রেসপন্স সিমুলেটর এবং আপনার অ্যাপের মধ্যে যোগাযোগ সক্ষম করতে, আপনাকে প্রথমে আপনার অ্যাপের ভেতর থেকে প্লে বিলিং লাইব্রেরির জন্য বিলিং ওভাররাইড টেস্টিং চালু করতে হবে। এটি করার জন্য, আপনার অ্যাপের 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 ফাইল দিয়ে আপনার অ্যাপটি তৈরি করুন। এখন, আপনার অ্যাপটি প্লে বিলিং ল্যাব রেসপন্স সিমুলেটরের জন্য প্রস্তুত।
টেস্টিংয়ের পর যখন আপনি আপনার অ্যাপটি প্রোডাকশন এনভায়রনমেন্টে ডেপ্লয় করবেন, তখন হয় একটি আলাদা AndroidManifest.xml ফাইল ব্যবহার করুন যাতে এই মেটাডেটা ট্যাগগুলো অন্তর্ভুক্ত না থাকে, অথবা নিশ্চিত করুন যে আপনি AndroidManifest.xml ফাইল থেকে এই ট্যাগগুলো সরিয়ে ফেলেছেন।
সিমুলেট প্লে বিলিং লাইব্রেরির ত্রুটি
প্লে বিলিং লাইব্রেরির অনুকৃত ত্রুটি দিয়ে পরীক্ষা করার জন্য, প্রথমে প্লে বিলিং ল্যাব অ্যাপে রেসপন্স কোডটি কনফিগার করুন, তারপর আপনার অ্যাপে পরীক্ষাটি সম্পাদন করুন।
একটি প্রতিক্রিয়া কোড কনফিগার করুন
- আপনার অ্যাপের জন্য একটি লাইসেন্স টেস্টার অ্যাকাউন্ট দিয়ে প্লে বিলিং ল্যাব অ্যাপে সাইন ইন করুন। নিচের ছবিতে রেসপন্স সিমুলেটর কার্ডসহ প্লে বিলিং ল্যাব ড্যাশবোর্ডটি দেখানো হয়েছে।

- রেসপন্স সিমুলেটর স্ক্রিনে যেতে রেসপন্স সিমুলেটর কার্ডে থাকা ম্যানেজ- এ ক্লিক করুন।
- অনুরোধ করা হলে, আপনার অ্যাপের সংযোগের অবস্থা দেখতে প্লে বিলিং ল্যাব থেকে নোটিফিকেশনের অনুমতি দিন।
- Simulate Play Billing Library রেসপন্স সুইচটি সক্রিয় করুন, যদি এটি আগে থেকেই সক্রিয় করা না থাকে।

- আপনি যে প্লে বিলিং লাইব্রেরি এপিআইগুলো পরীক্ষা করতে চান, সেগুলোর জন্য একটি রেসপন্স কোড নির্বাচন করুন। কনজিউমিং পারচেজের ত্রুটি অনুকরণ করতে,
consumeAsyncএপিআই-এর জন্য একটি এরর কোড নির্বাচন করুন। আপনার নির্বাচনগুলো স্বয়ংক্রিয়ভাবে সংরক্ষিত হয়ে যাবে। এখন রেসপন্স সিমুলেটরটি আপনার অ্যাপে নির্বাচিত রেসপন্স কোডগুলো পাঠানোর জন্য প্রস্তুত।
আপনার অ্যাপ পরীক্ষা করুন
এখন আপনি কনফিগার করা এরর সিনারিওতে সবকিছু প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা যাচাই করতে আপনার অ্যাপটি পরীক্ষা করতে পারেন। আপনার অ্যাপটি খুলুন এবং প্লে বিলিং লাইব্রেরি এপিআই মেথডটি ট্রিগার করুন। যদি আপনার অ্যাপটি পারচেজটি কনজিউম করার জন্য consumeAsync কল করে, তাহলে আপনার অ্যাপটি আপনার কনফিগার করা এরর কোডটি পাবে। এরর কোডটি পাওয়ার পর আপনি যাচাই করতে পারবেন যে আপনার অ্যাপটি সঠিকভাবে কাজ করছে এবং আপনার ব্যাকএন্ড সার্ভার পারচেজটি সঠিকভাবে প্রসেস করছে।
আপনার টেস্টিং শেষ হয়ে গেলে, রেসপন্স সিমুলেট করা বন্ধ করতে Simulate Play Billing Library রেসপন্স সুইচটি অফ করে দিন।
প্লে বিলিং ল্যাব (Play Billing Lab) দিয়ে টেস্টিং সম্পর্কে আরও জানুন, অথবা লাইসেন্স টেস্টার (License Testers) দিয়ে ইন-অ্যাপ বিলিং টেস্টিং সম্পর্কে আরও জানতে হেল্প সেন্টার (Help Center) দেখুন।
৯. অভিনন্দন!
আপনি এই কোডল্যাবটি সম্পন্ন করেছেন এবং এখন ব্যবহারকারীর অভিজ্ঞতা উন্নত করার জন্য আপনার অ্যাপের মনিটাইজেশনকে কৌশলগতভাবে অপ্টিমাইজ করতে প্রস্তুত, যার মাধ্যমে ব্যবহারকারীর সন্তুষ্টি, ক্রয়ের রূপান্তর এবং সাবস্ক্রাইবার হারানোর হার কমানো সম্ভব হবে।
রিয়েল-টাইম ডেভেলপার নোটিফিকেশন এবং প্লে বিলিং ল্যাব কম্প্যানিয়ন অ্যাপ ব্যবহার করে, আপনি এককালীন ক্রয় এবং সাবস্ক্রিপশন উভয়ের জন্যই ক্রয় জীবনচক্রের ঘটনাগুলো সক্রিয়ভাবে মোকাবেলা করতে পারেন।
এই টুলগুলির সাহায্যে, আপনি কার্যকরভাবে আকর্ষণীয় গ্রাহক ফিরিয়ে আনার কৌশল প্রয়োগ করতে, দ্রুত ইন্টিগ্রেশনের প্রতিবন্ধকতা সমাধান করতে এবং পরিশেষে ব্যবহারকারীর অভিজ্ঞতা ও আয়ের উৎস উন্নত করে আত্মবিশ্বাসের সাথে আপনার অ্যাপ বা গেম চালু করতে পারবেন।
এই কোডল্যাবটি সম্পন্ন করার মাধ্যমে, আপনি এখন সম্পূর্ণ ক্রয় প্রক্রিয়াটি পরিচালনা করার এবং প্লে বিলিং ল্যাবের সাহায্যে আপনার বাস্তবায়ন পুঙ্খানুপুঙ্খভাবে পরীক্ষা করার দক্ষতা অর্জন করেছেন, যা একটি নির্বিঘ্ন ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করবে এবং গুগল প্লে-তে আপনার নগদীকরণের সম্ভাবনাকে সর্বোচ্চ করবে।