Kiểm tra Thanh toán trong ứng dụng: android.test.purchased đã được sở hữu


122

Tôi hiện đang thử nghiệm Thanh toán trong ứng dụng cho một ứng dụng trong tương lai và sau khi tôi "mua" thành công mặt hàng thử nghiệm "android.test.purchased" lần đầu tiên, tôi hiện nhận được mã phản hồi 7 mỗi khi tôi cố gắng mua lại, có nghĩa là tôi đã sở hữu mặt hàng này.

12-15 23: 02: 14.149: E / IabHelper (19829): Lỗi thanh toán trong ứng dụng: Không thể mua mặt hàng, Phản hồi lỗi: 7: Mặt hàng đã được sở hữu

Theo những gì tôi hiểu, việc mua hàng này được cho là luôn có thể thực hiện được, phải không? Để nhà phát triển có thể thử nghiệm ứng dụng của mình?

Nếu không, làm thế nào tôi có thể "thiết lập lại" trạng thái của nó thành không sở hữu? Tôi đang sử dụng gói tận dụng từ Mẫu thanh toán trong ứng dụng của Google.


1
tuyển của tôi là vise câu ..Tôi cần được thông báo đã sở hữu nhưng mỗi lần cho phép của mình để mua
Sandeep P

Câu trả lời:


109

Thêm mã này vào một chuỗi để bắt đầu yêu cầu tiêu thụ.

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

Ở đây để thử nghiệm mua hàng, buyToken là

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

if (response == 0)

thì việc tiêu thụ thành công.

cũng đừng quên đặt mService ở chế độ công khai

IabHelper.Java

thì có thể truy cập như thế này:

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

2
Huyền thoại này hoạt động, @psykhi thực sự nên cho bạn điểm. Tôi đã cố gắng tiêu thụ nó nhưng không thể tìm ra mã thông báo mua hàng. Cảm ơn
Blundell

1
Cảm ơn bạn! @prasharonnet
Y2i

1
Đây là một tiết kiệm thời gian rất lớn. Hoàn hảo. Cảm ơn.
PrivusGuru

13
MService là gì? mHelper? Nhưng tôi không thể tìm thấy consumePurchase ()
Bagusflyer

1
mService là đối tượng của giao diện IInAppBillingService.aidl được liên kết với dịch vụ mua hàng được khởi tạo cho giao dịch mua inapp.
Aashutosh Sharma

92

Không cần viết bất kỳ mã tiêu thụ đặc biệt nào. Chỉ cần sử dụng lệnh adb để xóa dữ liệu Cửa hàng Google Play:

adb shell pm clear com.android.vending

1
cảm ơn nó đã thực hiện thủ thuật tôi chỉ cần xóa ứng dụng, vì vậy tôi đã cung cấp một câu trả lời đầy đủ. Đây là cách tiếp cận phù hợp với tôi.
sivi

Đây là cách tiếp cận phù hợp với rất nhiều người. Thêm mã vào ứng dụng của bạn và triển khai lại tốn nhiều thời gian hơn (dự định chơi chữ).
Michael Labbé

9
Đây là một giải pháp tốt cho thiết bị thử nghiệm, nhưng hãy cẩn thận: nó sẽ đặt lại tất cả cài đặt của bạn trong ứng dụng Cửa hàng Google Play. Vì vậy, tôi không muốn làm điều đó trên thiết bị cá nhân của mình.
racs

7
Không! Đây là một ý tưởng tồi, bạn đã mất việc mua trong ứng dụng của sản phẩm khác và các ứng dụng khác, điều tốt là bạn phải tiêu thụ sản phẩm nếu bạn muốn thử nghiệm mua hàng trong ứng dụng, tình huống chỉ là tạo ra hai thứ một để mua và một thứ khác để tiêu dùng đã mua mục.
Rahul Mandaliya

2
@RahulMandaliya ứng dụng của bạn phải có khả năng phục hồi khi bị xóa bộ nhớ cache bằng cách sử dụng API getPurchases () để biết những gì đã được mua.
mttmllns

66

Hóa ra là mục android.test.purchased hoạt động giống như một ID thông thường. Có nghĩa là nếu bạn muốn có thể mua lại, bạn phải tiêu thụ nó ở đâu đó trong mã của bạn. Tôi nghĩ rằng tài liệu của Google gây hiểu lầm về vấn đề này và họ nên thêm một ID tĩnh khác mà bạn có thể mua liên tục cho mục đích thử nghiệm.


Sử dụng lệnh gọi khoảng không quảng cáo để tìm nạp đối tượng Mua và sau đó tiêu thụ nó - việc này khá dễ dàng khi bạn đã hiểu rõ về nó.
slott

3
Xem câu trả lời bên dưới từ @mttmlins hoặc đọc vvse.com/blog/blog/2016/08/26/…
IgorGanapolsky

Không hoàn toàn đúng, tôi có một trường hợp có mục kiểm tra unconsumed, nhưng billingClient.queryPurchases()không trả lại rằng mục unconsumed, vì vậy bây giờ tôi không thể tiêu thụ sản phẩm, vì tôi không thể có được purchaseToken
Jemshit Iskenderov

28

Trong ứng dụng phiên bản 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);
        }
    }
};

Như một bức tranh có giá trị bằng một nghìn từ, một đoạn mã xương trần đang hoạt động hoàn chỉnh có giá trị bằng nghìn 'Thêm mã này vào một chủ đề. . . '.
Androidcoder

11

Phiên bản 3 - Cách giải quyết nhanh nhất : Xóa bộ nhớ cache của Cửa hàng Google Play sẽ cho phép "android.test.purchased" khả dụng trở lại.


Điều đó sẽ không ảnh hưởng đến các ứng dụng khác được cài đặt trên hệ thống chứ?
IgorGanapolsky

1
@IgorGanapolsky, không. Chỉ các giao dịch mua mô phỏng mới bị ảnh hưởng. Các puchase "thực" được lưu trữ trên máy chủ của Google và sẽ không bị sửa đổi.
Denis

1
Tôi đã xóa dữ liệu ứng dụng trên Google Play nhưng nó không hoạt động. Chi tiết mua thử vẫn tồn tại.
Srikar Reddy

2
@Richard thông qua "cài đặt / trình quản lý ứng dụng /" hoặc kéo biểu tượng cửa hàng Google Play từ menu đến nút "thông tin" (ở đầu màn hình). Cuối cùng, chỉ cần nhấp vào nút "xóa bộ nhớ cache".
Denis

1
Câu trả lời tốt nhất cho tôi. Tất cả những người khác là tốt, nhưng điều này chắc chắn là cách nhanh nhất để giải quyết
Ignacio Roda


9

Đây là cách chúng ta có thể tiêu thụ Vật phẩm

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

Làm việc cho tôi - đã sử dụng android.test.purchasetại một số điểm gây ra sự cố - nhiệm vụ kiểm kê trong thanh toán trong ứng dụng chỉ tạo ra một loạt lỗi và không bao giờ hoàn thành. Việc chạy này chỉ là một lần đã xóa nó để tôi có thể tiếp tục sử dụng SKU thực của mình và tiếp tục như trước đây. Cảm ơn
Jon

1
Câu trả lời xuất sắc. Hoạt động với Phản hồi tĩnh = trước khi apk có bật Thanh toán trong ứng dụng được tải lên Google Play.
enterro

Cảm ơn! Đã làm cho tôi.
AndroidMechanic - Viral Patel

6

Theo ý kiến ​​của tôi nếu chương trình của bạn không được thiết kế để tiêu thụ mặt hàng, bạn không cần phải chỉnh sửa mã để xóa bộ nhớ của nhà cung cấp bên ngoài. Điều này sẽ làm cho mã của bạn dễ hỏng hơn và sau đó bạn sẽ phải mất rất nhiều thời gian để thêm và loại bỏ mã không thuộc phần mềm của bạn, vì vậy việc thực hiện một giải pháp như vậy là một thiết kế tồi.

Giải pháp tốt nhất phù hợp với tôi để xóa android.test.purchased là

adb uninstall com.yourapp.name

và sau đó

adb shell pm clear com.android.vending

Tôi không cần chuyển tiền mặt và duyệt cài đặt ứng dụng của mình hoặc thay đổi mã cho việc đó. Tôi đã cần thêm adb vào các biến đường dẫn của hệ thống cửa sổ, điều này khá đơn giản. Vì vậy, có, bạn cần phải sử dụng adb mà bạn có thể cần.

Bạn chỉ cần thêm C: \ ... \ android-sdk \ platform-tools của mình; trong đường dẫn cửa sổ trong các biến môi trường, và tôi tưởng tượng rằng nó cũng khá đơn giản trong hệ điều hành mac và linux. Hy vọng nó sẽ giúp ai đó dành ít ngày hơn khi triển khai android trong ứng dụng.


uninstalllà không cần thiết để xóa sku android.test.purchased .
IgorGanapolsky

4

Vấn đề chính là bạn phải tiêu thụ android.test.purchasedmặt hàng. Nhưng mặt hàng này sẽ không có sẵn trong khoảng không quảng cáo truy vấn của bạn, vì vậy bạn không thể tiêu thụ theo quy trình bình thường.

Vì vậy, nếu bạn đang sử dụng IabHelper, trong IabHelperlớp, bạn có thể tạm thời thay đổi IInAppBillingServicemService thành public để nó có thể truy cập được từ IabHelper của bạn.

Sau đó trong lớp của bạn, bạn có thể tiêu thụ như thế này,

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

Nếu thành công, phản hồi sẽ là 0.

Hi vọng điêu nay co ich.


Tiếp tuyến: bạn có thể hoàn lại tiền cho một mặt hàng được quản lý (với tài khoản thử nghiệm - nó dường như không hiển thị trong trang tổng quan) không?
Ed Lee

Bạn có thể gọi consumeAsync()trên android.test.purchased . Không có vấn đề gì với điều đó.
IgorGanapolsky

Để kiểm tra đơn giản, đây là cách tốt nhất có thể nếu sử dụng IabHelper. Đã giúp tôi.
Rúben

2

Đối với mục đích thử nghiệm, tôi cũng khuyên bạn nên chèn một đoạn mã sẽ xóa tất cả các sản phẩm bạn đã mua trước khi gọi một phương thức khởi tạo quy trình mua gp. Điều đó đặc biệt thoải mái, khi bạn chỉ kiểm tra một mục vào lúc này. Ví dụ như thế này:

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

chuyển đến bảng điều khiển của Google Play và mở tab Quản lý đơn đặt hàng. Ở đó bạn có thể hoàn tiền / hủy bỏ các giao dịch mua thử nghiệm.


1

Nếu bạn đang ở trong môi trường thử nghiệm

1) Trong trường hợp android.test.purchased, tôi có thể đặt lại khoản thanh toán giả bằng cách khởi động lại thiết bị Android (đã tiêu thụ hết khoảng không quảng cáo).

2) Trong InApp sử dụng có một tệp được gọi là Security.java, tạm thời làm cho nó như sau. Kể từ khi thanh toán thử nghiệm (giả mạo) luôn trả về sai do ngoại lệ bảo mật.

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

Sau đó, trong OnIabPurchaseFinishingListener của bạn, hãy gọi 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 () là

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


    }
};

Consume Listener là

    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

Trong trường hợp của tôi, có vẻ như Google không ghi lại giao dịch mua mặt hàng. Thay vào đó, bản sao cục bộ của Dịch vụ Google Play sẽ lưu vào bộ nhớ cache giao dịch mua. Bằng cách đó, khi yêu cầu thứ hai được thực hiện trên cùng một thiết bị, android.test.purchased already ownedsẽ xuất hiện. Tuy nhiên, việc sử dụng thiết bị khác hoặc đặt lại thiết bị sẽ xóa bộ nhớ cache và cho phép lặp lại quá trình mua.


-1

Trong trường hợp của tôi, tôi chỉ cần xóa bộ nhớ cache của ứng dụng. Sau khi xóa bộ nhớ cache, tôi đã có thể bắt đầu lại quy trình mua hàng.

Từ thiết bị của tôi (4.4.2), tôi đã điều hướng đến "Cài đặt-> Trình quản lý ứng dụng". Tiếp theo, tôi chọn ứng dụng từ tab "ĐÃ TẢI XUỐNG", sau đó chọn "Xóa bộ nhớ cache".


-2

Đây là sự khác biệt giữa các mặt hàng tiêu thụ được và không tiêu thụ được; các vật phẩm không tiêu hao được (những gì bạn có vẻ đang xử lý ở đây) được theo dõi trạng thái của chúng liên tục, trong khi các vật phẩm tiêu hao có thể được mua nhiều lần. Bạn sẽ phải truy cập bảng điều khiển quản lý Play của mình và hủy / hoàn lại tiền bán để kiểm tra lại.


1
Nhưng có điều là tôi không có "quyền lực" nào đối với những món hàng "giả" này, và tôi cũng không biết mình có thể thay đổi trạng thái bán ở đâu, vì chúng không phải là hàng thật. Tài liệu google nói về android.test.purchased: Khi bạn thực hiện yêu cầu Thanh toán trong ứng dụng với ID sản phẩm này, Google Play sẽ trả lời như thể bạn đã mua thành công một mặt hàng. Vì vậy, tôi khá bối rối: /
psykhi 15/12/12

Bạn vẫn đang kiểm tra phản hồi tĩnh? Nếu vậy, bạn chỉ cần thay đổi phản hồi tĩnh nào được gửi. Tuy nhiên, có vẻ như bạn đang thực hiện "Thử nghiệm mua hàng trong ứng dụng bằng ID sản phẩm của riêng bạn", thực hiện mua hàng thực với các đơn đặt hàng có thể hủy.
addaon

Tôi vẫn bị mắc kẹt với các ID tĩnh. Điều tôi muốn là có thể thử nghiệm mua hàng trong ứng dụng với ID android.test.purchased. Nó chỉ hoạt động lần đầu tiên khi nó phải luôn hoạt động theo những gì tôi hiểu từ tài liệu Google. Xin lỗi nếu tôi không rõ ràng!
psykhi

Tôi đã hiểu sai, xin lỗi. Trong trường hợp đó ... tôi không biết. Nó chắc chắn phải trả lại thành công mỗi lần, tôi chưa thấy trường hợp bạn đang thấy. Lấy làm tiếc.
addaon

Sẽ cố gắng nhìn nhận lại vấn đề sau một đêm ngon giấc :) Cảm ơn sự giúp đỡ của bạn!
psykhi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.