এই নির্দেশিকায় বর্ণনা করা হয়েছে কীভাবে যোগ্য অ্যাপগুলিতে শুধুমাত্র বিকল্প বিলিং (অর্থাৎ ব্যবহারকারীর পছন্দ ছাড়া) প্রদানের জন্য এপিআই (API) সংহত করতে হয়। এই প্রোগ্রামগুলি সম্পর্কে আরও জানতে, যার মধ্যে যোগ্যতার প্রয়োজনীয়তা এবং ভৌগোলিক পরিধি অন্তর্ভুক্ত রয়েছে , ‘বিকল্প বিলিং সম্পর্কে’ দেখুন।
প্লে বিলিং লাইব্রেরি সেটআপ
আপনার অ্যান্ড্রয়েড অ্যাপে প্লে বিলিং লাইব্রেরি ডিপেন্ডেন্সি যোগ করুন । বিকল্প বিলিং এপিআইগুলো ব্যবহার করার জন্য আপনাকে ভার্সন ৬.১ বা তার উচ্চতর সংস্করণ ব্যবহার করতে হবে।
Google Play-এর সাথে সংযোগ করুন
ইন্টিগ্রেশন প্রক্রিয়ার প্রথম ধাপগুলো গুগল প্লে বিলিং ইন্টিগ্রেশন গাইডে বর্ণিত ধাপগুলোর মতোই, তবে আপনার BillingClient ইনিশিয়ালাইজ করার সময় কয়েকটি পরিবর্তন করতে হবে:
- আপনার অ্যাপটি যে শুধুমাত্র একটি বিকল্প বিলিং সিস্টেম ব্যবহার করে, তা বোঝানোর জন্য আপনাকে একটি নতুন মেথড কল করতে হবে:
enableAlternativeBillingOnly।
নিম্নলিখিত উদাহরণটি এই পরিবর্তনগুলি সহ একটি BillingClient ইনিশিয়ালাইজ করার পদ্ধতি প্রদর্শন করে:
কোটলিন
var billingClient = BillingClient.newBuilder(context)
.enableAlternativeBillingOnly()
.build()
জাভা
private BillingClient billingClient = BillingClient.newBuilder(context)
.enableAlternativeBillingOnly()
.build();
BillingClient ইনিশিয়ালাইজ করার পর, ইন্টিগ্রেশন গাইডে বর্ণিত পদ্ধতি অনুযায়ী আপনাকে Google Play-এর সাথে একটি সংযোগ স্থাপন করতে হবে।
প্রাপ্যতা যাচাই করা হচ্ছে
আপনার অ্যাপের উচিত isAlternativeBillingOnlyAvailableAsync কল করার মাধ্যমে শুধুমাত্র বিকল্প বিলিং উপলব্ধ আছে কিনা তা নিশ্চিত করা।
শুধুমাত্র বিকল্প বিলিং উপলব্ধ থাকলে এই API-টি BillingResponseCode.OK রিটার্ন করবে। অন্যান্য রেসপন্স কোডের ক্ষেত্রে আপনার অ্যাপ কীভাবে সাড়া দেবে, সে সম্পর্কে বিস্তারিত জানতে রেসপন্স হ্যান্ডলিং দেখুন।
কোটলিন
billingClient.isAlternativeBillingOnlyAvailableAsync(object:
AlternativeBillingOnlyAvailabilityListener {
override fun onAlternativeBillingOnlyAvailabilityResponse(
billingResult: BillingResult) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling alternative billing only being unavailable, etc.
return
}
// Alternative billing only is available. Continue with steps in
// the guide.
}
});
জাভা
billingClient.isAlternativeBillingOnlyAvailable(
new AlternativeBillingOnlyAvailabilityListener() {
@Override
public void onAlternativeBillingOnlyAvailabilityResponse(
BillingResult billingResult) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling alternative billing only being unavailable,
// etc.
return;
}
// Alternative billing only is available. Continue with steps in
// the guide.
}
});
ব্যবহারকারীদের জন্য তথ্য ডায়ালগ
শুধুমাত্র বিকল্প বিলিং-এর সাথে ইন্টিগ্রেট করার জন্য, আপনার যোগ্য অ্যাপটিকে অবশ্যই একটি তথ্য স্ক্রিন দেখাতে হবে, যা ব্যবহারকারীদের বুঝতে সাহায্য করবে যে বিলিং গুগল প্লে দ্বারা পরিচালিত হবে না। প্রতিবার বিকল্প বিলিং ফ্লো শুরু করার আগে showAlternativeBillingOnlyInformationDialog API কল করে ব্যবহারকারীদের এই তথ্য স্ক্রিনটি দেখাতে হবে। যদি ব্যবহারকারী ইতিমধ্যেই ডায়ালগটি স্বীকার করে থাকেন, তবে এই API ব্যবহার করলে সাধারণত ডায়ালগটি আবার দেখানো হবে না। এমন কিছু পরিস্থিতি থাকতে পারে যখন ডায়ালগটি ব্যবহারকারীকে আবার দেখানো হয়, যেমন যদি ব্যবহারকারী তার ডিভাইসের ক্যাশে ক্লিয়ার করেন।
কোটলিন
// An activity reference from which the alternative billing only information
// dialog will be launched.
val activity : Activity = ...;
val listener : AlternativeBillingOnlyInformationDialogListener =
AlternativeBillingOnlyInformationDialogListener {
override fun onAlternativeBillingOnlyInformationDialogResponse(
billingResult: BillingResult) {
// check billingResult
}
}
val billingResult =
billingClient.showAlternativeBillingOnlyInformationDialog(activity,
listener)
জাভা
// An activity reference from which the alternative billing only information
// dialog will be launched.
Activity activity = ...;
AlternativeBillingOnlyInformationDialogListener listener =
new AlternativeBillingOnlyInformationDialogListener() {
@Override
public void onAlternativeBillingOnlyInformationDialogResponse(
BillingResult billingResult) {
// check billingResult
}
};
BillingResult billingResult =
billingClient.showAlternativeBillingOnlyInformationDialog(activity,
listener);
যদি এই মেথডটি BillingResponseCode.OK রিটার্ন করে, তাহলে আপনার অ্যাপ ট্রানজ্যাকশনটি নিয়ে এগিয়ে যেতে পারে। BillingResponseCode.USER_CANCELED এর ক্ষেত্রে, ব্যবহারকারীকে ডায়ালগটি পুনরায় দেখানোর জন্য আপনার অ্যাপকে showAlternativeBillingOnlyInformationDialog কল করতে হবে। অন্যান্য রেসপন্স কোডের জন্য রেসপন্স হ্যান্ডলিং সেকশনটি দেখুন।
Google Play-তে লেনদেন রিপোর্ট করা
বিকল্প বিলিং সিস্টেমের মাধ্যমে করা সমস্ত লেনদেন অবশ্যই ২৪ ঘণ্টার মধ্যে আপনার ব্যাকএন্ড থেকে Google Play Developer API কল করে Google Play-কে জানাতে হবে এবং এর জন্য একটি externalTransactionToken প্রদান করতে হবে, যা নিচে বর্ণিত API ব্যবহার করে সংগ্রহ করা হয়। প্রতিটি এককালীন কেনাকাটা, প্রতিটি নতুন সাবস্ক্রিপশন এবং বিদ্যমান সাবস্ক্রিপশনের যেকোনো আপগ্রেড/ডাউনগ্রেডের জন্য একটি নতুন externalTransactionToken তৈরি করতে হবে। externalTransactionToken পাওয়ার পর কীভাবে একটি লেনদেন রিপোর্ট করতে হয় তা জানতে ব্যাকএন্ড ইন্টিগ্রেশন গাইড দেখুন।
কোটলিন
billingClient.createAlternativeBillingOnlyReportingDetailsAsync(object:
AlternativeBillingOnlyReportingDetailsListener {
override fun onAlternativeBillingOnlyTokenResponse(
billingResult: BillingResult,
alternativeBillingOnlyReportingDetails:
AlternativeBillingOnlyReportingDetails?) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return
}
val externalTransactionToken =
alternativeBillingOnlyReportingDetails?
.externalTransactionToken
// Send transaction token to backend and report to Google Play.
}
});
জাভা
billingClient.createAlternativeBillingOnlyReportingDetailsAsync(
new AlternativeBillingOnlyReportingDetailsListener() {
@Override
public void onAlternativeBillingOnlyTokenResponse(
BillingResult billingResult,
@Nullable AlternativeBillingOnlyReportingDetails
alternativeBillingOnlyReportingDetails) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return;
}
String transactionToken =
alternativeBillingOnlyReportingDetails
.getExternalTransactionToken();
// Send transaction token to backend and report to Google Play.
}
});
প্রতিক্রিয়া পরিচালনা
উপরের মেথডগুলো যেমন isAlternativeBillingOnlyAvailableAsync(), showAlternativeBillingOnlyInformationDialog() , এবং createAlternativeBillingOnlyReportingDetailsAsync() ত্রুটির ক্ষেত্রে BillingResponseCode.OK ছাড়া অন্য কোনো রেসপন্স রিটার্ন করতে পারে। এই ত্রুটিগুলো কীভাবে সমাধান করা উচিত, তার প্রস্তাবিত পদ্ধতি নিচে বর্ণনা করা হলো:
-
ERROR: এটি একটি অভ্যন্তরীণ ত্রুটি। লেনদেনটি সম্পন্ন করবেন না। পরবর্তীবার ব্যবহারকারী যখন কেনাকাটা করার চেষ্টা করবেন, তখন তাকে তথ্য ডায়ালগটি দেখানোর জন্যshowAlternativeBillingOnlyInformationDialog()কল করে আবার চেষ্টা করুন। -
FEATURE_NOT_SUPPORTED: বর্তমান ডিভাইসের প্লে স্টোর বিকল্প বিলিং এপিআইগুলো সমর্থন করে না। লেনদেনটি সম্পন্ন করবেন না। -
USER_CANCELED: লেনদেনটি আর এগিয়ে নিয়ে যাবেন না। ব্যবহারকারী পরবর্তীবার কেনাকাটার চেষ্টা করলে তাকে তথ্য ডায়ালগটি দেখানোর জন্যshowAlternativeBillingOnlyInformationDialog()আবার কল করুন। -
BILLING_UNAVAILABLE: লেনদেনটি শুধুমাত্র বিকল্প বিলিংয়ের জন্য যোগ্য নয় এবং তাই এই প্রোগ্রামের অধীনে এটি সম্পন্ন করা উচিত নয়। এর কারণ হলো, হয় ব্যবহারকারী এই প্রোগ্রামের জন্য যোগ্য কোনো দেশে নেই অথবা আপনার অ্যাকাউন্টটি প্রোগ্রামে সফলভাবে নথিভুক্ত করা হয়নি। যদি দ্বিতীয় কারণটি সত্যি হয়, তাহলে প্লে ডেভেলপার কনসোলে আপনার নথিভুক্তির অবস্থা পরীক্ষা করুন। -
DEVELOPER_ERROR: অনুরোধে একটি ত্রুটি রয়েছে। এগিয়ে যাওয়ার আগে ত্রুটিটি শনাক্ত ও সংশোধন করতে ডিবাগ বার্তাটি ব্যবহার করুন। -
NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: এগুলো সাময়িক ত্রুটি, যা পুনরায় চেষ্টা করা উচিত।SERVICE_DISCONNECTEDএর ক্ষেত্রে, পুনরায় চেষ্টা করার আগে Google Play-এর সাথে একটি সংযোগ পুনঃস্থাপন করুন।
পরীক্ষার বিকল্প বিলিং
আপনার বিকল্প বিলিং ইন্টিগ্রেশন পরীক্ষা করার জন্য লাইসেন্স টেস্টার ব্যবহার করা উচিত। লাইসেন্স টেস্টার অ্যাকাউন্ট দ্বারা শুরু করা লেনদেনের জন্য আপনাকে চালান পাঠানো হবে না। লাইসেন্স টেস্টার কনফিগার করার বিষয়ে আরও তথ্যের জন্য ‘অ্যাপ্লিকেশন লাইসেন্সিং সহ ইন-অ্যাপ বিলিং পরীক্ষা করুন’ দেখুন।
পরবর্তী পদক্ষেপ
একবার আপনি অ্যাপের ভেতরের ইন্টিগ্রেশন শেষ করে ফেললে, আপনার ব্যাকএন্ড ইন্টিগ্রেট করার জন্য আপনি প্রস্তুত।