Play Billing-এ পণ্য ক্রয়ের ড্রপ-অফ বিশ্লেষণ করুন

১. ভূমিকা

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

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

দর্শক

এই কোডল্যাবটি সেইসব অ্যান্ড্রয়েড অ্যাপ ডেভেলপারদের জন্য তৈরি করা হয়েছে, যারা প্লে বিলিং লাইব্রেরি (PBL) ব্যবহার করছেন অথবা তাদের ওয়ান-টাইম প্রোডাক্টগুলো থেকে আয় করার জন্য PBL ব্যবহার করতে চান।

আপনি যা শিখবেন...

  • গুগল প্লে কনসোলে কীভাবে ওয়ান-টাইম প্রোডাক্ট তৈরি করবেন।
  • আপনার অ্যাপকে PBL-এর সাথে কীভাবে সংযুক্ত করবেন।
  • PBL-এ ব্যবহারযোগ্য এবং ব্যবহার-অযোগ্য এককালীন পণ্যের ক্রয় কীভাবে প্রক্রিয়া করবেন
  • ক্রয় কমে যাওয়ার কারণ কীভাবে বিশ্লেষণ করবেন।

আপনার যা যা লাগবে...

২. নমুনা অ্যাপটি তৈরি করুন

নমুনা অ্যাপটি একটি সম্পূর্ণ কার্যকরী অ্যান্ড্রয়েড অ্যাপ হিসেবে ডিজাইন করা হয়েছে, যার সম্পূর্ণ সোর্স কোড রয়েছে এবং যা নিম্নলিখিত দিকগুলো প্রদর্শন করে:

  • PBL-এর সাথে অ্যাপটি একীভূত করুন
  • এককালীন পণ্যগুলি আনুন
  • এককালীন পণ্যগুলির জন্য ক্রয় প্রক্রিয়া চালু করুন
  • ক্রয়ের এমন পরিস্থিতি যার ফলে নিম্নলিখিত বিলিং প্রতিক্রিয়াগুলি দেখা যায়:
    • BILLING_UNAVAILABLE
    • USER_CANCELLED
    • OK
    • ITEM_ALREADY_OWNED

নিম্নলিখিত ডেমো ভিডিওটিতে দেখানো হয়েছে যে, নমুনা অ্যাপটি ডেপ্লয় এবং রান করার পর দেখতে কেমন হবে ও এর আচরণ কেমন হবে।

পূর্বশর্ত

স্যাম্পল অ্যাপটি বিল্ড এবং ডিপ্লয় করার আগে, নিম্নলিখিত কাজগুলো করুন:

নির্মাণ করুন

এই বিল্ড ধাপটির উদ্দেশ্য হলো নমুনা অ্যাপটির একটি স্বাক্ষরিত অ্যান্ড্রয়েড অ্যাপ বান্ডেল ফাইল তৈরি করা।

অ্যান্ড্রয়েড অ্যাপ বান্ডেল তৈরি করতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. গিটহাব থেকে নমুনা অ্যাপটি ডাউনলোড করুন।
  2. স্যাম্পল অ্যাপটি বিল্ড করুন । বিল্ড করার আগে, স্যাম্পল অ্যাপটির প্যাকেজ নামটি পরিবর্তন করুন এবং তারপর বিল্ড করুন। আপনার প্লে কনসোলে যদি অন্য অ্যাপের প্যাকেজ থাকে, তবে স্যাম্পল অ্যাপটির জন্য দেওয়া প্যাকেজ নামটি যেন অনন্য হয়, তা নিশ্চিত করুন।

    দ্রষ্টব্য : স্যাম্পল অ্যাপটি বিল্ড করলে শুধুমাত্র একটি APK ফাইল তৈরি হয় যা আপনি লোকাল টেস্টিংয়ের জন্য ব্যবহার করতে পারেন। তবে, অ্যাপটি রান করলে প্রোডাক্ট এবং দাম পাওয়া যায় না, কারণ প্রোডাক্টগুলো প্লে কনসোলে কনফিগার করা হয়নি, যা আপনি এই কোডল্যাবের পরবর্তী অংশে করবেন।
  3. একটি স্বাক্ষরিত অ্যান্ড্রয়েড অ্যাপ বান্ডেল তৈরি করুন।
    1. একটি আপলোড কী এবং কীস্টোর তৈরি করুন
    2. আপনার আপলোড কী দিয়ে আপনার অ্যাপটি সাইন করুন।
    3. প্লে অ্যাপ সাইনিং কনফিগার করুন

পরবর্তী ধাপ হলো অ্যান্ড্রয়েড অ্যাপ বান্ডেলটি গুগল প্লে কনসোলে আপলোড করা।

৩. প্লে কনসোলে এককালীন পণ্য তৈরি করুন

গুগল প্লে কনসোলে ওয়ান-টাইম প্রোডাক্ট তৈরি করতে হলে, প্লে কনসোলে আপনার একটি অ্যাপ থাকতে হবে। প্লে কনসোলে একটি অ্যাপ তৈরি করুন এবং তারপরে পূর্বে তৈরি করা সাইনড অ্যাপ বান্ডেলটি আপলোড করুন।

একটি অ্যাপ তৈরি করুন

একটি অ্যাপ তৈরি করতে:

  1. আপনার ডেভেলপার অ্যাকাউন্ট ব্যবহার করে গুগল প্লে কনসোলে লগ-ইন করুন।
  2. 'Create app'-এ ক্লিক করুন। এটি 'Create app' পেজটি খুলে দেবে।
  3. একটি অ্যাপের নাম লিখুন, ডিফল্ট ভাষা নির্বাচন করুন এবং অ্যাপ সম্পর্কিত অন্যান্য বিবরণ দিন।
  4. 'Create app'-এ ক্লিক করুন। এটি গুগল প্লে কনসোলে একটি অ্যাপ তৈরি করবে।

এখন আপনি নমুনা অ্যাপটির স্বাক্ষরিত অ্যাপ বান্ডেলটি আপলোড করতে পারবেন।

স্বাক্ষরিত অ্যাপ বান্ডেল আপলোড করুন

  1. স্বাক্ষরিত অ্যাপ বান্ডেলটি গুগল প্লে-এর কনসোল অভ্যন্তরীণ টেস্ট ট্র্যাকে আপলোড করুন । আপলোড করার পরেই আপনি প্লে কনসোলে মনিটাইজেশন সম্পর্কিত ফিচারগুলো কনফিগার করতে পারবেন।
  2. টেস্ট এবং রিলিজ > টেস্টিং > ইন্টারনাল রিলিজ > নতুন রিলিজ তৈরি করুন-এ ক্লিক করুন।
  3. একটি রিলিজের নাম লিখুন এবং স্বাক্ষরিত অ্যাপ বান্ডেল ফাইলটি আপলোড করুন।
  4. Next-এ ক্লিক করুন, এবং তারপর Save and publish-এ ক্লিক করুন।

এখন, আপনি আপনার এককালীন পণ্যগুলো তৈরি করতে পারবেন।

এককালীন পণ্য তৈরি করুন

এককালীন পণ্য তৈরি করতে:

  1. গুগল প্লে কনসোলে , বাম দিকের নেভিগেশন মেনু থেকে, Monetize with Play > Products > One-time products- এ যান।
  2. এককালীন পণ্য তৈরি করুন-এ ক্লিক করুন।
  3. নিম্নলিখিত পণ্যের বিবরণ লিখুন:
    • প্রোডাক্ট আইডি: একটি অনন্য প্রোডাক্ট আইডি দিন। one_time_product_01 লিখুন।
    • (ঐচ্ছিক) ট্যাগ: প্রাসঙ্গিক ট্যাগ যোগ করুন।
    • নাম: একটি পণ্যের নাম লিখুন। উদাহরণস্বরূপ, Product name
    • বিবরণ: পণ্যের একটি বিবরণ লিখুন। উদাহরণস্বরূপ, Product description
    • (ঐচ্ছিক) একটি আইকন ছবি যোগ করুন: আপনার পণ্যের প্রতিনিধিত্বকারী একটি আইকন আপলোড করুন।
    দ্রষ্টব্য: এই কোডল্যাবের জন্য, আপনি ট্যাক্স, কমপ্লায়েন্স এবং প্রোগ্রাম বিভাগটি কনফিগার করা বাদ দিতে পারেন।
  4. পরবর্তী ধাপে যান।
  5. একটি ক্রয় বিকল্প যোগ করুন এবং এর আঞ্চলিক প্রাপ্যতা কনফিগার করুন। একটি ওয়ান-টাইম পণ্যের জন্য অন্তত একটি ক্রয় বিকল্প প্রয়োজন, যা নির্ধারণ করে কীভাবে অধিকার প্রদান করা হবে, এর মূল্য এবং আঞ্চলিক প্রাপ্যতা। এই কোডল্যাবের জন্য, আমরা পণ্যটির জন্য স্ট্যান্ডার্ড 'কিনুন' ( Buy ) বিকল্পটি যোগ করব। 'ক্রয় বিকল্প' (Purchase option) বিভাগে, নিম্নলিখিত বিবরণগুলি লিখুন:
    • ক্রয় বিকল্প আইডি: একটি ক্রয় বিকল্প আইডি লিখুন। উদাহরণস্বরূপ, buy
    • ক্রয়ের ধরণ: কিনুন নির্বাচন করুন।
    • (ঐচ্ছিক) ট্যাগ: এই ক্রয় বিকল্পটির জন্য নির্দিষ্ট ট্যাগ যোগ করুন।
    • (ঐচ্ছিক) উন্নত বিকল্পগুলো কনফিগার করতে 'Advanced options'-এ ক্লিক করুন। এই কোডল্যাবের জন্য, আপনি উন্নত বিকল্পগুলোর কনফিগারেশন এড়িয়ে যেতে পারেন।
  6. প্রাপ্যতা এবং মূল্য নির্ধারণ বিভাগে, মূল্য নির্ধারণ করুন > একসাথে মূল্য সম্পাদনা করুন- এ ক্লিক করুন।
  7. দেশ / অঞ্চল বিকল্পটি নির্বাচন করুন। এটি সমস্ত অঞ্চল নির্বাচন করে।
  8. 'চালিয়ে যান' -এ ক্লিক করুন। এতে মূল্য লেখার জন্য একটি ডায়ালগ বক্স খুলবে। ১০ ইউএসডি লিখে 'প্রয়োগ করুন'- এ ক্লিক করুন।
  9. সেভ-এ ক্লিক করুন এবং তারপর অ্যাক্টিভেট-এ ক্লিক করুন। এটি ক্রয়ের বিকল্পটি তৈরি ও সক্রিয় করে।

এই কোডল্যাবের উদ্দেশ্যে, নিম্নলিখিত প্রোডাক্ট আইডিগুলো ব্যবহার করে আরও ৩টি এককালীন প্রোডাক্ট তৈরি করুন:

  • ভোগ্যপণ্য_০১
  • ভোগ্যপণ্য_০২
  • ভোগ্যপণ্য_০৩

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

গুগল প্লে কনসোলে নমুনা অ্যাপটি খুলুন এবং Monetize with Play > Products > One-time products-এ যান। তারপর Create one-time product-এ ক্লিক করুন এবং ৩ থেকে ৯ নম্বর ধাপগুলো পুনরাবৃত্তি করুন।

এককালীন পণ্য তৈরির ভিডিও

নিম্নলিখিত নমুনা ভিডিওটিতে পূর্বে বর্ণিত এককালীন পণ্য তৈরির ধাপগুলো দেখানো হয়েছে।

৪. পিবিএল-এর সাথে একীভূত করুন

এখন আমরা দেখব কিভাবে আপনার অ্যাপকে প্লে বিলিং লাইব্রেরি (PBL)- এর সাথে ইন্টিগ্রেট করতে হয়। এই অংশে ইন্টিগ্রেশনের প্রধান ধাপগুলো বর্ণনা করা হয়েছে এবং প্রতিটি ধাপের জন্য একটি করে কোড স্নিপেট দেওয়া হয়েছে। আপনার প্রকৃত ইন্টিগ্রেশন বাস্তবায়নের জন্য আপনি এই স্নিপেটগুলোকে নির্দেশিকা হিসেবে ব্যবহার করতে পারেন।

আপনার অ্যাপকে PBL-এর সাথে সংযুক্ত করতে, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. স্যাম্পল অ্যাপটিতে প্লে বিলিং লাইব্রেরি ডিপেন্ডেন্সিটি যোগ করুন।
    dependencies {
    val billing_version = "8.0.0"
    
    implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. BillingClient ইনিশিয়ালাইজ করুন। BillingClient হলো ক্লায়েন্ট SDK যা আপনার অ্যাপে থাকে এবং প্লে বিলিং লাইব্রেরির সাথে যোগাযোগ করে। নিচের কোড স্নিপেটটিতে দেখানো হয়েছে কীভাবে বিলিং ক্লায়েন্ট ইনিশিয়ালাইজ করতে হয়।
    protected BillingClient createBillingClient() {
    return BillingClient.newBuilder(activity)
        .setListener(purchasesUpdatedListener)
        .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
        .enableAutoServiceReconnection()
        .build();
    }
    
  3. গুগল প্লে-এর সাথে সংযোগ করুন। নিচের কোড স্নিপেটটি দেখায় কিভাবে গুগল প্লে-এর সাথে সংযোগ করতে হয়।
    public void startBillingConnection(ImmutableList<Product> productList) {
    Log.i(TAG, "Product list sent: " + productList);
    Log.i(TAG, "Starting connection");
    billingClient.startConnection(
        new BillingClientStateListener() {
          @Override
          public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
              // Query product details to get the product details list.
              queryProductDetails(productList);
            } else {
              // BillingClient.enableAutoServiceReconnection() will retry the connection on
              // transient errors automatically.
              // We don't need to retry on terminal errors (e.g., BILLING_UNAVAILABLE,
              // DEVELOPER_ERROR).
              Log.e(TAG, "Billing connection failed: " + billingResult.getDebugMessage());
              Log.e(TAG, "Billing response code: " + billingResult.getResponseCode());
            }
          }
    
          @Override
          public void onBillingServiceDisconnected() {
            Log.e(TAG, "Billing Service connection lost.");
          }
        });
    }
    
  4. এককালীন পণ্যের বিবরণ সংগ্রহ করুন। PBL-এর সাথে আপনার অ্যাপ ইন্টিগ্রেট করার পর, আপনাকে অবশ্যই আপনার অ্যাপে এককালীন পণ্যের বিবরণ সংগ্রহ করতে হবে। নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে আপনার অ্যাপে এককালীন পণ্যের বিবরণ সংগ্রহ করতে হয়।
    private void queryProductDetails(ImmutableList<Product> productList) {
    Log.i(TAG, "Querying products for: " + productList);
    QueryProductDetailsParams queryProductDetailsParams =
        QueryProductDetailsParams.newBuilder().setProductList(productList).build();
    billingClient.queryProductDetailsAsync(
        queryProductDetailsParams,
        new ProductDetailsResponseListener() {
          @Override
          public void onProductDetailsResponse(
              BillingResult billingResult, QueryProductDetailsResult productDetailsResponse) {
            // check billingResult
            Log.i(TAG, "Billing result after querying: " + billingResult.getResponseCode());
            // process returned productDetailsList
            Log.i(
                TAG,
                "Print unfetched products: " + productDetailsResponse.getUnfetchedProductList());
            setupProductDetailsMap(productDetailsResponse.getProductDetailsList());
            billingServiceClientListener.onProductDetailsFetched(productDetailsMap);
          }
        });
    }
    
    ProductDetails ফেচ করলে, আপনি নিম্নলিখিতের অনুরূপ একটি প্রতিক্রিয়া পাবেন:
    {
        "productId": "consumable_product_01",
        "type": "inapp",
        "title": "Shadow Coat (Yolo's Realm | Play Samples)",
        "name": "Shadow Coat",
        "description": "A sleek, obsidian coat for stealth and ambushes",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 1990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$1.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    },
    {
        "productId": "consumable_product_02",
        "type": "inapp",
        "title": "Emperor Den (Yolo's Realm | Play Samples)",
        "name": "Emperor Den",
        "description": "A fair lair glowing with molten rock and embers",
        "skuDetailsToken": "<---skuDetailsToken--->",
        "oneTimePurchaseOfferDetails": {},
        "oneTimePurchaseOfferDetailsList": [
            {
                "priceAmountMicros": 2990000,
                "priceCurrencyCode": "USD",
                "formattedPrice": "$2.99",
                "offerIdToken": "<--offerIdToken-->",
                "purchaseOptionId": "buy",
                "offerTags": []
            }
        ]
    }
    
  5. বিলিং প্রক্রিয়াটি চালু করুন।
    public void launchBillingFlow(String productId) {
    ProductDetails productDetails = productDetailsMap.get(productId);
    if (productDetails == null) {
      Log.e(
          TAG, "Cannot launch billing flow: ProductDetails not found for productId: " + productId);
      billingServiceClientListener.onBillingResponse(
          BillingResponseCode.ITEM_UNAVAILABLE,
          BillingResult.newBuilder().setResponseCode(BillingResponseCode.ITEM_UNAVAILABLE).build());
      return;
    }
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder().setProductDetails(productDetails).build());
    
    BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(productDetailsParamsList)
            .build();
    
    billingClient.launchBillingFlow(activity, billingFlowParams);
    }
    
  6. ক্রয় শনাক্ত ও প্রক্রিয়া করুন। এই ধাপের অংশ হিসেবে, আপনাকে যা করতে হবে তা হলো:
    1. ক্রয় যাচাই করুন
    2. ব্যবহারকারীকে অধিকার প্রদান করুন
    3. ব্যবহারকারীকে অবহিত করুন
    4. ক্রয় প্রক্রিয়া সম্পর্কে গুগলকে অবহিত করুন
    এগুলোর মধ্যে, ক, খ, এবং গ ধাপগুলো আপনার ব্যাকএন্ডে করা উচিত, এবং তাই এই কোডল্যাবের আওতার বাইরে। নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে একটি ব্যবহারযোগ্য এককালীন পণ্যের জন্য গুগলকে অবহিত করতে হয়:
    private void handlePurchase(Purchase purchase) {
    // Step 1: Send the purchase to your secure backend to verify the purchase following
    // https://developer.android.com/google/play/billing/security#verify
    
    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.
    
    // Step 3: Notify the user using appropriate messaging.
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
      for (String product : purchase.getProducts()) {
        Log.d(TAG, product + " purchased successfully! ");
      }
    }
    
    // Step 4: Notify Google the purchase was processed.
    // For one-time products, acknowledge the purchase.
    // This sample app (client-only) uses billingClient.acknowledgePurchase().
    // For consumable one-time products, consume the purchase
    // This sample app (client-only) uses billingClient.consumeAsync()
    // If you have a secure backend, you must acknowledge purchases on your server using the
    // server-side API.
    // See https://developer.android.com/google/play/billing/security#acknowledge
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED && !purchase.isAcknowledged()) {
    
      if (shouldConsume(purchase)) {
        ConsumeParams consumeParams =
            ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();
        billingClient.consumeAsync(consumeParams, consumeResponseListener);
    
      } else {
        AcknowledgePurchaseParams acknowledgePurchaseParams =
            AcknowledgePurchaseParams.newBuilder()
                .setPurchaseToken(purchase.getPurchaseToken())
                .build();
        billingClient.acknowledgePurchase(
            acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
      }
     }
    }
    

৫. ক্রয় হ্রাসের বিশ্লেষণ করুন

কোডল্যাবে এখন পর্যন্ত, প্লে বিলিং-এর প্রতিক্রিয়াগুলো USER_CANCELLED , BILLING_UNAVAILABLE , OK , এবং ITEM_ALREADY_OWNED- এর মতো সীমিত কিছু পরিস্থিতির উপরই আলোকপাত করেছে। তবে, প্লে বিলিং ১৩টি ভিন্ন প্রতিক্রিয়া কোড ফেরত দিতে পারে, যেগুলো বিভিন্ন বাস্তব-জগতের কারণ দ্বারা সক্রিয় হতে পারে।

এই বিভাগে USER_CANCELLED এবং BILLING_UNAVAILABLE ত্রুটি প্রতিক্রিয়ার কারণগুলো বিশদভাবে আলোচনা করা হয়েছে এবং আপনি বাস্তবায়ন করতে পারেন এমন সম্ভাব্য প্রতিকারমূলক পদক্ষেপের পরামর্শ দেওয়া হয়েছে।

USER_CANCELED প্রতিক্রিয়া ত্রুটি কোড

এই রেসপন্স কোডটি নির্দেশ করে যে, ব্যবহারকারী ক্রয় সম্পন্ন করার আগেই পারচেজ ফ্লো UI ত্যাগ করেছেন।

সম্ভাব্য কারণ

আপনি কী কী পদক্ষেপ নিতে পারেন?

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

বিলিং_অনুপলব্ধ প্রতিক্রিয়া ত্রুটি কোড

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

সম্ভাব্য কারণ

আপনি কী কী পদক্ষেপ নিতে পারেন?

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

    ব্যবহারকারী সেশনে না থাকা অবস্থায় যদি আপনি এই রেসপন্স কোডটি পান, তবে পুনরায় চেষ্টা করার কোনো মানে হয় না। যখন আপনি ক্রয় প্রক্রিয়ার ফলস্বরূপ একটি `BILLING_UNAVAILABLE` রেসপন্স পান, তখন খুব সম্ভবত ব্যবহারকারী ক্রয় প্রক্রিয়া চলাকালীন গুগল প্লে থেকে ফিডব্যাক পেয়েছেন এবং কী ভুল হয়েছে সে সম্পর্কে অবগত থাকতে পারেন। এই ক্ষেত্রে, আপনি একটি এরর মেসেজ দেখাতে পারেন যেখানে উল্লেখ থাকবে যে কিছু একটা ভুল হয়েছে এবং একটি `Try again` বাটন রাখতে পারেন, যাতে ব্যবহারকারী সমস্যাটি সমাধান করার পর ম্যানুয়ালি পুনরায় চেষ্টা করার সুযোগ পান।

প্রতিক্রিয়া ত্রুটি কোডগুলির জন্য পুনরায় চেষ্টা করার কৌশল

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

ব্যবহারকারী যখন সেশনে থাকেন , তখন কোনো ত্রুটির ক্ষেত্রে ব্যবহারকারীর অভিজ্ঞতায় ব্যাঘাত কমাতে একটি নির্দিষ্ট সর্বোচ্চ সংখ্যক প্রচেষ্টাসহ একটি সাধারণ পুনঃপ্রচেষ্টা কৌশল অবলম্বন করা বাঞ্ছনীয়। অপরদিকে, নতুন কেনাকাটা স্বীকার করার মতো ব্যাকগ্রাউন্ড অপারেশনগুলির জন্য, যেগুলোর তাৎক্ষণিক সম্পাদনের প্রয়োজন হয় না, এক্সপোনেনশিয়াল ব্যাকঅফ হলো প্রস্তাবিত পদ্ধতি।

নির্দিষ্ট রেসপন্স কোড এবং সেগুলোর জন্য প্রস্তাবিত পুনঃপ্রচেষ্টা কৌশল সম্পর্কে বিস্তারিত তথ্যের জন্য, “Handle BillingResult response codes” দেখুন।

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

রেফারেন্স নথি

৭. অভিনন্দন!

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

জরিপ

এই কোডল্যাব সম্পর্কে আপনার মতামত অত্যন্ত মূল্যবান। অনুগ্রহ করে কয়েক মিনিট সময় নিয়ে আমাদের সমীক্ষাটি পূরণ করুন।