এক্সটার্নাল পেমেন্টের জন্য অ্যাপ-মধ্যস্থ ইন্টিগ্রেশন সংক্রান্ত নির্দেশিকা

এই ডকুমেন্টে বর্ণনা করা হয়েছে যে কীভাবে Play Billing Library API ইন্টিগ্রেট করে উপযুক্ত অ্যাপে এক্সটার্নাল পেমেন্ট অফার করতে হয়। এই প্রোগ্রাম সম্পর্কে আরও জানতে, প্রোগ্রামের প্রয়োজনীয়তা দেখুন।

Play Billing Library সেট-আপ

আপনার Android অ্যাপে Play Billing Library-এর ডিপেন্ডেন্সি যোগ করুন। এক্সটার্নাল পেমেন্ট API ব্যবহার করতে আপনাকে 8.3 বা তার পরের যেকোনও ভার্সন ব্যবহার করতে হবে। আপনি যদি আগের কোনও ভার্সন থেকে মাইগ্রেট করতে চান, তাহলে ইন্টিগ্রেশন শুরু করার আগে আপগ্রেড করতে মাইগ্রেশন গাইড-এ দেওয়া নির্দেশাবলী অনুসরণ করুন।

বিলিং ক্লায়েন্ট ইনিশিয়ালাইজ করা

ইন্টিগ্রেশন প্রসেসের প্রথম ধাপগুলি Google Play Billing ইন্টিগ্রেশন গাইড-এ বর্ণিত ধাপগুলির মতোই, তবে আপনার BillingClient শুরু করার সময় কিছু পরিবর্তন করতে হবে:

  • আপনি যে এক্সটার্নাল পেমেন্ট অফার করতে চান তা বোঝাতে আপনাকে একটি নতুন enableBillingProgram(EnableBillingProgramParams) পদ্ধতি কল করতে হবে।
  • ব্যবহারকারী আপনার ওয়েবসাইট বা পেমেন্ট অ্যাপে পেমেন্ট করার বিকল্প বেছে নিলে, সেইসব কেস হ্যান্ডেল করার জন্য আপনাকে একটি DeveloperProvidedBillingListener রেজিস্টার করতে হবে।

নিম্নলিখিত উদাহরণে এইসব পরিবর্তন সহ BillingClient ইনিশিয়ালাইজ করা দেখানো হয়েছে:

Kotlin

val purchasesUpdatedListener =
    PurchasesUpdatedListener { billingResult, purchases ->
        // Handle new Google Play purchase.
    }

val developerProvidedBillingListener =
    DeveloperProvidedBillingListener { details ->
        // Handle user selection for developer provided billing option.
    }

val billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
    .enableBillingProgram(
        EnableBillingProgramParams.newBuilder()
            .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
            .setDeveloperProvidedBillingListener(developerProvidedBillingListener)
            .build()
    )
    .build()

জাভা

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // Handle new Google Play purchase.
    }
};

private DeveloperProvidedBillingListener developerProvidedBillingListener =
    new DeveloperProvidedBillingListener() {
        @Override
        public void onUserSelectedDeveloperBilling(
            DeveloperProvidedBillingDetails details) {
            // Handle user selection for developer provided billing option.
        }
    };

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .enableBillingProgram(
        EnableBillingProgramParams.newBuilder()
            .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
            .setDeveloperProvidedBillingListener(developerProvidedBillingListener)
            .build())
    .build();

Google Play-তে কানেক্ট করা

BillingClient ইনিশিয়ালাইজ করার পরে, Google Play-তে কানেক্ট করুন-এ বর্ণিত পদ্ধতি অনুসরণ করে Google Play-তে কানেক্ট করুন।

ব্যবহারকারী উপযুক্ত কিনা চেক করা

Google Play-তে কানেক্ট করার পরে, ব্যবহারকারী এক্সটার্নাল পেমেন্ট প্রোগ্রামের জন্য উপযুক্ত কিনা তা isBillingProgramAvailableAsync() মেথড কল করে চেক করতে পারবেন। ব্যবহারকারী উপযুক্ত হলে এই পদ্ধতি BillingResponseCode.OK রিটার্ন করে। উপযুক্ততা কীভাবে চেক করতে হয় তা নিম্নলিখিত নমুনা থেকে দেখুন:

Kotlin

billingClient.isBillingProgramAvailableAsync(
    BillingProgram.EXTERNAL_PAYMENTS,
    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 payments unavailable, etc.
                return
            }

            // External payments are available. Can proceed with generating an
            // external transaction token.
        }
    }
)

জাভা

billingClient.isBillingProgramAvailableAsync(
  BillingProgram.EXTERNAL_PAYMENTS,
  new BillingProgramAvailabilityListener() {
    @Override
    public void onBillingProgramAvailabilityResponse(
      int billingProgram, BillingResult billingResult) {
        if (billingResult.getResponseCode() != BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors,
            // handling external payments unavailable, etc.
            return;
        }

        // External payments are available. Can proceed with generating an external transaction token.
      }

    });

আপনার অ্যাপ কীভাবে অন্যান্য রেসপন্স কোডের উত্তর দেবে সেই সম্পর্কে বিস্তারিত জানতে, উত্তর ম্যানেজ করা বিভাগটি দেখুন। আপনি Kotlin এক্সটেনশন ব্যবহার করলে, আপনাকে আলাদা লিসনার ডিফাইন করতে হবে না, আপনি Kotlin কোরাউটিন ব্যবহার করতে পারবেন।

উপলভ্য প্রোডাক্ট দেখানো

Google Play বিলিং সিস্টেম ইন্টিগ্রেশনের মতো একই পদ্ধতিতে আপনি ব্যবহারকারীকে উপলভ্য প্রোডাক্ট দেখাতে পারবেন। আপনার ব্যবহারকারী যখন কেনার জন্য উপলভ্য প্রোডাক্ট দেখেছেন এবং একটি বেছে নিয়েছেন, তখন এক্সটার্নাল পেমেন্ট ফ্লো লঞ্চ করা বিভাগ-এ বর্ণিত এক্সটার্নাল পেমেন্ট ফ্লো লঞ্চ করুন।

এক্সটার্নাল ট্রানজ্যাকশন টোকেন প্রস্তুত করা

Google Play-তে কোনও এক্সটার্নাল ট্রানজ্যাকশনের ব্যাপারে অভিযোগ জানাতে, আপনার কাছে অবশ্যই Play Billing Library থেকে জেনারেট করা এক্সটার্নাল ট্রানজ্যাকশন টোকেন থাকতে হবে। ব্যবহারকারী এক্সটার্নাল পেমেন্ট API-এর মাধ্যমে কোনও এক্সটার্নাল ওয়েবসাইট বা অ্যাপে গেলে, প্রতিবার একটি নতুন এক্সটার্নাল ট্রানজ্যাকশন টোকেন তৈরি করতে হবে। createBillingProgramReportingDetailsAsync API-তে কল করে এটি করা যেতে পারে। launchBillingFlow কল করার ঠিক আগে টোকেন জেনারেট করতে হবে।

Kotlin

val params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .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 external transaction token locally. Pass it to
            // the external website using DeveloperBillingOptionParams when
            // launchBillingFlow is called.
        }
    }
)

জাভা

BillingProgramReportingDetailsParams params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .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 external transaction token locally. Pass it to
        // the external website using DeveloperBillingOptionParams when
        // launchBillingFlow is called.
      }
});

আপনি Kotlin এক্সটেনশন ব্যবহার করলে, Kotlin করুটিন ব্যবহার করতে পারবেন, ফলে আপনাকে আলাদা লিসনার ডিফাইন করতে হবে না।

এক্সটার্নাল পেমেন্ট ফ্লো লঞ্চ করা

Google Play বিলিং সিস্টেম ইন্টিগ্রেশনের মাধ্যমে কেনাকাটার ফ্লো লঞ্চ করার মতো launchBillingFlow() কল করে এক্সটার্নাল পেমেন্ট ফ্লো লঞ্চ করুন। তবে, অতিরিক্ত প্যারামিটার DeveloperBillingOptionParams প্রদান করা হয়েছে যা থেকে বোঝা যায় যে আপনার অ্যাপ এই কেনাকাটার জন্য এক্সটার্নাল পেমেন্ট ফ্লো চালু করতে চায়।

DeveloperBillingOptionParams-এ নিম্নলিখিত বিষয়গুলি থাকতে হবে:

  • EXTERNAL_PAYMENTS বিলিং প্রোগ্রামে billingProgram সেট করা আছে
  • linkURI লিঙ্ক ডেস্টিনেশনে সেট করা আছে
  • launchMode LAUNCH_IN_EXTERNAL_BROWSER_OR_APP হিসেবে সেট করা হয় যদি Google Play লিঙ্কটি লঞ্চ করে অথবা CALLER_WILL_LAUNCH_LINK হিসেবে সেট করা হয় যদি আপনার অ্যাপ লিঙ্কটি লঞ্চ করে।

আপনার অ্যাপ DeveloperBillingOptionParams প্রদান করে launchBillingFlow() কল করলে, Google Play বিলিং সিস্টেম নিম্নলিখিত চেকগুলি করে:

  • ব্যবহারকারীর Google Play দেশ এমন কোনও দেশ কিনা তা সিস্টেম চেক করে যেখানে এক্সটার্নাল পেমেন্ট কাজ করে (অর্থাৎ, কাজ করে এমন দেশ)। ব্যবহারকারীর Google Play দেশ কাজ করলে, Google Play চেক করে যে BillingClient-এর কনফিগারেশনের উপর ভিত্তি করে এক্সটার্নাল পেমেন্ট চালু আছে কিনা এবং DeveloperBillingOptionParams প্রদান করা হয়েছে কিনা।
    • এক্সটার্নাল পেমেন্ট চালু করা থাকলে, কেনাকাটার ফ্লোতে ব্যবহারকারীর পছন্দ সংক্রান্ত UX দেখানো হয়।
    • এক্সটার্নাল পেমেন্ট চালু করা না থাকলে, কেনাকাটার ফ্লোতে ব্যবহারকারীর পছন্দ ছাড়াই স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখানো হয়।
  • ব্যবহারকারীর Google Play দেশ যদি কাজ করে এমন দেশ না হয়, তাহলে কেনাকাটার ফ্লোতে স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখানো হয়, যেখানে ব্যবহারকারীর পছন্দ থাকে না।

ব্যবহারকারীর Play দেশ হল একটি কাজ করে এমন দেশ

ব্যবহারকারীর Play কান্ট্রি এমন কোনও দেশ নয় যেখানে এটি কাজ করে

এক্সটার্নাল পেমেন্ট চালু করা আছে (BillingClient সেট-আপ ও launchBillingFlow)

ব্যবহারকারী ব্যবহারকারীর পছন্দ সংক্রান্ত UX দেখতে পান

ব্যবহারকারী স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখতে পান

এক্সটার্নাল পেমেন্ট চালু করা নেই (BillingClient সেট-আপ করার সময় চালু করা হয়নি অথবা launchBillingFlow-তে DeveloperBillingOptionParams প্রদান করা হয়নি)

ব্যবহারকারী স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখতে পান

ব্যবহারকারী স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখতে পান

নিচের স্নিপেট থেকে কীভাবে DeveloperBillingOptionParams তৈরি করতে হয় তা জানতে পারবেন:

Kotlin

val developerBillingOptionParams =
    DeveloperBillingOptionParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .setLinkUri("https://www.example.com/external/purchase".toUri())
        .setLaunchMode(
            DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP
        )
        .build()

জাভা

DeveloperBillingOptionParams developerBillingOptionParams =
    DeveloperBillingOptionParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS)
        .setLinkUri(Uri.parse("https://www.example.com/external/purchase"))
        .setLaunchMode(
            DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
        .build();

ব্যবহারকারীর বেছে নেওয়া বিকল্প ম্যানেজ করা

ব্যবহারকারী Google Play-এর বিলিং সিস্টেম বেছে নিয়েছেন নাকি আপনার ওয়েবসাইটে পেমেন্ট করবেন, তার উপর নির্ভর করে বাকি কেনাকাটা প্রসেস করার পদ্ধতি আলাদা হয়।

ব্যবহারকারী আপনার ওয়েবসাইট বা পেমেন্ট অ্যাপে পেমেন্ট করার বিকল্প বেছে নিলে

ব্যবহারকারী আপনার ওয়েবসাইটে পেমেন্ট করার বিকল্প বেছে নিলে, Google Play, অ্যাপকে জানানোর জন্য DeveloperProvidedBillingListener কল করে যে ব্যবহারকারী আপনার ওয়েবসাইটে বা পেমেন্ট অ্যাপে পেমেন্ট করার বিকল্প বেছে নিয়েছেন। বিশেষ করে, onUserSelectedDeveloperBilling() পদ্ধতি কল করা হয়।

আপনার অ্যাপ launchMode-এর মান LAUNCH_IN_EXTERNAL_BROWSER_OR_APP হিসেবে সেট করলে, Google Play লিঙ্কটি লঞ্চ করবে। launchMode-এর মান CALLER_WILL_LAUNCH_LINK সেট করা থাকলে, লিঙ্ক লঞ্চ করার দায়িত্ব আপনার অ্যাপের। কোনও পেমেন্ট অ্যাপের সাথে ব্যবহারকারীকে লিঙ্ক করার সময়, ব্যবহারকারীর ডিভাইসে আগে থেকেই পেমেন্ট অ্যাপ ইনস্টল করা আছে কিনা তা চেক করার দায়িত্ব আপনার।

ব্যাকএন্ড ইন্টিগ্রেশন গাইড-এ ব্যাখ্যা করা হয়েছে যে এই টোকেনটি ব্যবহার করে এই বিকল্পের ফলে হওয়া যেকোনও ট্রানজ্যাকশনের বিষয়ে অভিযোগ জানান।

ব্যবহারকারী Google Play-র বিলিং সিস্টেম বেছে নিলে

ব্যবহারকারী Google Play-র বিলিং সিস্টেম বেছে নিলে, তিনি Google Play-র মাধ্যমে কেনাকাটা চালিয়ে যান।

  • Google Play-র বিলিং সিস্টেমের মাধ্যমে নতুন অ্যাপ-মধ্যস্থ কেনাকাটা কীভাবে ম্যানেজ করতে হয় সেই সম্পর্কে আরও তথ্য পেতে, লাইব্রেরি ইন্টিগ্রেশন গাইডে কেনাকাটা প্রসেস করা দেখুন।
  • সাবস্ক্রিপশন কেনার ব্যাপারে অতিরিক্ত নির্দেশিকা পেতে সাবস্ক্রিপশন ম্যানেজমেন্ট গাইডে নতুন সাবস্ক্রিপশন দেখুন।

সাবস্ক্রিপশনে পরিবর্তন ম্যানেজ করা

এক্সটার্নাল পেমেন্ট ব্যবহারকারী ডেভেলপারদের ক্ষেত্রে, ব্যবহারকারীর পছন্দের উপর নির্ভর করে, কেনাকাটা Google Play-এর বিলিং সিস্টেমের মাধ্যমে প্রসেস করতে হবে অথবা externalTransactionId সহ রিপোর্ট করতে হবে। ডেভেলপারের ওয়েবসাইটের মাধ্যমে প্রসেস করা হয়েছে এমন আগে থেকে থাকা সাবস্ক্রিপশনে পরিবর্তন করতে চাইলে, মেয়াদ শেষ না হওয়া পর্যন্ত একই বিলিং সিস্টেমের মাধ্যমে তা করা যাবে।

এই বিভাগে সাবস্ক্রিপশন পরিবর্তন সংক্রান্ত কিছু সাধারণ পরিস্থিতি কীভাবে সামলাতে হয় তা বর্ণনা করা হয়েছে।

ফ্লো আপগ্রেড ও ডাউনগ্রেড করা

আপগ্রেড ও ডাউনগ্রেড ফ্লো সহ সাবস্ক্রিপশন প্ল্যানে পরিবর্তন করার বিষয়টি সাবস্ক্রিপশনটি মূলত Google Play-এর বিলিং সিস্টেমের মাধ্যমে কেনা হয়েছে নাকি ডেভেলপারের ওয়েবসাইটের মাধ্যমে কেনা হয়েছে তার উপর নির্ভর করে আলাদাভাবে ম্যানেজ করতে হবে।

আগে থেকে থাকা সাবস্ক্রিপশনের উপর নির্ভর করে এমন অ্যাড-অন, একই পেমেন্ট পদ্ধতি শেয়ার করে এবং বারবার চার্জ করার সুবিধা আপগ্রেড হিসেবে ম্যানেজ করা হয়। অন্যান্য অ্যাড-অনের ক্ষেত্রে, ব্যবহারকারীকে কোন বিলিং সিস্টেম ব্যবহার করতে চান তা বেছে নিতে দিতে হবে। launchBillingFlow() ব্যবহার করে নতুন কেনাকাটার অভিজ্ঞতা শুরু করুন, যেমন এক্সটার্নাল পেমেন্ট ফ্লো লঞ্চ করা নিবন্ধে বর্ণনা করা হয়েছে।

ডেভেলপারের ওয়েবসাইট বা পেমেন্ট অ্যাপের মাধ্যমে কেনা সাবস্ক্রিপশন

যেসব সাবস্ক্রিপশন মূলত ডেভেলপারের ওয়েবসাইট বা ব্যবহারকারীর পছন্দমতো পেমেন্ট অ্যাপের মাধ্যমে কেনা হয়েছে, সেগুলির ক্ষেত্রে আপগ্রেড বা ডাউনগ্রেড করার অনুরোধকারী ব্যবহারকারীদের ডেভেলপারের ওয়েবসাইট বা পেমেন্ট অ্যাপের মাধ্যমে প্রসেস করতে হবে এবং তাদের আর ব্যবহারকারীর পছন্দ সংক্রান্ত অভিজ্ঞতা নিতে হবে না।

এটি করতে, ব্যবহারকারী আপগ্রেড বা ডাউনগ্রেড করার অনুরোধ করলে launchBillingFlow()-এ কল করুন। SubscriptionUpdateParams অবজেক্টের অধীনে অন্যান্য প্যারামিটার নির্দিষ্ট করার পরিবর্তে, আসল কেনাকাটার জন্য এক্সটার্নাল ট্রানজ্যাকশন আইডি প্রদান করে setOriginalExternalTransactionId() ব্যবহার করুন।

এই কলে DeveloperBillingOptionParams-এর উল্লেখও করতে হবে। এটি ব্যবহারকারীর পছন্দ সংক্রান্ত স্ক্রিন দেখায় না, কারণ আপগ্রেড ও ডাউনগ্রেডের ক্ষেত্রে আসল কেনাকাটার জন্য ব্যবহারকারীর পছন্দ সংরক্ষিত থাকে। আপনাকে অবশ্যই এই ট্রানজ্যাকশনের জন্য একটি নতুন এক্সটার্নাল ট্রানজ্যাকশন টোকেন তৈরি করতে হবে, যা এখানে বর্ণনা করা হয়েছে।

ডেভেলপারের ওয়েবসাইট বা কোনও পেমেন্ট অ্যাপ ব্যবহার করে আপগ্রেড বা ডাউনগ্রেড সম্পূর্ণ করা হলে, নতুন সাবস্ক্রিপশন কেনাকাটার জন্য আগের কলের মাধ্যমে পাওয়া এক্সটার্নাল ট্রানজ্যাকশন টোকেন ব্যবহার করে আপনাকে নতুন ট্রানজ্যাকশনের বিষয়ে অভিযোগ জানাতে হবে।

Google Play-র বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

একইভাবে, যেসব ব্যবহারকারী নিজেদের পছন্দমতো Google Play-র বিলিং সিস্টেমের মাধ্যমে বর্তমান সাবস্ক্রিপশন কিনেছেন, তাদের স্ট্যান্ডার্ড Google Play বিলিং ফ্লো দেখানো উচিত। DeveloperBillingOptionParams-এর কল launchBillingFlow-এ সেট করা থাকলে চলবে না।

সাবস্ক্রিপশন বাতিল করা ও রিস্টোর করা

ব্যবহারকারীকে যেকোনও সময় সাবস্ক্রিপশন বাতিল করার সুবিধা দিতে হবে। কোনও ব্যবহারকারী সাবস্ক্রিপশন বাতিল করলে, পেমেন্ট করা মেয়াদ শেষ না হওয়া পর্যন্ত এনটাইটেলমেন্ট বন্ধ নাও করা হতে পারে। যেমন, কোনও ব্যবহারকারী যদি কোনও মাসিক সাবস্ক্রিপশন মাসের মাঝামাঝি বাতিল করেন, তাহলে তিনি হয়ত অ্যাক্সেস সরিয়ে না দেওয়া পর্যন্ত বাকি ~২ সপ্তাহ পরিষেবা অ্যাক্সেস করা চালিয়ে যেতে পারবেন। এই সময়সীমা চলাকালীন, সাবস্ক্রিপশন এখনও টেকনিক্যালি অ্যাক্টিভ থাকে, তাই ব্যবহারকারী পরিষেবা ব্যবহার করতে পারেন।

এই অ্যাক্টিভ থাকাকালীন ব্যবহারকারীরা যে বাতিল করার সিদ্ধান্ত পরিবর্তন করতে পারেন, তা অস্বাভাবিক নয়। এই নির্দেশিকায়, এটিকে রিস্টোরেশন বলা হয়। আপনার এক্সটার্নাল পেমেন্ট এপিআই ইন্টিগ্রেশনে কীভাবে রিস্টোরেশন পরিস্থিতি সামলাতে হয় তা নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

ডেভেলপারের ওয়েবসাইটের মাধ্যমে কেনা সাবস্ক্রিপশন

বাতিল করা সাবস্ক্রিপশনের জন্য আপনার কাছে এক্সটার্নাল ট্রানজ্যাকশন আইডি থাকলে, সাবস্ক্রিপশন রিস্টোর করার জন্য launchBillingFlow() কল করার প্রয়োজন নেই, তাই এই ধরনের অ্যাক্টিভেশনের জন্য এটি ব্যবহার করা উচিত নয়। কোনও ব্যবহারকারী বাতিল করা সাবস্ক্রিপশনের অ্যাক্টিভ মেয়াদ চলাকালীন সেটি আবার চালু করলে, সেই সময় কোনও ট্রানজ্যাকশন হয় না; বর্তমান চক্রের মেয়াদ শেষ হলে এবং পরবর্তী রিনিউয়াল হলে আপনি শুধু রিনিউয়াল সম্পর্কে রিপোর্ট করা চালিয়ে যেতে পারেন। এর মধ্যে রিস্টোরেশনের অংশ হিসেবে ব্যবহারকারী ক্রেডিট বা বিশেষ রিনিউয়াল মূল্য পেলে সেইসব কেস অন্তর্ভুক্ত (যেমন, ব্যবহারকারীকে সাবস্ক্রিপশন চালিয়ে যেতে উৎসাহিত করার জন্য প্রোমোশন)।

Google Play-র বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

সাধারণত, ব্যবহারকারীরা Google Play-এর বিলিং সিস্টেমে সাবস্ক্রিপশন রিস্টোর করতে পারেন। Google Play-এর বিলিং সিস্টেম থেকে কেনা বাতিল করা সাবস্ক্রিপশনের ক্ষেত্রে, Google Play-এর আবার সাবস্ক্রাইব করুন ফিচারের মাধ্যমে সাবস্ক্রিপশন অ্যাক্টিভ থাকাকালীন ব্যবহারকারী বাতিল করার সিদ্ধান্ত ফিরিয়ে নিতে পারেন। সেক্ষেত্রে, আপনি ব্যাকএন্ডে SUBSCRIPTION_RESTARTED রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি পাবেন এবং নতুন পার্চেজ টোকেন ইস্যু করা হবে না—সাবস্ক্রিপশন চালিয়ে যাওয়ার জন্য মূল টোকেন ব্যবহার করা হবে। Google Play-এর বিলিং সিস্টেমে কীভাবে রিস্টোর করা ম্যানেজ করবেন তা জানতে, সাবস্ক্রিপশন ম্যানেজমেন্ট গাইডে রিস্টোর করা দেখুন।

এছাড়াও, আপনি launchBillingFlow()-এ কল করে অ্যাপ থেকে Google Play-এর বিলিং সিস্টেমে রিস্টোরেশন ট্রিগার করতে পারবেন। এটি কীভাবে করবেন তা জানতে সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে - অ্যাপ-মধ্যস্থ লিঙ্কে দেখুন। যেসব ব্যবহারকারী মূল কেনাকাটার জন্য ব্যবহারকারীর পছন্দ সংক্রান্ত ফ্লোর (যা বাতিল করা হয়েছে কিন্তু এখনও অ্যাক্টিভ আছে) মধ্যে দিয়ে গেছেন, সেইসব ক্ষেত্রে সিস্টেম অটোমেটিক তাদের পছন্দ শনাক্ত করে এবং এইসব কেনাকাটা রিস্টোর করার জন্য ইউজার ইন্টারফেস দেখায়। তাদের Google Play-এর মাধ্যমে সাবস্ক্রিপশন আবার কেনার বিষয়টি কনফার্ম করতে বলা হয়, তবে তাদের ব্যবহারকারীর পছন্দ সংক্রান্ত ফ্লোয়ের মধ্যে দিয়ে আবার যেতে হয় না। এই ক্ষেত্রে ব্যবহারকারীর জন্য একটি নতুন পার্চেজ টোকেন ইস্যু করা হয়। আপনার ব্যাকএন্ডে SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার নোটিফিকেশন আসে এবং নতুন কেনাকাটার স্ট্যাটাসের জন্য লিঙ্ক করাPurchaseToken ভ্যালু আপগ্রেড বা ডাউনগ্রেডের মতো সেট করা হয়, সাথে বাতিল করা সাবস্ক্রিপশনের পুরনো purchaseToken থাকে।

আবার সাবস্ক্রাইব করা

সাবস্ক্রিপশনের মেয়াদ সম্পূর্ণ শেষ হয়ে গেলে, তা বাতিল করার কারণে হোক বা পেমেন্ট সংক্রান্ত সমস্যা সমাধান না হওয়ার কারণে হোক (অ্যাকাউন্ট হোল্ডের মেয়াদ শেষ হয়ে যাওয়া), ব্যবহারকারীকে আবার সাবস্ক্রাইব করতে হবে, তবেই তিনি আবার এনটাইটেলমেন্ট পাবেন।

এছাড়াও, স্ট্যান্ডার্ড সাইন-আপের মতো একই পদ্ধতিতে প্রসেস করে অ্যাপের মাধ্যমে আবার সাবস্ক্রাইব করার সুবিধা চালু করা যেতে পারে। ব্যবহারকারীকে কোন বিলিং সিস্টেম ব্যবহার করতে চান তা বেছে নিতে দিতে হবে। launchBillingFlow()-কে এই ক্ষেত্রে কল করা হতে পারে, যেমন এক্সটার্নাল পেমেন্ট ফ্লো লঞ্চ করা নিবন্ধে বর্ণনা করা হয়েছে।

উত্তরের ম্যানেজমেন্ট

সমস্যা হলে, isBillingProgramAvailableAsync() , createBillingProgramReportingDetailsAsync(), launchBillingFlow() পদ্ধতিগুলি BillingResponseCode.OK-এর পরিবর্তে BillingResponseCode প্রদান করতে পারে। এইসব রেসপন্স কোড কীভাবে হ্যান্ডেল করা যায় তা দেখুন:

  • BillingResponseCode.ERROR: এটি ইন্টার্নাল সমস্যা। ট্রানজ্যাকশন সম্পূর্ণ করবেন না বা এক্সটার্নাল ওয়েবসাইট খুলবেন না। API আবার কল করে আবার চেষ্টা করুন।
  • BillingResponseCode.FEATURE_NOT_SUPPORTED: বর্তমান ডিভাইসে Play Store-এ এক্সটার্নাল পেমেন্ট API কাজ করে না। ট্রানজ্যাকশন সম্পূর্ণ করবেন না বা এক্সটার্নাল ওয়েবসাইট খুলবেন না।
  • BillingResponseCode.DEVELOPER_ERROR: অনুরোধে সমস্যা আছে। এগিয়ে যাওয়ার আগে সমস্যা চিহ্নিত করতে ও সমাধান করতে ডিবাগ মেসেজ ব্যবহার করুন।
  • BillingResponseCode.USER_CANCELED: এক্সটার্নাল ওয়েবসাইট বা অ্যাপ খোলার প্রক্রিয়া চালিয়ে যাবেন না। ব্যবহারকারীকে অ্যাপের বাইরে ডিরেক্ট করার পরবর্তী প্রচেষ্টার সময় ব্যবহারকারীকে তথ্যের ডায়ালগ দেখানোর জন্য launchBillingFlow()-এ আবার কল করুন।
  • BillingResponseCode.BILLING_UNAVAILABLE: ট্রানজ্যাকশনটি এক্সটার্নাল পেমেন্টের জন্য উপযুক্ত নয় এবং তাই এই প্রোগ্রামের অধীনে ডেভেলপার বিলিং উপলভ্য হবে না। এর কারণ হল, ব্যবহারকারী এই প্রোগ্রামের জন্য উপযুক্ত দেশে থাকেন না অথবা আপনার অ্যাকাউন্ট এই প্রোগ্রামে সফলভাবে এনরোল করা হয়নি। যদি দ্বিতীয়টি হয়, তাহলে Play Developer Console-এ আপনার এনরোলমেন্ট স্ট্যাটাস চেক করুন।
  • BillingResponseCode.NETWORK_ERROR, BillingResponseCode.SERVICE_DISCONNECTED, BillingResponseCode.SERVICE_UNAVAILABLE: এগুলি ক্ষণস্থায়ী সমস্যা যা উপযুক্ত রিট্রাই নীতি দিয়ে সমাধান করা উচিত। SERVICE_DISCONNECTED-এর ক্ষেত্রে, আবার চেষ্টা করার আগে Google Play-এর সাথে কানেকশন আবার স্থাপন করুন।

এক্সটার্নাল পেমেন্ট লিঙ্ক পরীক্ষা করা

আপনার এক্সটার্নাল পেমেন্ট ইন্টিগ্রেশন পরীক্ষা করার জন্য লাইসেন্স টেস্টার ব্যবহার করা উচিত। লাইসেন্স টেস্টার অ্যাকাউন্ট থেকে শুরু করা ট্রানজ্যাকশনের জন্য আপনাকে ইনভয়েস করা হবে না। লাইসেন্স টেস্টার কনফিগার করা সম্পর্কে আরও তথ্য পেতে, অ্যাপ্লিকেশন লাইসেন্সিং সহ ইন-অ্যাপ বিলিং টেস্ট করা দেখুন।

পরবর্তী ধাপ

ইন-অ্যাপ ইন্টিগ্রেশন সম্পূর্ণ করার পরে, আপনি আপনার ব্যাকএন্ড ইন্টিগ্রেট করার জন্য প্রস্তুত।