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

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

প্লে বিলিং লাইব্রেরি সেটআপ

আপনার অ্যান্ড্রয়েড অ্যাপে প্লে বিলিং লাইব্রেরি ডিপেন্ডেন্সি যোগ করুন । এক্সটার্নাল পেমেন্ট এপিআই ব্যবহার করার জন্য আপনাকে ভার্সন ৮.৩ বা তার উচ্চতর সংস্করণ ব্যবহার করতে হবে। যদি আপনাকে পূর্ববর্তী কোনো সংস্করণ থেকে মাইগ্রেট করতে হয়, তবে ইন্টিগ্রেশন শুরু করার আগে আপগ্রেড করার জন্য মাইগ্রেশন গাইডের নির্দেশাবলী অনুসরণ করুন।

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

ইন্টিগ্রেশন প্রক্রিয়ার প্রথম ধাপগুলো গুগল প্লে বিলিং ইন্টিগ্রেশন গাইডে বর্ণিত ধাপগুলোর মতোই, তবে আপনার BillingClient ইনিশিয়ালাইজ করার সময় কয়েকটি পরিবর্তন করতে হবে:

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

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

কোটলিন

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()
    .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 চালু করার পর, "Connect to Google Play" অংশে বর্ণিত পদ্ধতি অনুযায়ী Google Play-এর সাথে সংযোগ করুন।

ব্যবহারকারীর যোগ্যতা যাচাই করুন

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

কোটলিন

billingClient.isBillingProgramAvailableAsync(
  BillingProgram.EXTERNAL_PAYMENTS,
  object : BillingProgramAvailabilityListener {
    override fun onBillingProgramAvailabilityResponse(
      billingProgram: Int, billingResult: BillingResult) {
        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.
      }

    });

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

উপলব্ধ পণ্যগুলি প্রদর্শন করুন

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

একটি বাহ্যিক লেনদেন টোকেন প্রস্তুত করুন

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

কোটলিন

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

আপনি যদি কোটলিন এক্সটেনশন ব্যবহার করেন , তাহলে কোটলিন কো-রুটিন ব্যবহার করতে পারেন, ফলে আপনাকে আলাদা লিসেনার সংজ্ঞায়িত করতে হবে না।

বাহ্যিক অর্থপ্রদানের প্রবাহ চালু করা

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

DeveloperBillingOptionParams নিম্নলিখিত বিষয়গুলো অবশ্যই থাকতে হবে:

  • billingProgram EXTERNAL_PAYMENTS এ সেট করা হয়েছে।
  • linkURI লিঙ্কের গন্তব্যে সেট করা হয়েছে।
  • যদি গুগল প্লে লিঙ্কটি চালু করে, তাহলে launchMode LAUNCH_IN_EXTERNAL_BROWSER_OR_APP এ সেট করুন, আর যদি আপনার অ্যাপ লিঙ্কটি চালু করে, তাহলে CALLER_WILL_LAUNCH_LINK সেট করুন।

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

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

ব্যবহারকারীর খেলার দেশ একটি সমর্থিত দেশ

ব্যবহারকারীর প্লে দেশ একটি সমর্থিত দেশ নয়।

বাহ্যিক পেমেন্ট সক্রিয় করা হয়েছে ( BillingClient সেটআপ এবং BillingFlow চালু করা হয়েছে )

ব্যবহারকারী তার পছন্দের ইউএক্স দেখতে পায়।

ব্যবহারকারী গুগল প্লে-এর সাধারণ বিলিং সিস্টেমের ইউএক্স দেখতে পান।

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

ব্যবহারকারী গুগল প্লে-এর সাধারণ বিলিং সিস্টেমের ইউএক্স দেখতে পান।

ব্যবহারকারী গুগল প্লে-এর সাধারণ বিলিং সিস্টেমের ইউএক্স দেখতে পান।

নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে DeveloperBillingOptionParams তৈরি করতে হয়:

কোটলিন

val 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()

জাভা

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 অ্যাপটিকে জানানোর জন্য DeveloperProvidedBillingListener কে কল করে যে ব্যবহারকারী আপনার ওয়েবসাইটে বা কোনো পেমেন্ট অ্যাপে অর্থপ্রদান করার সিদ্ধান্ত নিয়েছেন। বিশেষ করে, onUserSelectedDeveloperBilling() মেথডটি কল করা হয়।

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

ব্যাকএন্ড ইন্টিগ্রেশন গাইডে ব্যাখ্যা করা অনুযায়ী, এই পছন্দের ফলে উদ্ভূত যেকোনো লেনদেন রিপোর্ট করতে এই টোকেনটি ব্যবহার করুন।

যখন ব্যবহারকারী গুগল প্লে-এর বিলিং সিস্টেম নির্বাচন করেন

যদি ব্যবহারকারী গুগল প্লে-এর বিলিং ব্যবস্থা বেছে নেন, তাহলে তিনি গুগল প্লে-এর মাধ্যমেই কেনাকাটা চালিয়ে যান।

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

সাবস্ক্রিপশনের পরিবর্তনগুলি পরিচালনা করুন

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

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

আপগ্রেড এবং ডাউনগ্রেড প্রবাহ

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

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

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

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

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

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

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

গুগল প্লে-এর বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

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

সাবস্ক্রিপশন বাতিলকরণ এবং পুনরুদ্ধার

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

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

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

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

গুগল প্লে-এর বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

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

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

পুনঃসাবস্ক্রিপশন

যদি কোনো সাবস্ক্রিপশন সম্পূর্ণরূপে মেয়াদোত্তীর্ণ হয়ে যায়, তা বাতিলের কারণে হোক বা পুনরুদ্ধার ছাড়াই পেমেন্ট প্রত্যাখ্যানের (মেয়াদোত্তীর্ণ অ্যাকাউন্ট হোল্ড) কারণে হোক, তাহলে ব্যবহারকারীকে তার অধিকার পুনরায় চালু করতে চাইলে অবশ্যই পুনরায় সাবস্ক্রাইব করতে হবে।

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

প্রতিক্রিয়া পরিচালনা

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

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

বাহ্যিক অর্থপ্রদানের লিঙ্কগুলি পরীক্ষা করুন

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

পরবর্তী পদক্ষেপ

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