इन-ऐप बिलिंग परीक्षण: android.test.purchased पहले से ही स्वामित्व में है


122

मैं वर्तमान में भविष्य के ऐप के लिए इन-ऐप बिलिंग का परीक्षण कर रहा हूं, और पहली बार मैंने सफलतापूर्वक "परीक्षण आइटम" android.test.purchased "खरीदा" के बाद, मुझे अब हर बार जब भी मैं इसे खरीदने की कोशिश करता हूं, तो मुझे प्रतिक्रिया कोड 7 प्राप्त होता है। जिसका मतलब है कि मैं पहले से ही इस आइटम का मालिक हूं।

12-15 23: 02: 14.149: E / IabHelper (19829): इन-ऐप बिलिंग त्रुटि: आइटम खरीदने में असमर्थ, त्रुटि प्रतिक्रिया: 7: आइटम पहले से ही स्वामित्व में है

जो मैं समझता हूं, यह खरीद हमेशा संभव है, है ना? ताकि डेवलपर अपने ऐप का परीक्षण कर सके?

यदि नहीं, तो मैं अपने राज्य को स्वामित्व में नहीं करने के लिए "रीसेट" कैसे कर सकता हूं? मैं Google इन-ऐप बिलिंग नमूना से उपयोग पैकेज का उपयोग कर रहा हूं।


1
मेरी भर्ती vise छंद है .. मैं पहले से ही स्वामित्व वाले संदेश की जरूरत है, लेकिन हर बार खरीदने की अनुमति
संदीप पी

जवाबों:


109

उपभोग अनुरोध आरंभ करने के लिए इस कोड को एक सूत्र में जोड़ें।

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

यहाँ खरीद परीक्षण के लिए, PurchaseToken है

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

तथा

if (response == 0)

तब खपत सफल होती है।

mService को भी सार्वजनिक करना न भूलें

IabHelper.Java

तब इस तरह से पहुंचना संभव होगा:

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

2
किंवदंती यह काम करता है, @psykhi को वास्तव में आपको अंक देने चाहिए। मैं इसे उपभोग करने की कोशिश कर रहा था, लेकिन खरीद टोकन का काम नहीं कर सका। धन्यवाद
ब्लंडेल

1
धन्यवाद! @prharharonnet
Y2i

1
यह बहुत बड़ा समय बचाने वाला है। उत्तम। धन्यवाद।
प्रिविसगुरु 19

13
MService क्या है? mHelper? लेकिन मैं उपभोग्यपुर्से नहीं पा सकता ()
Bagusflyer

1
mService IInAppBillingService.aidl इंटरफ़ेस की वस्तु है जिसे अनुचित खरीद के लिए शुरू की गई खरीद सेवा के साथ बांधा गया है।
आशुतोष शर्मा

92

कोई विशेष खपत कोड लिखने की आवश्यकता नहीं है। Google Play Store डेटा साफ़ करने के लिए बस adb कमांड का उपयोग करें:

adb shell pm clear com.android.vending

1
धन्यवाद, यह चाल मैं सिर्फ एप्लिकेशन को भी साफ करने के लिए किया था इसलिए मैंने एक पूर्ण उत्तर उपलब्ध कराया। यह मेरे लिए सही दृष्टिकोण है।
शिवी

यह बहुत से लोगों के लिए सही दृष्टिकोण है। अपने ऐप में कोड जोड़ना और रेडिप्लॉय करना अधिक समय लेने वाला (इच्छित उद्देश्य) है।
माइकल लेबबे

9
यह एक परीक्षण उपकरण के लिए एक अच्छा समाधान है, लेकिन सावधान रहें: यह Google Play Store ऐप में आपकी सभी सेटिंग्स को रीसेट कर देगा। इसलिए, मैं इसे अपने व्यक्तिगत उपकरण पर नहीं करूंगा।
दौड़

7
नहीं! यह बुरा विचार है, आपने अपने अन्य उत्पाद और अन्य एप्लिकेशन की इन-ऐप खरीदारी खो दी है, अच्छा है कि आप उत्पाद का उपभोग करें यदि आप अपने ऐप की खरीद में परीक्षण करना चाहते हैं, तो परिदृश्य केवल दो चीजों को खरीदने के लिए और दूसरा खरीदे गए उपभोग के लिए है। आइटम।
राहुल मंडलीया

2
@RahulMandaliya आपके ऐप को पहले से खरीदे गए जानने के लिए getPurchases () API का उपयोग करके कैश क्लीयर के खिलाफ लचीला होना चाहिए।
mttmllns

66

यह पता चला है कि android.test.purchased आइटम एक नियमित आईडी की तरह व्यवहार करता है। इसका मतलब है कि यदि आप इसे फिर से खरीदना चाहते हैं, तो आपको अपने कोड में कहीं न कहीं इसका सेवन करना होगा। मुझे लगता है कि Google प्रलेखन इस मामले पर भ्रामक है, और उन्हें एक और स्थिर आईडी जोड़ना चाहिए जिसे आप परीक्षण के उद्देश्य के लिए अंतहीन खरीद सकते हैं।


खरीद ऑब्जेक्ट लाने के लिए इन्वेंट्री कॉल का उपयोग करें और फिर उसका उपभोग करें - जब आप इसके चारों ओर अपना सिर प्राप्त करते हैं, तो यह बहुत आसान है।
स्लोट

3
नीचे दिए गए उत्तर को @mttmlins से देखें, या vvse.com/blog/blog/2016/08/26/… पर
IgGanapolsky

पूरी तरह से सच नहीं है, मेरे पास एक ऐसा मामला है, जिसमें अनकांशस टेस्ट आइटम नहीं है, लेकिन billingClient.queryPurchases()उस अनकंस्ड आइटम को वापस नहीं किया जाता है, इसलिए अब मैं आइटम का उपभोग नहीं कर सकता क्योंकि मैं purchaseTokenइसे प्राप्त नहीं कर सकता
हूं

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

जैसा कि एक तस्वीर एक हजार शब्दों के लायक है, पूरी तरह से काम कर रहे नंगे हड्डियों का कोड टुकड़ा एक हजार के लायक है 'इस कोड को एक धागे में जोड़ें। । । '।
Androidcoder

11

संस्करण 3 - हल करने का सबसे तेज़ तरीका : Google Play Store का कैश साफ़ करने से "android.test.purchased" फिर से उपलब्ध होगा।


क्या सिस्टम पर स्थापित अन्य ऐप्स को भी प्रभावित नहीं करेगा?
इगोरगानपोलस्की 16

1
@IgorGanapolsky, नहीं। केवल नकली खरीद प्रभावित होगी। "वास्तविक" puchases को Google के सर्वर पर संग्रहीत किया जाता है, और इसे संशोधित नहीं किया जाएगा।
डेनिस

1
मैंने Google Play एप्लिकेशन डेटा को साफ़ कर दिया है, लेकिन यह काम नहीं किया। परीक्षण खरीद विवरण अभी भी मौजूद हैं।
श्रीकर रेड्डी

2
@ "सेटिंग्स / एप्लिकेशन मैनेजर /" के माध्यम से या Google Play स्टोर आइकन को मेनू से खींचकर "सूचना" बटन (स्क्रीन के शीर्ष पर) पर रखें। अंत में, बस "स्पष्ट कैश" बटन पर क्लिक करें।
डेनिस

1
मेरे लिए सबसे अच्छा जवाब। अन्य सभी अच्छे हैं, लेकिन यह निश्चित रूप से हल करने का सबसे तेज़ तरीका है
इग्नासियो रोड़ा


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कुछ बिंदु पर इस्तेमाल किया था जो मुद्दों का कारण बन रहा था - इन-ऐप बिलिंग में इन्वेंट्री कार्य सिर्फ त्रुटियों का भार फेंक दिया और कभी समाप्त नहीं हुआ। इसे वन-ऑफ के रूप में चलाने से यह साफ हो गया ताकि मैं अपने वास्तविक एसकेयू का उपयोग कर फिर से शुरू कर सकूं और जैसा मैं पहले था, वैसा ही चल सका। साभार
जॉन

1
बहुत बढ़िया जवाब। स्टेटिक एप्स के साथ काम करता है = इससे पहले कि एपीके इन-ऐप बिलिंग सक्षम Google Play पर अपलोड किया गया है।
शाम

धन्यवाद! मेरे लिए काम किया।
AndroidMechanic - वायरल पटेल

6

मेरी राय में यदि आपके कार्यक्रम को उस आइटम का उपभोग करने के लिए डिज़ाइन नहीं किया गया है जो आपको बाहरी विक्रेता की स्मृति को साफ़ करने के लिए कोड को ट्विक करने की आवश्यकता नहीं है। यह आपके कोड को अधिक नाजुक बना देगा और आपके पास कोड को जोड़ने और हटाने के लिए बहुत समय बिताना होगा जो आपके सॉफ़्टवेयर से संबंधित नहीं है इसलिए यह उस तरह के समाधान को लागू करने के लिए एक बुरा डिज़ाइन है।

सबसे अच्छा समाधान जो मेरे लिए android.test.purchased को साफ़ करने के लिए काम करता था

adb uninstall com.yourapp.name

और फिर

adb shell pm clear com.android.vending

मुझे नकदी साफ़ करने और अपनी ऐप्स सेटिंग ब्राउज़ करने या उसके लिए कोड बदलने की आवश्यकता नहीं थी। मुझे विंडोज़ सिस्टम के पथ चर के लिए एडीबी जोड़ने की ज़रूरत थी जो बहुत सीधे आगे था। तो हाँ आपको adb का उपयोग करने की आवश्यकता है जो आपको शायद वैसे भी चाहिए ..

आप बस अपना C: \ ... \ android-sdk \ platform-tools जोड़ते हैं; वातावरण चर में खिड़कियों पथ में, और मुझे लगता है कि यह मैक और लिनक्स ओएस में भी बहुत सरल है। आशा है कि यह ऐप बिलिंग्स में एंड्रॉइड को लागू करने के साथ किसी को कुछ दिन कम खर्च करने में मदद करता है।


uninstallandroid.test.purchased sku को साफ़ करने के लिए आवश्यक नहीं है ।
इगोरगानापोलस्की 16

4

मुख्य मुद्दा यह है कि आपको android.test.purchasedआइटम का उपभोग करना होगा । लेकिन यह आइटम आपकी क्वेरी सूची में उपलब्ध नहीं होगा, इसलिए आप सामान्य प्रवाह का उपयोग नहीं कर सकते।

इसलिए, यदि आप IabHelperकक्षा में IabHelper का उपयोग कर रहे हैं, तो आप अस्थायी रूप से IInAppBillingServicemService को सार्वजनिक रूप से बदल सकते हैं ताकि यह आपके IabHelper से सुलभ हो।

फिर अपनी कक्षा में, आप इस तरह का उपभोग कर सकते हैं,

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

यदि सफलता, प्रतिक्रिया 0 हो रही है।

उम्मीद है की यह मदद करेगा।


स्पर्शरेखा: क्या आप किसी प्रबंधित आइटम पर धनवापसी जारी कर सकते हैं (परीक्षण खाते के साथ - यह डैशबोर्ड में नहीं दिखता है)?
एड ली

आप android.test.purchasedconsumeAsync() पर कॉल कर सकते हैं । इससे कोई समस्या नहीं है।
इगोरगानापोलस्की 16

सरल परीक्षण के लिए IabHelper का उपयोग करना सबसे अच्छा तरीका है। मेरी मदद की।
रूबेन

2

परीक्षण के प्रयोजनों के लिए, मैं आपको एक ऐसा कोड सम्मिलित करने का सुझाव देता हूं जो उन सभी उत्पादों को समाशोधन करेगा जो आपने एक विधि को कॉल करने से पहले खरीदा है जो कि gp खरीद प्रवाह को आरंभ करता है। यह विशेष रूप से आरामदायक है, जब आप इस समय सिर्फ एक आइटम का परीक्षण करते हैं। इस तरह:

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

Google Play कंसोल पर जाएं और ऑर्डर प्रबंधन टैब खोलें। वहां आप परीक्षण खरीद को वापस कर सकते हैं / रद्द कर सकते हैं।


1

यदि आप परीक्षण के माहौल में हैं

1) android.test.purchased के मामले में, मैं एंड्रॉइड डिवाइस (इन्वेंट्री भस्म) को पुनरारंभ करके नकली भुगतान को रीसेट कर सकता हूं।

2) InApp उपयोग में एक फ़ाइल होती है, जिसे Security.java कहा जाता है, इसे निम्नानुसार बना सकते हैं, अस्थायी के लिए। चूंकि सुरक्षा अपवाद के कारण परीक्षण भुगतान (नकली) हमेशा गलत होता है।

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

फिर अपने OnIabPurchaseFinishedListener कॉल 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

मेरे मामले में, ऐसा प्रतीत होता है कि Google आइटम के लिए खरीदारी रिकॉर्ड नहीं करता है। बल्कि, Google Play Services की स्थानीय प्रतिलिपि खरीदारी को कैश करती है। इस तरह, जब एक ही डिवाइस पर दूसरा अनुरोध किया जाता है, तो android.test.purchased already ownedप्रकट होता है। हालांकि, किसी अन्य डिवाइस का उपयोग करने या डिवाइस को रीसेट करने से कैश साफ़ हो जाता है, और खरीदारी को दोहराया जा सकता है।


-1

मेरे मामले में, मुझे केवल ऐप्स कैश साफ़ करने की आवश्यकता है। कैश साफ़ करने के बाद, मैं फिर से खरीद प्रवाह शुरू करने में सक्षम था।

अपने डिवाइस (4.4.2) से, मैंने "सेटिंग-> एप्लिकेशन मैनेजर" में नेविगेट किया। अगला, मैंने "DOWNLOADED" टैब से एप्लिकेशन का चयन किया, और फिर "कैश साफ़ करें"।


-2

यह उपभोज्य और गैर-उपभोग्य वस्तुओं के बीच अंतर है; गैर-उपभोग्य वस्तुएं (जो आप यहां काम कर रहे हैं) उनके राज्य पर लगातार नज़र रखते हैं, जबकि उपभोज्य आइटम कई बार हो सकते हैं। आपको अपने Play प्रबंधन कंसोल में जाना होगा और इसे फिर से परीक्षण करने के लिए बिक्री को रद्द / वापस करना होगा।


1
लेकिन बात यह है कि मेरे पास इन "नकली" वस्तुओं पर कोई "शक्ति" नहीं है, और मैं नहीं देखता कि मैं बिक्री की स्थिति को कहां बदल सकता हूं, क्योंकि वे वास्तविक खरीद नहीं हैं। Google डॉक का कहना है के बारे में android.test.purchased: जब आप इस उत्पाद आईडी के साथ एक ऐप्लिकेशन के अंतर्गत बिलिंग अनुरोध करते हैं, तो Google Play प्रतिक्रिया है जैसे कि आप सफलतापूर्वक एक आइटम खरीदा है। इसलिए मैं बहुत उलझन में हूँ: /
psykhi

क्या आप स्थिर प्रतिक्रिया परीक्षण अभी भी कर रहे हैं? यदि हां, तो आपको केवल स्थैतिक प्रतिक्रिया को भेजने के लिए बदलने की आवश्यकता है। ऐसा लगता है कि आप "अपने स्वयं के उत्पाद आईडी का उपयोग करके इन-ऐप खरीदारी की जांच" कर रहे हैं, हालांकि, जो रद्द आदेशों के साथ वास्तविक खरीद करता है।
ऐडऑन

मैं अभी भी स्टेटिक आईडी के साथ अटका हुआ हूं। मैं क्या चाहूंगा कि android.test.purchased ID के साथ इन-ऐप खरीदारी का परीक्षण किया जा सके। यह सिर्फ पहली बार काम किया है जब यह हमेशा काम करना चाहिए जो मैं Google डॉक्स से समझता हूं। क्षमा करें यदि मैं स्पष्ट नहीं था!
सायकि

मेरी गलत व्याख्या, क्षमा करें। उस मामले में ... मुझे नहीं पता। यह निश्चित रूप से हर बार सफलता लौटाने वाला है, मैंने उस मामले को नहीं देखा है जिसे आप देख रहे हैं। माफ़ करना।
addaon

नींद की एक अच्छी रात के बाद समस्या को फिर से देखने की कोशिश करेंगे :) आपकी मदद के लिए धन्यवाद!
pskkhi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.