j3k0 / cordova-plugin-purchase

In-App Purchase for Cordova on iOS, Android and Windows
https://purchase.cordova.fovea.cc
1.3k stars 537 forks source link

Duplicates product list on every page refresh #1115

Closed nevonevo closed 3 years ago

nevonevo commented 3 years ago

Hi i am using ionic 3. i use this plug in with these codes

constructor(...) {
    this.platform.ready().then(() => {
      this.store.verbosity = this.store.DEBUG;

      this.registerProducts();
      this.setupListeners();

      this.store.ready(() => {
        this.products = this.store.products;
        this.ref.detectChanges();
      });
    });
}

  registerProducts() {
    this.store.register({
      id: one_month_membership,
      alias: one_month_membership,
      type: this.store.PAID_SUBSCRIPTION
    });

    this.store.register({
      id: three_months_membership,
      alias: three_months_membership,
      type: this.store.PAID_SUBSCRIPTION
    });

    this.store.register({
      id: six_months_membership,
      alias: six_months_membership,
      type: this.store.PAID_SUBSCRIPTION
    });

    this.store.register({
      id: yearly_membership,
      alias: yearly_membership,
      type: this.store.PAID_SUBSCRIPTION
    });

    this.store.refresh();
  }

  setupListeners() {
    this.store.when('product')
    .approved((p: IAPProduct) => {
      if (p.id === one_month_membership) {
        console.log("one month approved");
      }
      else if (p.id === three_months_membership) {
        console.log("three month approved");
      }
      else if (p.id === six_months_membership) {
        console.log("six month approved");
      }
      else if (p.id === yearly_membership) {
        console.log("yearly approved");
      }
      else {
        console.log("none approved");
      }
      this.ref.detectChanges();
      return p.verify();
      p.finish();
    });
  }

on first attempt there is no problem to get products and make purchase. But if i refresh the page or revisit the page duplicates products without product info (title, description...) and shows like this ;

https://aws1.discourse-cdn.com/ionicframework/optimized/3X/d/1/d14dd6faee7e456e6b4a00e033cd4a2249a6b142_2_271x500.png

And first attemp DEBUG console like this;

ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: one_month_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: three_months_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: six_months_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: yearly_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: store.trigger -> triggering action refreshed
ion-dev.js?v=3.2.4:157 InAppBilling[js]: setup ok
ion-dev.js?v=3.2.4:157 InAppBilling[js]: load ["one_month_membership","three_months_membership","six_months_membership","yearly_membership"]
ion-dev.js?v=3.2.4:157 InAppBilling[js]: listener: {"type":"ready","data":{}}
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: plugin -> ready
ion-dev.js?v=3.2.4:157 InAppBilling[js]: getAvailableProducts()
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: plugin -> loaded - [{"skuDetailsToken":"AEuhp4IYDNsYWaeg7hzsHYLMemgd3S1iNwMp2yDY5ZumRqSVj7k5Ui_im5jiu3hRY6g=","productId":"one_month_membership","type":"subs","price":"₺14,90","price_amount_micros":14900000,"price_currency_code":"TRY","subscriptionPeriod":"P1M","title":"Aylık Abonelik (BetLiveRadar)","description":"Aylık abonelik. Sonraki ay otomatik olarak yenilenecektir."},{"skuDetailsToken":"AEuhp4IKKg8PJL6cydXa5sbYH1zkhpsYUP3O5-HFFUS33o5c0X94ishbcVOpooMwnXk=","productId":"six_months_membership","type":"subs","price":"₺65,90","price_amount_micros":65900000,"price_currency_code":"TRY","subscriptionPeriod":"P6M","title":"6 Aylık Abonelik (BetLiveRadar)","description":"6 aylık aboneliği kapsar. Süre sonunda otomatik olarak yenilenir."},{"skuDetailsToken":"AEuhp4IguDelbFVFxN3Ub11GXk7RImFXPDmmWzoy61HddV4gofD5M2ioYsBUuIx7eDU=","productId":"three_months_membership","type":"subs","price":"₺38,90","price_amount_micros":38900000,"price_currency_code":"TRY","subscriptionPeriod":"P3M","title":"3 Aylık Abonelik (BetLiveRadar)","description":"3 aylık abonelik. 3 ay sonunda otomatik yenilenir."},{"skuDetailsToken":"AEuhp4J-aihRecshlpqhnXaAZLcOPkJ7NC7TIYu-l5TiavhdYP8PDsXRoi1OP69GH2o=","productId":"yearly_membership","type":"subs","price":"₺118,90","price_amount_micros":118900000,"price_currency_code":"TRY","subscriptionPeriod":"P1Y","title":"Yıllık Abonelik (BetLiveRadar)","description":"1 yıllık aboneliği kapsar. Süre sonunda otomatik olarak yenilenir."}]
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: one_month_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: six_months_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: three_months_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: yearly_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: iabGetPurchases()
ion-dev.js?v=3.2.4:157 InAppBilling[js]: getPurchases()
ion-dev.js?v=3.2.4:157 InAppBilling[js]: listener: {"type":"setPurchases","data":{"purchases":[]}}
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: iabSetPurchases: []
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: inappbilling.getPurchases() -> Success
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:                             -> object
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:                             -> []
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: iabUpdatePurchases: []
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: store.trigger -> triggering action refresh-completed

when i refresh the page DEBUG console turned like this;

ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: one_month_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: three_months_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: six_months_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: yearly_membership -> registered
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: store.trigger -> triggering action refreshed
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> checking products state (8 products)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id one_month_membership (one_month_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'valid'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id three_months_membership (three_months_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'valid'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id six_months_membership (six_months_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'valid'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id yearly_membership (yearly_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'valid'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id one_month_membership (one_month_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'registered'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id three_months_membership (three_months_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'registered'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id six_months_membership (six_months_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'registered'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: refresh -> product id yearly_membership (yearly_membership)
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:            in state 'registered'
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: store.trigger -> triggering action re-refreshed
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: iabGetPurchases()
ion-dev.js?v=3.2.4:157 InAppBilling[js]: getPurchases()
ion-dev.js?v=3.2.4:157 InAppBilling[js]: listener: {"type":"setPurchases","data":{"purchases":[]}}
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: iabSetPurchases: []
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: inappbilling.getPurchases() -> Success
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:                             -> object
ion-dev.js?v=3.2.4:157 [store.js] DEBUG:                             -> []
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: store.trigger -> triggering action refresh-completed
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: iabUpdatePurchases: []
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: one_month_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: three_months_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: six_months_membership -> valid
ion-dev.js?v=3.2.4:157 [store.js] DEBUG: state: yearly_membership -> valid

so i really don't know how can i handle this issue. I am searching for a long time but i couldn't find any solutions about my issue.

j3k0 commented 3 years ago

You shouldn't register and refresh when opening the store page, but only once, when launching the application.