Ra Isse
Ra Isse

Reputation: 371

in-app billing onPurchaseUpdated not called

I am testing an app for in-app billing I set my account in google play console and everything work correctly and the purchase success but the last method onPurchasesUpdated I don't know if it calls or no but I don't get any toast so maybe it doesn't call is there a problem with my code? The app tells me the purchase success how I can code something when purchase success?

public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener {

BillingClient mBillingClient;

private Button mBtnBuy;

private String product = "product_test_4";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBtnBuy = findViewById(R.id.mBtn_buy);

    mBtnBuy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mBillingClient = BillingClient.newBuilder(MainActivity.this).setListener(new PurchasesUpdatedListener() {
                @Override
                public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {



                }


            }).build();

            mBillingClient.startConnection(new BillingClientStateListener() {
                @Override
                public void onBillingSetupFinished(int responseCode) {
                    startPurchase();
                }

                @Override
                public void onBillingServiceDisconnected() {

                }
            });
        }
    });


}

public void startPurchase() {

    List<String> skuList = new ArrayList<>();
    skuList.add(product);
    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
    mBillingClient.querySkuDetailsAsync(params.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
                    if (responseCode == BillingClient.BillingResponse.OK
                            && skuDetailsList != null) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            String sku = skuDetails.getSku();
                            String price = skuDetails.getPrice();
                            if (product.equals(sku)) {

                            }
                        }
                    }
                }
                // Process the result.
            });

    BillingFlowParams flowParams = BillingFlowParams.newBuilder()
            .setSku(product)
            .setType(BillingClient.SkuType.INAPP) // SkuType.SUB for subscription
            .build();
    int responseCode = mBillingClient.launchBillingFlow(MainActivity.this, flowParams);
}


@Override
public void onPurchasesUpdated(@BillingClient.BillingResponse int responseCode, List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK
            && purchases != null) {
        Toast.makeText(this, "purchase success", Toast.LENGTH_SHORT).show();
        Log.d("tag","purchase success");
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
        Toast.makeText(this, "purchase cancelled", Toast.LENGTH_SHORT).show();
        Log.d("tag","purchase cancelled");
    } else {
        // Handle any other error codes.
        Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
        Log.d("tag","purchase error");
    }
}

}

Upvotes: 3

Views: 2459

Answers (1)

Omer
Omer

Reputation: 684

You are setting your PurchasesUpdatedListener in mBtnBuy onClick

mBillingClient = BillingClient.newBuilder(MainActivity.this).setListener(new PurchasesUpdatedListener() {
            @Override
            public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {



            }


        }).build();

so that method will be called on purchase instead of last onPurchasesUpdated

You can do mBillingClient = BillingClient.newBuilder(MainActivity.this).setListener().build(); like this and then last onPurchasesUpdated will be called

Upvotes: 2

Related Questions