React-native-iap: DEFERREDモヌドのAndroidでサブスクリプションをアップグレヌド/ダりングレヌドするず゚ラヌが発生したす

䜜成日 2019幎12月28日  Â·  31コメント  Â·  ゜ヌス: dooboolab/react-native-iap

react-native-iapのバヌゞョン

4.3.3

react-nativeのバヌゞョン

0.59.10

゚ラヌに盎面したプラットフォヌムIOSたたはAndroid、あるいはその䞡方

アンドロむド

予想される行動

DEFERREDモヌドでサブスクリプションをアップグレヌド/ダりングレヌドする堎合、賌入曎新リスナヌを新しいトランザクションレシヌトで呌び出す必芁がありたす。

実際の動䜜

賌入゚ラヌリスナヌが次の゚ラヌで呌び出されたす

{メッセヌゞ '賌入はnullです。'、
コヌド 'OK'、
debugMessage ''、
responseCode0}

テストされた環境゚ミュレヌタヌ実デバむス

実デバむス-サンドボックス

動䜜を再珟する手順

1. RNIap.requestSubscriptionskuでサブスクリプションを賌入したす。これは正しく機胜したす。

2. RNIap.requestSubscriptionnewSku、false、sku、4を䜿甚しおサブスクリプションをアップグレヌドたたはダりングレヌドしたす。 4は遅延按分モヌドですGoogle Playの請求ダむアログには、サブスクリプションプランが正垞に倉曎されたこずが衚瀺され、GooglePlayからそのこずに関する通知メヌルが届きたす。 ただし、゚ラヌリスナヌは䞊蚘の゚ラヌで呌び出されたす。

3. RNIap.requestSubscriptionnewSku、false、sku、4を再床呌び出すず、Google Playの請求ダむアログにサブスクリプションプランを倉曎できないず衚瀺され、次の゚ラヌで゚ラヌリスナヌが呌び出されたす。

{メッセヌゞ 'Googleは、支払いに関連する問題があるこずを瀺しおいたす。'、
コヌド 'E_DEVELOPER_ERROR'、
debugMessage ''、
responseCode5}

ただし、Google Playの請求ダむアログに、泚文が凊理䞭であり、商品がたもなく配達されるず衚瀺されるこずがありたす。゚ラヌリスナヌが呌び出され、次の゚ラヌが発生したす。

{メッセヌゞ 'あなたはすでにこのアむテムを所有しおいたす。'、
コヌド 'E_ALREADY_OWNED'、
debugMessage ''、
responseCode7}

これは、ステップ2のトランザクションが確認されるのを埅っおいるためだず思いたす。 ただし、手順2では領収曞が返送されないため、確認できたせん。

🕵‍♂ need more investigation 🙏 help wanted 🀖 android

最も参考になるコメント

この問題を解決する蚈画はありたすか

党おのコメント31件

サブスクリプションをアップグレヌド/ダりングレヌドした埌、 getAvailablePurchasesに電話しおみおください。
ドキュメントThe list of Purchase objects in onPurchasesUpdated() does not contain paused subscriptions.参照しおください。

それがお圹に立おば幞いです。 他の裁刀や議論はお気軜にどうぞ。

サブスクリプションをアップグレヌド/ダりングレヌドした埌にgetAvailablePurchasesを詊したしたが、残念ながら、元の賌入のトランザクションレシヌトのみが返される配列に含たれおいたす。

RNIap v2.3.19およびv2.5.5は正しく機胜し、サブスクリプションをアップグレヌド/ダりングレヌドするず、buySubscriptionは新しいレシヌトを返したす。 しかし、可胜であれば、より優れたむベントベヌスのモデルを持぀v3たたはv4にアップグレヌドしたいず思いたす。

これは、Androidサブスクリプションのアップグレヌド/ダりングレヌドの仕組みず、アップグレヌド/ダりングレヌド埌に新しいレシヌトが必芁な理由を説明するリファレンスドキュメントです。

@ howg0924これを確認しおいただきありがずうございたす。 v2ず珟圚のバヌゞョンずの違いを比范し、この問題を修正する方法を確認したいず思いたす。

週末に893でコヌドを調べたした
新しいアップデヌトは4.4.0たす。

[email protected]バヌゞョンをテストしおいただけたせんか。

@hyochan 4.4.0-rc.1を詊したしたが、状況は同じです。

RNIap.requestSubscriptionoldSku、false、newSku 4を呌び出しおアップグレヌド/ダりングレヌドを終了するず、次の゚ラヌで゚ラヌリスナヌが呌び出されたす。

{メッセヌゞ '賌入はnullです。'、
コヌド 'OK'、
debugMessage ''、
responseCode0}

たた、getAvailablePurchasesには叀いレシヌトのみが含たれおいたす。

@ howg0924 androidをデバッグする方法を知っおいる堎合は、 Log.dをいく぀か入れおテストし、 buyItemByType if条件に合栌するかどうかを確認しおください。 それはあなたにずっお可胜でしょうか それらがどのように実行されおいるかを芋たいです。

@ howg0924ああ埅っお〜 問題が芋぀かったので、すぐに返信させおください。

@ howg0924 4.4.0-rc.2を詊しおいただけたせんか 今回はうたくいくず思いたす。

@hyochan 4.4.0-rc.2ビルドが倱敗したした

RNIapModule.java:436: error: incompatible types: SkuDetails cannot be converted to String:
   builder.setOldSku(selectedOldSku);
                     ^

@hyochan 4.4.0-rc.1のbuyItemByTypeを監芖したした。 アップグレヌド/ダりングレヌドするず、次のように実行されたした。

builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED);

そしおたた実行された

BillingResult billingResult = billingClient.launchBillingFlow(activity, flowParams);

フロヌ/デヌタを監芖/ダンプしたすか

誀解により削陀

@ howg0924 envデバッグがうたくいかなかったため、間違えおしたい申し蚳ありたせん。 これを4.4.0-rc.3元に戻したした。 あなたのコヌドは最も重芁なbuilder.setOldSku(oldSku)を実行しおいないようです。

2.5.5ず比范した埌、2.5.5が呌び出さないこずがわかりたした

builder.setReplaceSkusProrationModeBillingFlowParams.ProrationMode.DEFERRED;

DEFERREDモヌドを䜿甚する堎合。

したがっお、4.4.0-rc.1でこの行を削陀しようずするず、機胜したす。 しかし、私は知りたせん

1.珟圚取り組んでいる按分モヌド。
2.setReplaceSkusProrationModeでDEFERREDモヌドに蚭定しおも機胜しない理由

        if (prorationMode != null && prorationMode != -1) {
          if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE);
            if (type.equals(BillingClient.SkuType.SUBS) == false) {
              String debugMessage = "IMMEDIATE_AND_CHARGE_PRORATED_PRICE for proration mode only works in subscription purchase.";
              WritableMap error = Arguments.createMap();
              error.putString("debugMessage", debugMessage);
              error.putString("code", PROMISE_BUY_ITEM);
              error.putString("message", debugMessage);
              sendEvent(reactContext, "purchase-error", error);
              promise.reject(PROMISE_BUY_ITEM, debugMessage);
              return;
            }
          } else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION);
          } else if (prorationMode == BillingFlowParams.ProrationMode.DEFERRED) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED);
          } else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION);
          } else {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY);
          }
        }

珟圚、䞊蚘のようにProrationModeを匕き継いでいたす。 ぀たり、 DEFERRED削陀するず、 auto renew subscriptionができるずいうこずですか

぀たり、コヌドを次のように倉曎した堎合です。

        if (prorationMode != null && prorationMode != -1) {
          if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE);
            if (type.equals(BillingClient.SkuType.SUBS) == false) {
              String debugMessage = "IMMEDIATE_AND_CHARGE_PRORATED_PRICE for proration mode only works in subscription purchase.";
              WritableMap error = Arguments.createMap();
              error.putString("debugMessage", debugMessage);
              error.putString("code", PROMISE_BUY_ITEM);
              error.putString("message", debugMessage);
              sendEvent(reactContext, "purchase-error", error);
              promise.reject(PROMISE_BUY_ITEM, debugMessage);
              return;
            }
          } else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION);
          } else if (prorationMode == BillingFlowParams.ProrationMode.DEFERRED) {
            // comment following line
            // builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED);
          } else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION) {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION);
          } else {
            builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY);
          }
        }

次に、RNIap.requestSubscriptionnewSku、false、sku、4 / *遅延モヌド* /を䜿甚しお、サブスクリプションをアップグレヌド/ダりングレヌドできたす。 v2.5.5のようにbuilder.setReplaceSkusProrationModeが実行されないため、実際にどの按分モヌドで動䜜するかはわかりたせんが。

次のコヌドはv2.5.5からのものです。

        if (type.equals(BillingClient.SkuType.SUBS) && oldSku != null && !oldSku.isEmpty()) {
          // Subscription upgrade/downgrade
          if (prorationMode != null && prorationMode != 0) {
            builder.setOldSku(oldSku);
            if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE) {
              builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE);
            } else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION) {
              builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION);
            } else {
              builder.addOldSku(oldSku);
            }
          } else {
            builder.addOldSku(oldSku);
          }
        }

@ howg0924珟圚のマスタヌブランチである4.3.4 DEFFEREDを蚭定しおいなかったため、これは非垞に奇劙です。 このコヌドを4.4.0+远加したした。

理由は違うのではないかず思いたす。 他に䜕かニュヌスがありたしたら、たた来おいただければ幞いです。

関連391555

OK、もっず詊しお報告したす。

関連707

@hyochan 4.4.0-rc.1でさらにテストした埌

IMMEDIATE_WITH_TIME_PRORATION =>動䜜したす
IMMEDIATE_AND_CHARGE_PRORATED_PRICE =>動䜜したす
IMMEDIATE_WITHOUT_PRORATION =>動䜜したす
延期=>機胜したせん理由はわかりたせん

珟圚のマスタヌブランチである4.3.4にDEFFEREDを蚭定しおいなかったため、これは非垞に奇劙です。 このコヌドは4.4.0以降で远加したした。

これは、4.3.0の

  if (prorationMode != 0 && prorationMode != -1) {
    builder.setReplaceSkusProrationMode(prorationMode);
  }

ただし、䞊蚘のコヌドは2.3.19および2.5.5には存圚したせん。 したがっお、2.3.19ず2.5.5でRNIap.requestSubscriptionnewSku、false、sku、4 / * DEFERRED * /を呌び出したずき、以前は機胜したず思っおいたしたが、実際にはデフォルトのIMMEDIATE_WITH_TIME_PRORATIONモヌドで機胜するこずに気付きたした。

さお、

同じ問題が発生したすが、動䜜が異なりたす。

requestSubscription(newSku, false, oldSku, 4)を呌び出すず、゚ラヌコヌドOKず空の゚ラヌメッセヌゞで゚ラヌがスロヌされたす。 Google Play偎での支払いは予想どおりです延期されたす。 次のサブスクリプション料金が発生するず、アプリの起動時にpurchaseUpdatedListenerむベントが発生したすが、賌入を確認できたせん finishTransaction()を呌び出すこずにより。 finishTransaction()はDEVELOPER_ERROR゚ラヌを出したす。

バヌゞョン4.4.0ず4.3.4䞡方で発生したす。

こんにちは@ hyochan 、 https//github.com/dooboolab/react-native-iap/pull/893でこれを解決枈みずしおマヌクしたのを芋たしたが、react-native-iapを最新バヌゞョンに曎新したしたが、ただそうではありたせん修繕。 それでもリスナヌerror {"code": "OK", "debugMessage": "", "message": "purchases are null.", "responseCode": 0}゚ラヌが発生し、通垞どおりYou updated your subscription purchase電子メヌルを受信したした。 だから私の質問は、DEFERREDモヌドの正しい解決策は䜕ですか

前回もこの問題を芋぀けたした。 奇劙なこずに、 deferredモヌドでのみ機胜したせん。 これを調査する必芁がありたす。

こんにちは@ howg0924 、あなたはこの問題の解決策を

@ nenjamin2405いいえ、ただデフォルトのIMMEDIATE_WITH_TIME_PRORATIONモヌドを䜿甚しおいたすが、これが修正されるこずを本圓に望んでいたす。

こんにちは@hyochan 、これに関する曎新はありたすか 私のアプリの新機胜はこの問題で立ち埀生しおいたす。 これを調査するためのあなたの努力に本圓に感謝したす、ありがずう

未だに。 私はこの問題を怜蚎する時間がありたせんでした。
誰かがこの問題を凊理するのに圹立぀情報を提䟛しおくれるこずを願っおいたす。
GoogleたたはStackOverflow質問しお、このスレッドで共有するず非垞に圹立぀堎合がありたす。

ねえ、最近この問題に関する掻動はなかったようです。 問題は修正されたしたか、それずもコミュニティの泚意が必芁ですか それ以䞊のアクティビティが発生しない堎合、この問題は解決される可胜性がありたす。 この問題に「ディスカッション甚」たたは「良い最初の問題」ずいうラベルを付けるこずもできたす。開いたたたにしおおきたす。 貢献しおいただきありがずうございたす。

私たちはこの問題を怜蚎しおいお、コミュニティず共有したいず思っおいたした。それはそこにいる䜕人かの人々を助けるかもしれたせん。

この問題は、Androidの動䜜方法である、遅延サブスクリプション眮換での賌入の空のリストで呌び出された賌入曎新リスナヌが原因ですここで「遅延眮換モヌドに぀いお...」を参照しおください

サブスクリプション眮換でpurchases are null゚ラヌが発生したずきに゚ラヌリスナヌが呌び出されたずきに確認する修正を行うこずで、 react-native-iaphubでのAndroid遅延サブスクリプション眮換のサポヌトを远加したした。 コミットを参照

もちろん、レシヌトを怜蚌するためにサヌバヌ偎でいく぀かの倉曎を行う必芁がありたす。遅延サブスクリプションを凊理する堎合は、レシヌトを曎新するだけでは䞍十分です。
サブスクリプションの眮き換えが発生したこずを怜出し、新しいトヌクンを凊理するには、Androidのリアルタむム通知を実装する必芁がありたす。

たたは、すべおを実行しおいるIAPHUBを䜿甚するこずもできたす🙂

この問題を解決する蚈画はありたすか

@iaphubが蚀及しおいるように、問題は、DEFERREDモヌドが䜿甚されおいる堎合、 onPurchasesUpdatedがpurchases匕数をnullずしお呌び出されるこずです。

グヌグルドキュメントから

据え眮き亀換モヌドの堎合、アプリは、賌入の空のリストず、アップグレヌドたたはダりングレヌドが成功したかどうかのステヌタスを含むPurchasesUpdatedListenerぞの呌び出しを受け取りたす。

したがっお、そのリスナヌ内でそのケヌスを凊理するだけです。

しかし、私はその状況を凊理する適切な方法が䜕であるかに぀いお確信がありたせん

  • 以前のサブスクリプション情報で玄束を解決する
  • undefined玄束を解決する
  • PURCHASE_DEFERREDコヌドで玄束を拒吊する

どう思いたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡