android - OnIabPurchaseFinishedListener called but fails -
i'm long time android developer got in-app purchasing. went through google tutorial , got testing version work. however, when try implement custom items purchase, fails @ oniabpurchasefinishedlistener. want @ moment add 3 buttons different levels of donations ($1, $5, $10). have 1 of these items made on developer console.
it fails here:
if (result.isfailure()) { log.d("money", "error purchasing: " + result); return; } here's code:
package widowmaker110.productions.greenlink.pages; import android.app.activity; import android.content.intent; import android.os.bundle; import android.util.log; import android.view.view; import android.widget.button; import android.widget.toast; import widowmaker110.productions.greenlink.r; import widowmaker110.productions.greenlink.util.iabhelper; import widowmaker110.productions.greenlink.util.iabresult; import widowmaker110.productions.greenlink.util.inventory; import widowmaker110.productions.greenlink.util.purchase; /** * created alexander on 3/26/2015. */ public class moneyactivity extends activity{ //http://www.techotopia.com/index.php/an_android_studio_google_play_in-app_billing_tutorial iabhelper mhelper; // google's built in testing item //static final string item_sku = "android.test.purchased"; private button clickbutton; private button buybutton; static final string item_sku = "com.example.buttonclick"; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.fragment_in_app_billing); buybutton = (button)findviewbyid(r.id.buybutton); clickbutton = (button)findviewbyid(r.id.clickbutton); clickbutton.setenabled(false); buybutton.setenabled(false); string base64encodedpublickey = "my_key"; buybutton.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { mhelper.launchpurchaseflow(moneyactivity.this, item_sku, 10001, mpurchasefinishedlistener, ""); clickbutton.setenabled(false); buybutton.setenabled(true); } }); mhelper = new iabhelper(this, base64encodedpublickey); mhelper.startsetup(new iabhelper.oniabsetupfinishedlistener() { public void oniabsetupfinished(iabresult result) { if (!result.issuccess()) { log.d("inappbilling", "in-app billing setup failed: " + result); toast.maketext(moneyactivity.this, "in-app purchasing set failed", toast.length_long).show(); } else { buybutton.setenabled(true); log.d("inappbilling", "in-app billing set ok"); } mhelper.queryinventoryasync(mgotinventorylistener); } }); } boolean verifydeveloperpayload(purchase p) { string payload = p.getdeveloperpayload(); return true; } // listener that's called when finish querying items , // subscriptions own iabhelper.queryinventoryfinishedlistener mgotinventorylistener = new iabhelper.queryinventoryfinishedlistener() { public void onqueryinventoryfinished(iabresult result, inventory inventory) { log.d("", "query inventory finished."); if (result.isfailure()) { log.d("money","failed query inventory: " + result); return; } log.d("money", "query inventory successful."); /* * check items own. notice each purchase, check * developer payload see if it's correct! see * verifydeveloperpayload(). */ // // check gas delivery -- if own gas, should fill // tank purchase gaspurchase = inventory.getpurchase(item_sku); if (gaspurchase != null && verifydeveloperpayload(gaspurchase)) { log.d("money", "we have gas. consuming it."); mhelper.consumeasync(inventory.getpurchase(item_sku), mconsumefinishedlistener); return; } } }; @override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (mhelper == null) return; if (!mhelper.handleactivityresult(requestcode, resultcode, data)) { super.onactivityresult(requestcode, resultcode, data); } } @override protected void onstart() { super.onstart(); } // callback when purchase finished iabhelper.oniabpurchasefinishedlistener mpurchasefinishedlistener = new iabhelper.oniabpurchasefinishedlistener() { public void oniabpurchasefinished(iabresult result, purchase purchase) { log.d("money", "purchase finished: " + result + ", purchase: " + purchase); if (result.isfailure()) { log.d("money", "error purchasing: " + result); return; } if (!verifydeveloperpayload(purchase)) { log.d("money","error purchasing. authenticity verification failed."); return; } log.d("money", "purchase successful."); if (purchase.getsku().equals(item_sku)) { // remove query inventory method here , put consumeasync() directly mhelper.consumeasync(purchase, mconsumefinishedlistener); } } }; public void consumeitem() { mhelper.queryinventoryasync(mreceivedinventorylistener); } iabhelper.queryinventoryfinishedlistener mreceivedinventorylistener = new iabhelper.queryinventoryfinishedlistener() { public void onqueryinventoryfinished(iabresult result,inventory inventory) { if (result.isfailure()) { // handle failure toast.maketext(moneyactivity.this, "mreceivedinventorylistener failed", toast.length_long).show(); } else { mhelper.consumeasync(inventory.getpurchase(item_sku), mconsumefinishedlistener); toast.maketext(moneyactivity.this, "mreceivedinventorylistener worked", toast.length_long).show(); } } }; iabhelper.onconsumefinishedlistener mconsumefinishedlistener = new iabhelper.onconsumefinishedlistener() { public void onconsumefinished(purchase purchase, iabresult result) { if (result.issuccess()) { clickbutton.setenabled(true); toast.maketext(moneyactivity.this, "purchasing button worked", toast.length_long).show(); } else { toast.maketext(moneyactivity.this, "error 20: purchase failed.", toast.length_long).show(); } } }; @override public void ondestroy() { super.ondestroy(); if (mhelper != null) mhelper.dispose(); mhelper = null; } }
Comments
Post a Comment