এই নির্দেশিকাটি যোগ্য অ্যাপ এবং অঞ্চলে বহিরাগত অফারগুলিকে সমর্থন করার জন্য API গুলির সাথে কীভাবে একীভূত করতে হয় তা বর্ণনা করে। বহিরাগত অফার প্রোগ্রাম সম্পর্কে আরও জানতে, যোগ্যতার প্রয়োজনীয়তা এবং ভৌগোলিক সুযোগ সহ, প্রোগ্রামের প্রয়োজনীয়তাগুলি দেখুন।
প্লে বিলিং লাইব্রেরি সেটআপ
এক্সটার্নাল অফার API ব্যবহার করতে, আপনার অ্যান্ড্রয়েড অ্যাপে Play Billing Library নির্ভরতার 8.2 বা তার বেশি সংস্করণ যোগ করুন । যদি আপনার পূর্ববর্তী সংস্করণ থেকে মাইগ্রেট করার প্রয়োজন হয়, তাহলে এক্সটার্নাল অফার বাস্তবায়নের চেষ্টা করার আগে মাইগ্রেশন গাইডের নির্দেশাবলী অনুসরণ করুন।
গুগল প্লেতে সংযোগ করুন
ইন্টিগ্রেশন প্রক্রিয়ার প্রথম ধাপগুলি বিলিং ইন্টিগ্রেশন গাইডে বর্ণিত ধাপগুলির মতোই, তবে আপনার BillingClient শুরু করার সময় আপনি যে বহিরাগত অফারগুলি ব্যবহার করতে চান তা নির্দেশ করার জন্য আপনাকে enableBillingProgram কল করতে হবে:
নিম্নলিখিত উদাহরণটি এই পরিবর্তনগুলি ব্যবহার করে একটি BillingClient শুরু করার পদ্ধতি প্রদর্শন করে:
কোটলিন
val billingClient = BillingClient.newBuilder(context)
.enableBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build()
জাভা
private BillingClient billingClient = BillingClient.newBuilder(context)
.enableBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build();
BillingClient আরম্ভ করার পরে, ইন্টিগ্রেশন গাইডে বর্ণিত Google Play-তে একটি সংযোগ স্থাপন করতে হবে।
প্রাপ্যতা পরীক্ষা করুন
বর্তমান ব্যবহারকারীর জন্য বহিরাগত অফারগুলি উপলব্ধ কিনা তা নিশ্চিত করার জন্য, isBillingProgramAvailableAsync এ কল করুন।
যদি বহিরাগত অফারগুলি উপলব্ধ থাকে তবে এই API BillingResponseCode.OK ফেরত দেয়। আপনার অ্যাপটি অন্যান্য প্রতিক্রিয়া কোডগুলিতে কীভাবে প্রতিক্রিয়া জানাবে তার বিশদ বিবরণের জন্য প্রতিক্রিয়া পরিচালনা দেখুন।
কোটলিন
billingClient.isBillingProgramAvailableAsync(
BillingProgram.EXTERNAL_OFFER,
object : BillingProgramAvailabilityListener {
override fun onBillingProgramAvailabilityResponse(
billingResult: BillingResult,
billingProgramAvailabilityDetails: BillingProgramAvailabilityDetails) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling external offers unavailable, etc.
return
}
// External offers are available. Continue with steps in the
// guide.
}
})
জাভা
billingClient.isBillingProgramAvailableAsync(
BillingProgram.EXTERNAL_OFFER,
new BillingProgramAvailabilityListener() {
@Override
public void onBillingProgramAvailabilityResponse(
BillingResult billingResult,
BillingProgramAvailabilityDetails billingProgramAvailabilityDetails) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling external offers being unavailable, etc.
return;
}
// External offers are available. Continue with steps in the
// guide.
}
});
একটি বহিরাগত লেনদেন টোকেন প্রস্তুত করুন
Google Play-তে কোনও বহিরাগত লেনদেনের প্রতিবেদন করার জন্য, আপনার কাছে Play Billing Library থেকে তৈরি একটি বহিরাগত লেনদেন টোকেন থাকতে হবে। আপনি createBillingProgramReportingDetailsAsync API-এ কল করে এই টোকেনটি পেতে পারেন। প্রতিটি বহিরাগত অফারের জন্য ব্যবহারকারীকে অ্যাপের বাইরে পাঠানোর আগে অবিলম্বে একটি নতুন টোকেন তৈরি করতে হবে। লেনদেনগুলিতে টোকেন ক্যাশে করা উচিত নয়।
কোটলিন
val params =
BillingProgramReportingDetailsParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build();
billingClient.createBillingProgramReportingDetailsAsync(
params,
object : BillingProgramReportingDetailsListener {
override fun onCreateBillingProgramReportingDetailsResponse(
billingResult: BillingResult,
billingProgramReportingDetails: BillingProgramReportingDetails?) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return
}
val externalTransactionToken =
billingProgramReportingDetails?.externalTransactionToken
// Persist the transaction token in your backend. You may pass it
// to the external website when calling the launchExternalLink API.
}
})
জাভা
BillingProgramReportingDetailsParams params =
BillingProgramReportingDetailsParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
.build();
billingClient.createBillingProgramReportingDetailsAsync(
params,
new BillingProgramReportingDetailsListener() {
@Override
public void onCreateBillingProgramReportingDetailsResponse(
BillingResult billingResult,
@Nullable BillingProgramReportingDetails
billingProgramReportingDetails) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return;
}
String transactionToken =
billingProgramReportingDetails.getExternalTransactionToken();
// Persist the transaction token in your backend. You may pass it
// to the external website when calling the launchExternalLink API.
}
});
বিকল্পভাবে, আপনি Kotlin এক্সটেনশনের সাথে suspend ফাংশন createBillingProgramReportingDetailsAsync কোয়েরি করতে পারেন যাতে আপনাকে শ্রোতা নির্ধারণ করতে না হয়:
val createBillingProgramReportingDetailsResult =
withContext(context) {
billingClient
.createBillingProgramReportingDetails(params)
}
// Process the result
এক্সটার্নাল অফার ফ্লো চালু করুন
একটি বহিরাগত অফার প্রবাহ শুরু করতে, আপনার যোগ্য অ্যাপটিকে আপনার অ্যাপের মূল থ্রেড থেকে launchExternalLink() API কল করতে হবে। এই API একটি LaunchExternalLinkParams অবজেক্টের ইনপুট নেয়। একটি LaunchExternalLinkParams অবজেক্ট তৈরি করতে, LaunchExternalLinkParams.Builder ক্লাস ব্যবহার করুন। এই ক্লাসে নিম্নলিখিত প্যারামিটার রয়েছে:
- linkUri - ডিজিটাল কন্টেন্ট বা অ্যাপ ডাউনলোডের জন্য ব্যবহৃত বাহ্যিক ওয়েবসাইটের লিঙ্ক। অ্যাপ ডাউনলোডের জন্য, এই লিঙ্কটি অবশ্যই Play Developer Console-এ নিবন্ধিত এবং অনুমোদিত হতে হবে।
- linkType - ব্যবহারকারীকে যে ধরণের কন্টেন্ট দেওয়া হচ্ছে।
- launchMode - লিঙ্কটি কীভাবে চালু করা হবে তা নির্দিষ্ট করে। অ্যাপ ডাউনলোডের জন্য, আপনাকে এটি
LAUNCH_IN_EXTERNAL_BROWSER_OR_APPএ সেট করতে হবে। - billingProgram - এটি
BillingProgram.EXTERNAL_OFFERএ সেট করুন।
যখন আপনি launchExternalLink() কল করেন, তখন ব্যবহারকারীর সেটিংসের উপর ভিত্তি করে এটি ব্যবহারকারীকে অতিরিক্ত তথ্য ডায়ালগ দেখাতে পারে। launchMode প্যারামিটারের উপর নির্ভর করে, Play হয় একটি বহিরাগত ব্রাউজারে লিঙ্ক URI চালু করে অথবা URI চালু করার জন্য আপনার অ্যাপে প্রবাহ ফিরিয়ে দেয়। বেশিরভাগ ক্ষেত্রে, আপনি LAUNCH_IN_EXTERNAL_BROWSER_OR_APP মোড ব্যবহার করতে পারেন যেখানে Play আপনার জন্য URI চালু করবে। আপনি যদি আরও কাস্টমাইজড আচরণ পেতে চান, যেমন ওয়েবভিউতে URI চালু করা বা একটি নির্দিষ্ট ব্রাউজারে URI খোলা, তাহলে আপনি CALLER_WILL_LAUNCH_LINK মোড ব্যবহার করতে পারেন। ব্যবহারকারীর গোপনীয়তা রক্ষা করতে, নিশ্চিত করুন যে URI-তে কোনও ব্যক্তিগতভাবে সনাক্তযোগ্য তথ্য (PII) পাস করা হয়নি।
কোটলিন
// An activity reference from which the external offers flow will be launched.
val activity = ...;
val params =
LaunchExternalLinkParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
// You can pass along the external transaction token from
// BillingProgramReportingDetails as a URL parameter in the URI
.setLinkUri(yourLinkUri)
.setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
.setLaunchMode(
LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
.build()
val listener : LaunchExternalLinkResponseListener =
LaunchExternalLinkResponseListener {
override fun onLaunchExternalLinkResponse(billingResult: BillingResult) {
if (billingResult.responseCode == BillingResponseCode.OK) {
// Proceed with the rest of the external offer flow. If the user
// purchases an item, be sure to report the transaction to Google Play.
} else {
// Handle failures such as retrying due to network errors.
}
}
}
billingClient.launchExternalLink(activity, params, listener)
জাভা
// An activity reference from which the external offers flow will be launched.
Activity activity = ...;
LaunchExternalLinkParams params = LaunchExternalLinkParams.newBuilder()
.setBillingProgram(BillingProgram.EXTERNAL_OFFER)
// You can pass along the external transaction token from
// BillingProgramReportingDetails as a URL parameter in the URI
.setLinkUri(yourLinkUri)
.setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
.setLaunchMode(
LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
.build();
LaunchExternalLinkResponseListener listener =
new LaunchExternalLinkResponseListener() {
@Override
public void onLaunchExternalLinkResponse(BillingResult billingResult) {
if (billingResult.responseCode == BillingResponseCode.OK) {
// Proceed with the rest of the external offer flow. If the user
// purchases an item, be sure to report the transaction to Google
// Play.
} else {
// Handle failures such as retrying due to network errors.
}
}
}
billingClient.launchExternalLink(activity, params, listener);
যদি আপনি LaunchMode CALLER_WILL_LAUNCH_LINK এ সেট করেন, তাহলে ব্যবহারকারীকে অ্যাপের বাইরে নিয়ে যাওয়া উচিত শুধুমাত্র তখনই যদি onLaunchExternalLinkResponse BillingResponseCode.OK প্রদান করে।
Google Play-তে লেনদেনের রিপোর্ট করুন
আপনার ব্যাকএন্ড থেকে Google Play Developer API-এ কল করে সমস্ত বাহ্যিক লেনদেন Google Play-তে রিপোর্ট করতে হবে। যখন আপনি কোনও লেনদেন রিপোর্ট করবেন, তখন আপনাকে createBillingProgramReportingDetailsAsync API থেকে প্রাপ্ত একটি externalTransactionToken প্রদান করতে হবে। যদি কোনও ব্যবহারকারী একাধিক কেনাকাটা করেন, তাহলে আপনি প্রতিটি কেনাকাটার রিপোর্ট করার জন্য একই externalTransactionToken ব্যবহার করতে পারেন। লেনদেন কীভাবে রিপোর্ট করবেন তা জানতে, ব্যাকএন্ড ইন্টিগ্রেশন গাইড দেখুন।
প্রতিক্রিয়া পরিচালনা
যখন কোনও ত্রুটি দেখা দেয়, তখন isBillingProgramAvailableAsync() , createBillingProgramReportingDetailsAsync() , এবং launchExternalLink() পদ্ধতিগুলি BillingResponseCode.OK ব্যতীত অন্য কোনও প্রতিক্রিয়া ফেরত দিতে পারে। এই প্রতিক্রিয়া কোডগুলি নিম্নরূপ পরিচালনা করার কথা বিবেচনা করুন:
-
ERROR: এটি একটি অভ্যন্তরীণ ত্রুটি। লেনদেন বা বহিরাগত ওয়েবসাইট খোলার সাথে এগিয়ে যাবেন না। পরের বার যখন আপনি ব্যবহারকারীকে অ্যাপের বাইরে নির্দেশ দেওয়ার চেষ্টা করবেন তখন ব্যবহারকারীকে তথ্য ডায়ালগ প্রদর্শন করতেlaunchExternalLink()এ কল করে আবার চেষ্টা করুন। -
FEATURE_NOT_SUPPORTED: বর্তমান ডিভাইসে প্লে স্টোরে বহিরাগত অফার API গুলি সমর্থিত নয়। লেনদেন বা বহিরাগত ওয়েবসাইট খোলার সাথে এগিয়ে যাবেন না। -
USER_CANCELED: বাহ্যিক ওয়েবসাইট খোলার সাথে আর এগিয়ে যাবেন না। পরের বার যখন আপনি ব্যবহারকারীকে অ্যাপের বাইরে নিয়ে যাওয়ার চেষ্টা করবেন তখন ব্যবহারকারীকে তথ্য ডায়ালগটি প্রদর্শন করতে আবারlaunchExternalLink()এ কল করুন। -
BILLING_UNAVAILABLE: লেনদেনটি বহিরাগত অফারের জন্য যোগ্য নয় এবং তাই এই প্রোগ্রামের অধীনে এটি করা উচিত নয়। এর কারণ হতে পারে ব্যবহারকারী এই প্রোগ্রামের জন্য যোগ্য দেশে নেই অথবা আপনার অ্যাকাউন্টটি প্রোগ্রামে সফলভাবে নথিভুক্ত করা হয়নি। যদি এটি পরবর্তী হয়, তাহলে Play Developer Console-এ আপনার নথিভুক্তির স্থিতি পরীক্ষা করুন। -
DEVELOPER_ERROR: অনুরোধটিতে একটি ত্রুটি রয়েছে। এগিয়ে যাওয়ার আগে ত্রুটিটি সনাক্ত করতে এবং সংশোধন করতে ডিবাগ বার্তাটি ব্যবহার করুন। -
NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: এগুলি ক্ষণস্থায়ী ত্রুটি যা একটি উপযুক্ত পুনঃচেষ্টা নীতির মাধ্যমে সমাধান করা উচিত।SERVICE_DISCONNECTEDএর ক্ষেত্রে, পুনঃচেষ্টা করার আগে Google Play এর সাথে একটি সংযোগ পুনরায় স্থাপন করুন।
বাহ্যিক অফার পরীক্ষা করুন
আপনার বহিরাগত অফার ইন্টিগ্রেশন পরীক্ষা করার জন্য লাইসেন্স পরীক্ষক ব্যবহার করা উচিত। লাইসেন্স পরীক্ষক অ্যাকাউন্ট দ্বারা শুরু করা লেনদেনের জন্য আপনাকে ইনভয়েস করা হবে না। লাইসেন্স পরীক্ষক কনফিগার করার বিষয়ে আরও তথ্যের জন্য অ্যাপ্লিকেশন লাইসেন্সিং সহ টেস্ট ইন-অ্যাপ বিলিং দেখুন।
পরবর্তী পদক্ষেপ
একবার আপনি ইন-অ্যাপ ইন্টিগ্রেশন শেষ করলে, আপনি আপনার ব্যাকএন্ড ইন্টিগ্রেট করার জন্য প্রস্তুত।