Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't finish transaction in ionic-native/in-app-purchase-2

I'm developing app with Ionic 4 / Angular 8 / Cordova

I have installed In App Purchase 2 and setup it. Apple Developer and Sandbox accounts are ok.

Product registration is ok:

registerProduct() {
    this.iap.verbosity = this.iap.DEBUG;

    this.iap.register({
        id: MONEYCOMBO_KEY,
        type: this.iap.CONSUMABLE
    })

    this.registerHandlersForPurchase(MONEYCOMBO_KEY)

    this.product = this.iap.get(MONEYCOMBO_KEY)

    this.iap.refresh()

    this.iap.when(MONEYCOMBO_KEY).updated((p) => {
        this.product = p
        this.title = p.title
        this.price = p.price
    })
}

Event handlers:

registerHandlersForPurchase(productId) {
    let self = this.iap;

    this.iap.when(productId).updated(function (product) {
        if (product.loaded && product.valid && product.state === self.APPROVED && product.transaction != null) {
            product.finish();
        }
    });

    this.iap.when(productId).registered((product: IAPProduct) => {
        // alert(` owned ${product.owned}`);
    });

    this.iap.when(productId).owned((product: IAPProduct) => {
        console.error('finished')
        product.finish();
    });

    this.iap.when(productId).approved((product: IAPProduct) => {
        // alert('approved');
        product.finish();
    });

    this.iap.when(productId).refunded((product: IAPProduct) => {
        // alert('refunded');
    });

    this.iap.when(productId).expired((product: IAPProduct) => {
        // alert('expired');
    });
}

Purchase method:

buyMoneyCombo(form: NgForm) {
    this.registerHandlersForPurchase(MONEYCOMBO_KEY)
    this.date = form.value.date
    this.iap.order(MONEYCOMBO_KEY)
    this.iap.refresh()
}

The problem:

Console says:

"InAppPurchase[js]: product test has a transaction in progress: 1000000628239595"

Transaction cannot be finished. Why?

like image 784
Roman Khegay Avatar asked Nov 07 '22 09:11

Roman Khegay


1 Answers

So, after a weeks researching, I found the solution.

And there is no problem: Message from Apple is displaying after transaction is finished:

"InAppPurchase[js]: product test has a transaction in progress: 1000000628239595"

And all purchase logic must be declared inside:

this.iap.when(MONEYCOMBO_KEY).approved((product: IAPProduct) => {
        product.finish()
        this.getMoney()
    })
like image 104
Roman Khegay Avatar answered Nov 13 '22 03:11

Roman Khegay