অ্যাপ্লিকেশন বিলিং পরীক্ষা: অ্যান্ড্রয়েড.স্টেস্ট.পুরেস ইতিমধ্যে স্বত্বাধীন


122

আমি বর্তমানে ভবিষ্যতের অ্যাপ্লিকেশনটির জন্য অ্যাপ-অ্যাপ্লিকেশন বিলিংটি পরীক্ষা করছি এবং আমি প্রথমবার "টেস্ট আইটেমটি" অ্যান্ড্রয়েড.টেস্ট.পরিবর্তিতভাবে সাফল্যের সাথে "কেনার পরে, এখন আমি যখনই আবার এটি কেনার চেষ্টা করেছি তখন আমি প্রতিক্রিয়া কোড 7 পেয়েছি, যার অর্থ আমি ইতিমধ্যে এই আইটেমটির মালিক।

12-15 23: 02: 14.149: E / IabHelper (19829): অ্যাপ্লিকেশন বিলিং ত্রুটি: আইটেম কিনতে অক্ষম, ত্রুটির প্রতিক্রিয়া: 7: আইটেম ইতিমধ্যে মালিকানাধীন

আমি যা বুঝতে পেরেছি, এই ক্রয়টি সর্বদা সম্ভব হওয়ার কথা, তাই না? যাতে বিকাশকারী তার অ্যাপটি পরীক্ষা করতে পারে?

যদি তা না হয় তবে আমি কীভাবে এর রাষ্ট্রের মালিকানা না পেয়ে তার "পুনরায় সেট" করব? আমি গুগল ইন-অ্যাপ্লিকেশন বিলিং নমুনা থেকে ব্যবহার প্যাকেজটি ব্যবহার করছি।


1
আমার নিয়োগ vise আয়াত .. আমি ইতিমধ্যে মালিকানা বার্তা প্রয়োজন কিন্তু প্রতিবার এটি কিনতে অনুমতি দেয়
সন্দীপ পি

উত্তর:


109

গ্রাহকের অনুরোধ শুরু করতে এই কোডটি একটি থ্রেডে যুক্ত করুন।

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);

এখানে ক্রয় পরীক্ষার জন্য, শপিং টোকেন

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

এবং

if (response == 0)

তাহলে সেবন সফল হয়।

এছাড়াও এমএস সার্ভিসকে জনসাধারণ করতে ভুলবেন না

IabHelper.Java

তাহলে এর দ্বারা অ্যাক্সেস করা সম্ভব হবে:

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);

2
এই কাজটি কিংবদন্তি করুন, @ সাইকির সত্যই আপনাকে পয়েন্টগুলি দেওয়া উচিত ছিল। আমি এটি গ্রাস করার চেষ্টা করছিলাম কিন্তু ক্রয়ের টোকেনটি কার্যকর করতে পারিনি। ধন্যবাদ
ব্লুন্ডেল

1
ধন্যবাদ! @ প্রশারননেট
Y2i

1
এটি একটি বিশাল সময় সাশ্রয়কারী। পারফেক্ট। ধন্যবাদ।
প্রাইভাসগুরু

13
এম সার্ভিস কি? mHelper? তবে আমি ক্রয়টি ()
বাগসফ্লায়ার

1
এম সার্ভিসআইআইএনপ্লবিলিংসেবা.এইডিএল ইন্টারফেসের অবজেক্ট যা ইনপ্যাপ ক্রয়ের জন্য শুরু করা ক্রয় পরিষেবার সাথে জড়িত।
আশুতোষ শর্মা

92

কোনও বিশেষ গ্রাহক কোড লেখার দরকার নেই। গুগল প্লে স্টোর ডেটা সাফ করার জন্য কেবল অ্যাডবি কমান্ডটি ব্যবহার করুন:

adb shell pm clear com.android.vending

1
ধন্যবাদ এটি কৌশলটি আমাকে কেবল অ্যাপটি সাফ করতে হয়েছিল তাই আমি একটি সম্পূর্ণ উত্তর উপলব্ধ করলাম। এটি আমার পক্ষে সঠিক পন্থা।
sivi

এটি অনেক লোকের জন্য সঠিক পন্থা। আপনার অ্যাপ্লিকেশনটিতে কোড যুক্ত করা এবং পুনরায় প্রচার করা বেশি সময় সাশ্রয়ী (পাং উদ্দেশ্যে)।
মাইকেল ল্যাব é

9
এটি একটি পরীক্ষা ডিভাইসের জন্য একটি ভাল সমাধান, তবে সতর্কতা অবলম্বন করুন: এটি গুগল প্লে স্টোর অ্যাপ্লিকেশনে আপনার সমস্ত সেটিংস পুনরায় সেট করবে। সুতরাং, আমি বরং এটি আমার ব্যক্তিগত ডিভাইসে না করব।
racks ২

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

2
@ রাহুলমন্ডলিয়ায় আপনার অ্যাপ্লিকেশনটি ইতিমধ্যে কী কিনেছে তা জানতে getPurchases () API ব্যবহার করে ক্যাশে ছাড়ার বিরুদ্ধে নমনীয় হওয়া উচিত।
এমটিএমএমলেন্স

66

দেখা যাচ্ছে যে android.test.purchased আইটেমটি নিয়মিত আইডির মতো আচরণ করে। এর অর্থ হ'ল যদি আপনি এটি আবার কিনতে সক্ষম হতে চান তবে আপনার কোডের কোথাও এটি গ্রাস করতে হবে। আমি মনে করি যে গুগল ডকুমেন্টেশনগুলি এই বিষয়ে বিভ্রান্ত করছে, এবং তাদের আরও একটি স্ট্যাটিক আইডি যুক্ত করা উচিত যা আপনি পরীক্ষার উদ্দেশ্যে অবিচ্ছিন্নভাবে কিনতে পারেন।


ক্রয় অবজেক্টটি আনার জন্য ইনভেন্টরি কলটি ব্যবহার করুন এবং তারপরে এটি গ্রাস করুন - আপনি একবার মাথা ঘুরিয়ে ফেললে এটি বেশ সহজ।
স্লট

3
@ এমটিএমটিএমলিন্স থেকে নীচের উত্তরটি দেখুন বা vvse.com/blog/blog/2016/08/26/… পড়ুন
ইগোরগানাপলস্কি

না সম্পূর্ণরূপে সত্য, আমি একটি মামলা যেখানে অনষ্টীকৃত টেস্ট আইটেম আছে, কিন্তু আছে billingClient.queryPurchases()যে অভুক্ত আইটেমটি ফেরত দেয় না, তাই এখন আমি আইটেমটি গ্রাস করতে পারবেন না কারণ আমি না পেতে পারেন purchaseTokenএটি
Jemshit Iskenderov

28

অ্যাপ্লিকেশন সংস্করণ 3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        .....................

        if (inventory.hasPurchase(SKU_CONTENT)) {

            mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
        }
    }
};

যেহেতু ছবিটির মূল্য হাজার শব্দের, একটি সম্পূর্ণ ওয়ার্কিং বেয়ার হাড় কোড টুকরা হাজারের মূল্যবান 'এই কোডটি একটি থ্রেডে যুক্ত করুন। । । '।
এন্ড্রয়েডকোডার

11

সংস্করণ 3 - সমাধানের দ্রুততম উপায় : গুগল প্লে স্টোরের ক্যাশে সাফ করার ফলে "android.test.purchased" আবার পাওয়া যাবে।


এটি কি সিস্টেমে ইনস্টল হওয়া অন্যান্য অ্যাপ্লিকেশনগুলিকেও প্রভাবিত করবে না?
ইগোরগানাপলস্কি

1
@ ইগরগানাপলস্কি, না। কেবল সিমুলেটেড কেনাকাটাগুলি প্রভাবিত হবে। "আসল" পুকাসগুলি গুগলের সার্ভারে সঞ্চিত রয়েছে এবং এটি সংশোধিত হবে না।
ডেনিস

1
আমি গুগল প্লে অ্যাপ্লিকেশন ডেটা সাফ করেছি কিন্তু এটি কার্যকর হয়নি। পরীক্ষার ক্রয়ের বিশদ এখনও বিদ্যমান।
শ্রীকর রেড্ডি

2
@ রিচার্ড "সেটিংস / অ্যাপ্লিকেশন পরিচালক /" এর মাধ্যমে বা মেনু থেকে "তথ্য" বোতামে (স্ক্রিনের শীর্ষে) গুগল প্লে স্টোর আইকনটিকে টেনে আনুন। অবশেষে, কেবল "সাফ ক্যাশে" বোতামটি ক্লিক করুন।
ডেনিস

1
আমার জন্য সেরা উত্তর। অন্য সমস্ত ভাল, তবে এটি অবশ্যই সমাধানের দ্রুততম উপায়
Ignacio Roda


9

এইভাবে আমরা আইটেমটি গ্রাস করতে পারি

 consume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
                    try {
                        Log.d("","Running");
                        int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
                        if(response==0)
                        {
                            Log.d("Consumed","Consumed");
                        }else {
                            Log.d("","No"+response);
                        }
                    }catch (RemoteException e)
                    {
                        Log.d("Errorr",""+e);
                    }

                }
            });
            t.start();
        }
    });

আমার জন্য কাজ করেছেন - এমন এক android.test.purchaseসময়ে এটি ব্যবহার করেছিল যা সমস্যার কারণ হয়ে দাঁড়িয়েছিল - অ্যাপ্লিকেশন বিলিংয়ের ইনভেন্টরি টাস্কটি কেবলমাত্র ত্রুটির একটি বোঝা ফেলে দিয়েছে এবং কখনই শেষ হয়নি finished এটি এক-অফ হিসাবে চালানো এটিকে সাফ করেছে যাতে আমি আমার সত্যিকারের এসকিউতে আমার ব্যবহার শুরু করতে পারি এবং আমার আগের মতো চালিয়ে যেতে পারি। ধন্যবাদ
জন

1
দুর্দান্ত উত্তর। স্ট্যাটিক রেসপন্স সহ কাজ করে = অ্যাপ-এর মধ্যে বিলিং সক্ষম হওয়া অ্যাপকে গুগল প্লেতে আপলোড করার আগে।
ইনফেরো

ধন্যবাদ! আমার জন্য কাজ করেছেন।
অ্যান্ড্রয়েডমেচনিক - ভাইরাস প্যাটেল

6

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

Android.test.purchased সাফ করার জন্য আমার পক্ষে সবচেয়ে ভাল সমাধানটি কাজ করেছিল

adb uninstall com.yourapp.name

এবং তারপর

adb shell pm clear com.android.vending

নগদ সাফ করার জন্য এবং আমার অ্যাপ্লিকেশন সেটিংটি ব্রাউজ করার জন্য বা তার জন্য কোড পরিবর্তন করার দরকার নেই। আমার উইন্ডোজ সিস্টেমের পাথ ভেরিয়েবলগুলিতে অ্যাডবি যুক্ত করার দরকার ছিল যা বেশ সোজা ছিল। সুতরাং হ্যাঁ আপনার অ্যাডাব ব্যবহার করা দরকার যা আপনার সম্ভবত যেভাবে প্রয়োজন ..

আপনি কেবল আপনার সি যুক্ত করুন: \ ... \ android-sdk \ প্ল্যাটফর্ম-সরঞ্জামসমূহ; উইন্ডোজ পাথ এনভায়রনমেন্ট ভেরিয়েবলগুলিতে, এবং আমি কল্পনা করি যে এটি ম্যাক এবং লিনাক্স ওএসেও বেশ সহজ। আশা করি এটি অ্যাপের বিলিংগুলিতে অ্যান্ড্রয়েড বাস্তবায়নে কাউকে কয়েক দিন কম ব্যয় করতে সহায়তা করবে।


uninstallandroid.test.purchased স্কুকে সাফ করার দরকার নেই ।
ইগোরগানাপলস্কি 16

4

মূল বিষয়টি হ'ল আপনাকে android.test.purchasedআইটেমটি গ্রাস করতে হবে । তবে এই আইটেমটি আপনার ক্যোয়ারী ইনভেন্টরিতে উপলব্ধ হবে না, তাই আপনি সাধারণ প্রবাহ ব্যবহার করে গ্রাস করতে পারবেন না।

সুতরাং, আপনি যদি IabHelperক্লাসে IabHelper ব্যবহার করে থাকেন তবে আপনি অস্থায়ীভাবে এমসোর্সিকে IInAppBillingServiceসর্বজনীনতে পরিবর্তন করতে পারেন যাতে এটি আপনার আইএবহেল্পার থেকে অ্যাক্সেসযোগ্য হয়।

তারপরে আপনার ক্লাসে আপনি এই জাতীয় গ্রাস করতে পারেন,

int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");

সাফল্য, প্রতিক্রিয়া 0 হতে যাচ্ছে।

আশাকরি এটা সাহায্য করবে.


স্পর্শকাতর: আপনি একটি পরিচালিত আইটেমের (একটি পরীক্ষার অ্যাকাউন্ট সহ - এটি ড্যাশবোর্ডে প্রদর্শিত হবে বলে মনে হচ্ছে না) ফেরত জারি করতে পারেন?
এড লি

আপনি কল করতে পারেন consumeAsync()উপর android.test.purchased । এটি নিয়ে কোনও সমস্যা নেই।
ইগোরগানাপলস্কি 16

IabHelper ব্যবহার করা সহজ পরীক্ষার জন্য এটি সেরা উপায়। আমাকে সাহায্য করে ছিল.
রেবেন

2

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

PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);

2

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


1

আপনি যদি পরীক্ষার পরিবেশে থাকেন

1) android.test.purchased ক্ষেত্রে, আমি অ্যান্ড্রয়েড ডিভাইস পুনঃসূচনা করে জাল অর্থ প্রদান পুনরায় সেট করতে পারি (ইনভেন্টরিটি গ্রাস করে)।

2) ইনএপ ব্যবহারে সুরক্ষা.জাভা নামে একটি ফাইল রয়েছে যা অস্থায়ীভাবে নিম্নলিখিত হিসাবে তৈরি করে। যেহেতু পরীক্ষার অর্থ প্রদান (জাল) সুরক্ষা ব্যতিক্রমের কারণে সর্বদা মিথ্যা প্রত্যাবর্তন করে।

public static boolean verifyPurchase(String base64PublicKey,
                                     String signedData, String signature) {
    return true; }

তারপরে আপনার অনিয়বপ্যারেচফিনিশডলাইজনারে কল করুন fechInvforconsumeItem ()

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                Log.e("123","Failure");

                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                Log.e("123","PURCAsed");
                fechInvForconsumeItem(); // Restart device if not consume

            }

        }
    };

FechInvforconsumeItem ()

    public void fechInvForconsumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {


        if (result.isFailure()) {
            // Handle failure
            Log.e("11","Failure");



        } else {
            Log.e("11","suc");
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                    mConsumeFinishedListener);
        }


    }
};

গ্রাহক শ্রোতা হয়

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };

0
IabHelper.QueryInventoryFinishedListener 
       mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
       public void onQueryInventoryFinished(IabResult result, Inventory inventory)   
       {
          if (result.isFailure()) {
             return;
           }          
          try {

                if(inventory.hasPurchase("product_sku_id"))
                {   
                     isItemEnable= true;
                     mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null);            
                }
                else
                {
                       isItemEnable = false;
                }           

            } catch (Exception e) {
                e.printStackTrace();
            }
       }

    };

-1

আমার ক্ষেত্রে এটি প্রদর্শিত হয় যে গুগল আইটেমটির জন্য কোনও কেনাকাটা রেকর্ড করে না। বরং গুগল প্লে পরিষেবাগুলির স্থানীয় অনুলিপি ক্রয়কে ক্যাশে করে। এইভাবে, যখন একই ডিভাইসে দ্বিতীয় অনুরোধ করা হয়, android.test.purchased already ownedউপস্থিত হয়। তবে, অন্য ডিভাইস ব্যবহার করা বা ডিভাইসটি পুনরায় সেট করা ক্যাশে সাফ করে এবং ক্রয়ের পুনরাবৃত্তি করার অনুমতি দেয়।


-1

আমার ক্ষেত্রে, আমার কেবল অ্যাপ্লিকেশন ক্যাশে সাফ করা দরকার। ক্যাশে সাফ করার পরে, আমি আবার ক্রয়ের প্রবাহ শুরু করতে সক্ষম হয়েছি।

আমার ডিভাইস (৪.৪.২) থেকে আমি "সেটিংস-> অ্যাপ্লিকেশন পরিচালক" এ নেভিগেট করেছি। এরপরে, আমি "ডাউনলোড" ট্যাব থেকে অ্যাপটি নির্বাচন করেছি এবং তারপরে "ক্যাশে সাফ করুন"।


-2

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


1
তবে কথাটি হ'ল এই "নকল" আইটেমগুলিতে আমার কোনও "শক্তি" নেই এবং আমি দেখছি না কোথায় আমি বিক্রয়ের স্থিতি পরিবর্তন করতে পারি, কারণ সেগুলি প্রকৃত কেনাকাটা নয়। Google ডক বলেছেন সম্পর্কে android.test.purchased: যখন আপনি এই পণ্য আইডি সহ একটি অ্যাপ-মধ্যস্থ বিলিং অনুরোধ করতে, Google Play তে সাড়া যেন আপনি সফলভাবে একটি আইটেম কিনে নেন। তাই আমি বেশ বিভ্রান্ত: /
সাইকী

আপনি কি স্থির প্রতিক্রিয়া পরীক্ষা এখনও করছেন? যদি তা হয় তবে আপনার স্ট্যাটিক প্রতিক্রিয়া কী প্রেরিত হবে তা কেবল পরিবর্তন করতে হবে। দেখে মনে হচ্ছে আপনি "আপনার নিজের পণ্য আইডি ব্যবহার করে অ্যাপ্লিকেশন ক্রয়গুলি পরীক্ষা করে নিচ্ছেন", যা বাতিল করার আদেশের সাথে প্রকৃত ক্রয় করে।
addaon

আমি এখনও স্থির আইডি আটকে আছি। আমি যা চাই তা হ'ল android.test.purchased আইডি দিয়ে একটি অ্যাপ্লিকেশন কেনার পরীক্ষা করতে সক্ষম হোন। এটি ঠিক প্রথমবার কাজ করেছিল যখন আমি Google ডক থেকে যা বুঝি সে থেকে সবসময় কাজ করা উচিত। আমি স্পষ্ট না হলে দুঃখিত!
psykhi

আমার ভুল ব্যাখ্যা, দুঃখিত। সেক্ষেত্রে ... আমি জানি না। এটি অবশ্যই প্রতিবার সাফল্য ফিরে পাওয়ার কথা, আপনি যে কেসটি দেখছেন তা আমি দেখিনি। দুঃখিত।
addaon

ভাল রাত্রে ঘুমানোর পরে সমস্যাটি আবার দেখার চেষ্টা করবে :) আপনার সহায়তার জন্য ধন্যবাদ!
psykhi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.