การทดสอบการเรียกเก็บเงินในแอป: android.test.purchased เป็นเจ้าของแล้ว


122

ฉันกำลังทดสอบการเรียกเก็บเงินในแอปสำหรับแอปในอนาคตและหลังจากที่ฉัน "ซื้อ" รายการทดสอบ "android.test.purchased" สำเร็จในครั้งแรกตอนนี้ฉันได้รับรหัสตอบกลับ 7 ทุกครั้งที่พยายามซื้ออีกครั้ง ซึ่งหมายความว่าฉันเป็นเจ้าของรายการนี้แล้ว

12-15 23: 02: 14.149: E / IabHelper (19829): ข้อผิดพลาดในการเรียกเก็บเงินในแอป: ไม่สามารถซื้อสินค้าได้การตอบสนองข้อผิดพลาด: 7: มีรายการที่เป็นเจ้าของแล้ว

จากสิ่งที่ฉันเข้าใจการซื้อนี้ควรจะเป็นไปได้เสมอใช่ไหม เพื่อให้นักพัฒนาสามารถทดสอบแอพของเขา / เธอ?

ถ้าไม่ฉันจะ "รีเซ็ต" สถานะเป็นไม่มีเจ้าของได้อย่างไร ฉันใช้แพ็คเกจ util จากตัวอย่างการเรียกเก็บเงินในแอปของ Google


1
การรับสมัครของฉันเป็นข้อเขียน .. ฉันต้องการข้อความที่เป็นเจ้าของอยู่แล้ว แต่ทุกครั้งที่อนุญาตให้ซื้อ
Sandeep P

คำตอบ:


109

เพิ่มรหัสนี้ในเธรดเพื่อเริ่มการร้องขอการบริโภค

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

สำหรับการทดสอบการซื้อ buyToken คือ

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

และ

if (response == 0)

แล้วการบริโภคจะประสบความสำเร็จ

อย่าลืมทำให้ mService เป็นสาธารณะด้วย

IabHelper.Java

จากนั้นจะสามารถเข้าถึงได้ดังนี้:

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

2
ตำนานผลงานนี้ @psykhi ควรให้คะแนนคุณจริงๆ ฉันพยายามใช้มัน แต่หาโทเค็นซื้อไม่ได้ ขอบคุณ
Blundell

1
ขอบคุณ! @prasharonnet
Y2i

1
ประหยัดเวลาได้มาก สมบูรณ์ ขอบคุณ
PrivusGuru

13
mService คืออะไร? mHelper? แต่หาซื้อไม่เจอ ()
Bagusflyer

1
mService เป็นอ็อบเจ็กต์ของอินเทอร์เฟซ IInAppBillingService.aidl ซึ่งผูกกับบริการซื้อที่เริ่มต้นสำหรับการซื้อที่ไม่เหมาะสม
Aashutosh Sharma

92

ไม่จำเป็นต้องเขียนรหัสการบริโภคพิเศษใด ๆ เพียงใช้คำสั่ง adb เพื่อล้างข้อมูล Google Play Store:

adb shell pm clear com.android.vending

1
ขอบคุณมันเป็นเคล็ดลับที่ฉันต้องล้างแอพด้วยดังนั้นฉันจึงได้รับคำตอบแบบเต็ม นี่เป็นแนวทางที่เหมาะสมสำหรับฉัน
sivi

นี่เป็นแนวทางที่เหมาะสมสำหรับคนจำนวนมาก การเพิ่มโค้ดลงในแอปของคุณและการทำให้ใช้งานได้ใหม่นั้นใช้เวลานานกว่า (ตั้งใจให้เล่นสำนวน)
Michael Labbé

9
นี่เป็นวิธีแก้ปัญหาที่ดีสำหรับอุปกรณ์ทดสอบ แต่โปรดระวังเพราะจะรีเซ็ตการตั้งค่าทั้งหมดของคุณในแอป Google Play Store ดังนั้นฉันจึงไม่อยากทำบนอุปกรณ์ส่วนตัวของฉัน
racs

7
No! นี่เป็นความคิดที่ไม่ดีคุณสูญเสียการซื้อผลิตภัณฑ์อื่น ๆ และแอปอื่น ๆ ในแอปสิ่งที่ดีคือคุณต้องบริโภคผลิตภัณฑ์หากคุณต้องการทดสอบการซื้อในแอปสถานการณ์คือสร้างสองสิ่งหนึ่งสำหรับการซื้อและอีกสิ่งหนึ่งสำหรับการบริโภคที่ซื้อ สิ่งของ.
Rahul Mandaliya

2
@RahulMandaliya แอปของคุณควรมีความยืดหยุ่นต่อการล้างแคชโดยใช้ getPurchases () API เพื่อให้ทราบว่ามีการซื้ออะไรไปบ้างแล้ว
mttmllns

66

ปรากฎว่ารายการ android.test.purchased ทำงานเหมือน ID ทั่วไป หมายความว่าหากคุณต้องการที่จะซื้ออีกครั้งคุณต้องใช้มันที่ไหนสักแห่งในรหัสของคุณ ฉันคิดว่าเอกสารของ Google ทำให้เข้าใจผิดในเรื่องนี้และควรเพิ่มรหัสคงที่อีกอันที่คุณสามารถซื้อได้ไม่รู้จบเพื่อการทดสอบ


ใช้การเรียกสินค้าคงคลังเพื่อดึงวัตถุซื้อจากนั้นใช้มัน - มันค่อนข้างง่ายเมื่อคุณเข้าใจมัน
slott

3
ดูคำตอบด้านล่างจาก @mttmlins หรืออ่านvvse.com/blog/blog/2016/08/26/…
IgorGanapolsky

ไม่เป็นความจริงอย่างสิ้นเชิงผมมีกรณีที่มีรายการทดสอบ unconsumed แต่billingClient.queryPurchases()ไม่กลับมาว่ารายการ unconsumed ดังนั้นตอนนี้ฉันไม่สามารถใช้รายการเพราะฉันไม่สามารถได้รับ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);
        }
    }
};

ในฐานะที่เป็นรูปภาพมีค่าหนึ่งพันคำชิ้นโค้ดกระดูกเปล่าที่ใช้งานได้สมบูรณ์มีมูลค่าหนึ่งพัน 'เพิ่มรหัสนี้ในเธรด . . '
Androidcoder

11

เวอร์ชัน 3 - วิธีแก้ปัญหาที่เร็วที่สุด : การล้างแคชของ Google Play Store จะทำให้ "android.test.purchased" พร้อมใช้งานอีกครั้ง


นั่นจะไม่ส่งผลกระทบต่อแอปอื่น ๆ ที่ติดตั้งในระบบด้วยหรือไม่?
IgorGanapolsky

1
@IgorGanapolsky นน. เฉพาะการซื้อจำลองเท่านั้นที่จะได้รับผลกระทบ puchases "ของจริง" จะถูกเก็บไว้บนเซิร์ฟเวอร์ของ Google และจะไม่มีการแก้ไข
Denis

1
ฉันล้างข้อมูลแอป Google Play แล้ว แต่ไม่ได้ผล รายละเอียดการซื้อทดสอบยังคงมีอยู่
Srikar Reddy

2
@Richard ผ่านทาง "settings / applications manager /" หรือลากไอคอน Google play store จากเมนูไปที่ปุ่ม "information" (ที่ด้านบนของหน้าจอ) สุดท้ายเพียงคลิกปุ่ม "ล้างแคช"
Denis

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ในบางจุดซึ่งทำให้เกิดปัญหา - งานสินค้าคงคลังในการเรียกเก็บเงินในแอปทำให้เกิดข้อผิดพลาดมากมายและไม่เสร็จสิ้น การเรียกใช้สิ่งนี้เป็นการล้างครั้งเดียวเพื่อให้ฉันสามารถกลับมาใช้งานกับ SKU จริงของฉันและดำเนินการต่อเหมือนเดิม ขอบคุณ
จอน

1
คำตอบที่ยอดเยี่ยม ทำงานร่วมกับการตอบสนองแบบคงที่ = ก่อนที่ apk ที่เปิดใช้งานการเรียกเก็บเงินในแอปจะอัปโหลดไปยัง Google Play
infero

ขอบคุณ! ทำงานให้ฉัน
AndroidMechanic - Viral Patel

6

ในความคิดของฉันหากโปรแกรมของคุณไม่ได้ออกแบบมาเพื่อใช้รายการคุณไม่จำเป็นต้องปรับแต่งโค้ดเพื่อล้างหน่วยความจำของผู้ขายภายนอก สิ่งนี้จะทำให้โค้ดของคุณเปราะบางมากขึ้นและคุณจะต้องใช้เวลามากในการเพิ่มและลบโค้ดที่ไม่ได้เป็นของซอฟต์แวร์ของคุณดังนั้นจึงเป็นการออกแบบที่ไม่ดีในการนำโซลูชันแบบนั้นไปใช้

ทางออกที่ดีที่สุดที่ได้ผลสำหรับฉันในการล้าง android.test.purchased คือ

adb uninstall com.yourapp.name

แล้ว

adb shell pm clear com.android.vending

ฉันไม่จำเป็นต้องล้างเงินสดและเรียกดูการตั้งค่าแอปของฉันหรือเปลี่ยนรหัสสำหรับสิ่งนั้น ฉันไม่จำเป็นต้องเพิ่ม adb ไปยังตัวแปรพา ธ ของระบบ windows ซึ่งค่อนข้างตรงไปตรงมา ใช่คุณต้องใช้ adb ซึ่งคุณอาจต้องการอยู่ดี ..

คุณเพียงแค่เพิ่ม C: \ ... \ android-sdk \ platform-tools ของคุณ ในเส้นทาง windows ในตัวแปรสภาพแวดล้อมและฉันคิดว่ามันค่อนข้างง่ายใน mac และ linux os เช่นกัน หวังว่าจะช่วยให้ใครบางคนใช้เวลาน้อยลงในการใช้ Android ในการเรียกเก็บเงินแอป


uninstallไม่จำเป็นต้องล้างandroid.test.purchased sku
IgorGanapolsky

4

ประเด็นหลักคือคุณต้องบริโภคandroid.test.purchasedไอเทม แต่รายการนี้จะไม่พร้อมใช้งานในคลังคำค้นหาของคุณดังนั้นคุณจึงไม่สามารถใช้โดยใช้โฟลว์ปกติได้

ดังนั้นหากคุณใช้ IabHelper ในIabHelperชั้นเรียนคุณสามารถเปลี่ยนIInAppBillingServicemService เป็นสาธารณะชั่วคราวเพื่อให้เข้าถึงได้จาก IabHelper ของคุณ

จากนั้นในชั้นเรียนของคุณคุณสามารถบริโภคแบบนี้

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

หากสำเร็จการตอบสนองจะเป็น 0

หวังว่านี่จะช่วยได้


Tangent: คุณสามารถคืนเงินสำหรับสินค้าที่มีการจัดการ (ด้วยบัญชีทดสอบดูเหมือนจะไม่ปรากฏในแผงควบคุม)
Ed Lee

คุณสามารถโทรconsumeAsync()ในandroid.test.purchased ไม่มีปัญหากับสิ่งนั้น
IgorGanapolsky

สำหรับการทดสอบอย่างง่ายนี่เป็นวิธีที่ดีที่สุดหากใช้ IabHelper ช่วยฉันด้วย
Rúben

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 ฉันสามารถรีเซ็ตการชำระเงินปลอมโดยการรีสตาร์ทอุปกรณ์ Android (ใช้สินค้าคงคลัง)

2) ใน InApp util มีไฟล์ชื่อ 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);
        }


    }
};

บริโภค Listener คือ

    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 ในเครื่องจะแคชการซื้อ ด้วยวิธีนี้เมื่อมีการร้องขอครั้งที่สองบนอุปกรณ์เดียวกันandroid.test.purchased already ownedจะปรากฏขึ้น อย่างไรก็ตามการใช้อุปกรณ์อื่นหรือการรีเซ็ตอุปกรณ์จะเป็นการล้างแคชและอนุญาตให้ซื้อซ้ำได้


-1

ในกรณีของฉันฉันแค่ต้องล้างแคชของแอพ หลังจากล้างแคชฉันสามารถเริ่มขั้นตอนการซื้อได้อีกครั้ง

จากอุปกรณ์ของฉัน (4.4.2) ฉันไปที่ "การตั้งค่า -> ตัวจัดการแอปพลิเคชัน" ต่อมาฉันเลือกแอปจากแท็บ "ดาวน์โหลด" แล้วเลือก "ล้างแคช"


-2

นี่คือความแตกต่างระหว่างสิ่งของสิ้นเปลืองและไม่สิ้นเปลือง สิ่งของที่ไม่สิ้นเปลือง (สิ่งที่ดูเหมือนว่าคุณกำลังจัดการอยู่ที่นี่) มีการติดตามสถานะของพวกเขาอย่างต่อเนื่องในขณะที่ไอเท็มสิ้นเปลืองสามารถซื้อได้หลายครั้ง คุณจะต้องเข้าไปที่คอนโซลการจัดการ Play และยกเลิก / คืนเงินการขายเพื่อทดสอบอีกครั้ง


1
แต่สิ่งนั้นคือฉันไม่มี "อำนาจ" ใด ๆ กับสินค้า "ปลอม" เหล่านี้และฉันไม่เห็นว่าจะเปลี่ยนสถานะการลดราคาได้จากที่ใดเนื่องจากไม่ใช่การซื้อจริง Google เอกสารกล่าวเกี่ยวกับ android.test.purchased: เมื่อคุณทำการร้องขอการเรียกเก็บเงินในแอปที่มี ID สินค้านี้ Google Play ตอบสนองว่าคุณซื้อสินค้าที่ประสบความสำเร็จ ฉันค่อนข้างสับสน: /
psykhi

คุณกำลังทำการทดสอบการตอบสนองแบบคงที่หรือไม่ ในกรณีนี้คุณต้องเปลี่ยนสิ่งที่ส่งการตอบกลับแบบคงที่ ดูเหมือนว่าคุณกำลัง "ทดสอบการซื้อในแอปโดยใช้รหัสผลิตภัณฑ์ของคุณเอง" ซึ่งจะทำการซื้อจริงด้วยคำสั่งซื้อที่ยกเลิกได้
addaon

ฉันยังคงติดอยู่กับรหัสคงที่ สิ่งที่ฉันต้องการคือสามารถทดสอบการซื้อในแอปด้วยรหัส android.test.purchased เพิ่งใช้งานได้เป็นครั้งแรกเมื่อควรใช้งานจากสิ่งที่ฉันเข้าใจจากเอกสาร Google เสมอ ขออภัยถ้าพูดไม่ชัด!
psykhi

การตีความผิดของฉันขออภัย ในกรณีนั้น ... ฉันไม่รู้ มันควรจะกลับมาประสบความสำเร็จทุกครั้งฉันไม่เคยเห็นกรณีที่คุณเห็น ขอโทษ
addaon

จะพยายามดูปัญหาอีกครั้งหลังจากนอนหลับฝันดี :) ขอบคุณสำหรับความช่วยเหลือ!
Psykhi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.