React-native-iap: خطأ عند ترقية / الرجوع إلى إصدار أقدم للاشتراك على Android مع وضع DEFERRED

تم إنشاؤها على ٢٨ ديسمبر ٢٠١٩  ·  31تعليقات  ·  مصدر: dooboolab/react-native-iap

نسخة من رد فعل - أصلية - IAP

4.3.3

نسخة من رد الفعل الأصلي

0.59.10

المنصات التي واجهت الخطأ فيها (IOS أو Android أو كليهما؟)

ذكري المظهر

سلوك متوقع

عند ترقية / تخفيض الاشتراك باستخدام الوضع DEFERRED ، يجب استدعاء مستمع تحديث الشراء بإيصال المعاملة الجديد.

السلوك الفعلي

تم استدعاء مستمع خطأ الشراء بالخطأ التالي:

{message: "المشتريات لاغية."،
الكود: "موافق" ،
debugMessage: "" ،
رمز الاستجابة: 0}

بيئة اختبار (محاكي؟ جهاز حقيقي؟)

جهاز حقيقي - رمل

خطوات إعادة إنتاج السلوك

1.اشتر اشتراكًا مع RNIap.requestSubscription (sku) ، هذا يعمل بشكل صحيح.

2- قم بترقية الاشتراك أو خفضه باستخدام RNIap.requestSubscription (newSku، false، sku، 4). (4 هو DEFERRED Proration Mode) سيظهر مربع حوار فوترة Google Play أن خطة الاشتراك قد تم تغييرها بنجاح ، وستتلقى إشعارًا بالبريد الإلكتروني من Google Play حول ذلك. ومع ذلك ، يتم استدعاء مستمع الخطأ بالخطأ المذكور أعلاه.

3- إذا اتصلت بـ RNIap.requestSubscription (newSku، false، sku، 4) مرة أخرى ، سيقول مربع حوار فوترة Google Play أنه لا يمكنهم تغيير خطة الاشتراك ، وسيتم استدعاء مستمع الخطأ مع الخطأ التالي:

{message: "تشير Google إلى أن لدينا بعض المشكلات المتعلقة بالدفع."،
الكود: "E_DEVELOPER_ERROR" ،
debugMessage: "" ،
رمز الاستجابة: 5}

لكن في بعض الأحيان ، يشير مربع حوار الفوترة في Google Play إلى أن طلبك قيد المعالجة وأنه يجب تسليم منتجك قريبًا ، ويتم استدعاء مستمع الخطأ مع الخطأ التالي:

{message: "أنت تمتلك هذا العنصر بالفعل."،
الكود: "E_ALREADY_OWNED" ،
debugMessage: "" ،
رمز الاستجابة: 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 () إيصالًا جديدًا عند ترقية الاشتراك / الرجوع إلى إصدار سابق. لكني أرغب في الترقية إلى الإصدار 3 أو الإصدار 4 الذي يحتوي على نموذج أفضل يعتمد على الأحداث إن أمكن.

فيما يلي مستند مرجعي يشرح كيفية عمل ترقية / الرجوع إلى إصدار أقدم من اشتراك Android ولماذا نحتاج إلى الإيصال الجديد بعد الترقية / الرجوع إلى إصدار أقدم.

@ howg0924 شكرا لتأكيد هذا. أود مقارنة الاختلافات مع الإصدار 2 والإصدار الحالي الخاص بنا ومعرفة كيف يمكنني إصلاح هذه المشكلة.

لقد بحثت عن الشفرة في عطلة نهاية الأسبوع من أجلك في رقم 893
التحديث الجديد سيبدأ في 4.4.0 .

هل يمكنك التفضل باختبار إصدار [email protected] ؟

hyochan لقد حاولت للتو 4.4.0-rc.1 ، لكن الوضع لا يزال كما هو.

بعد استدعاء RNIap.requestSubscription (oldSku ، false ، newSku 4) والانتهاء من الترقية / الرجوع إلى إصدار أقدم ، يتم استدعاء مستمع الأخطاء مع الخطأ التالي:

{message: "المشتريات لاغية."،
الكود: "موافق" ،
debugMessage: "" ،
رمز الاستجابة: 0}

وتحتوي getAvailablePurchases () على إيصال قديم فقط.

@ howg0924 إذا كنت تعرف كيفية تصحيح أخطاء android ، آمل أن تختبر وضع بعض Log.d ومعرفة ما إذا كانت if شروط buyItemByType . هل هذا ممكن بالنسبة لك؟ أريد أن أرى كيف يتم إعدامهم.

@ 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 لقد راقبت buyItemByType () من 4.4.0-rc.1. عند الترقية / الرجوع إلى إصدار أقدم ، تم تنفيذ:

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. ما وضع proration الذي يعمل عليه الآن.
2.لماذا لا يعمل عند التعيين على الوضع DEFERRED بواسطة setReplaceSkusProrationMode ()

        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 النحو الوارد أعلاه. فهل هذا يعني أنه يمكنك auto renew subscription عندما تقوم بإزالة 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) {
            // 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 / * DEFERRED mode * /) لترقية / تقليل الاشتراك. على الرغم من أنني لست متأكدًا من وضع الاسترجاع الذي يعمل عليه بالفعل منذ أن لم يتم تنفيذ builder.setReplaceSkusProrationMode () ، كما فعل v2.5.5.

الكود التالي من 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 حسنًا ، هذا غريب جدًا لأننا لم نقم حتى بتعيين DEFFERED في فرعنا الرئيسي الحالي وهو 4.3.4 . لقد أضفت هذا الرمز في 4.4.0+ .

أعتقد أن السبب قد يكون شيئًا مختلفًا. آمل أن تتمكن من العودة إذا كان هناك بعض الأخبار الأخرى.

ذات الصلة # 391 # 555

حسنًا ، سأحاول أكثر وسأبلغ.

ذات الصلة # 707

hyochan بعد إجراء مزيد من الاختبارات على 4.4.0-rc.1:

IMMEDIATE_WITH_TIME_PRORATION => يعمل
IMMEDIATE_AND_CHARGE_PRORATED_PRICE => يعمل
IMMEDIATE_WITHOUT_PRORATION => يعمل
مؤجلة => لا تعمل (لا أعرف لماذا)

حسنًا ، هذا غريب جدًا لأننا لم نقم بتعيين DEFFERED في فرعنا الرئيسي الحالي وهو 4.3.4. لقد أضفت هذا الرمز في 4.4.0+.

أعتقد أن هذا بسبب الكود التالي في 4.3.0 لا يزال يعينه على الوضع DEFERRED:

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

ومع ذلك ، لا يوجد الرمز أعلاه في 2.3.19 و 2.5.5. لذلك ، عندما اتصلت بـ RNIap.requestSubscription (newSku ، false ، sku ، 4 / * DEFERRED * /) في 2.3.19 و 2.5.5 ، اعتقدت أنه يعمل من قبل ، لكنني أدركت الآن أنه يعمل بالفعل على الوضع الافتراضي IMMEDIATE_WITH_TIME_PRORATION.

حسنًا ، لذا يجب أن نعرف لماذا لا يعمل Deffered . لم أتمكن من العثور على السبب الآن.

لدي نفس المشكلة ولكن السلوك مختلف.

عندما أتصل بـ 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 ، قمت بتمييز هذا على أنه تم حله ولكنني قمت بتحديث رد الفعل الأصلي إلى أحدث إصدار ولكن هذا الإصدار لم يكن كذلك مثبت. ما زلت أتلقى خطأ في المستمع 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 (انظر هنا "للحصول على وضع الاستبدال المؤجل ...")

أضفنا دعم استبدال الاشتراك المؤجل في android على رد فعل - أصلي - iaphub عن طريق إجراء إصلاح بالنظر عندما يتم استدعاء مستمع الخطأ مع الخطأ purchases are null عند استبدال الاشتراك. ( انظر الالتزام )

بالطبع سيتعين عليك إجراء بعض التعديلات على جانب الخادم الخاص بك للتحقق من صحة الإيصالات أيضًا ، ولا يكفي تحديث الإيصال عند التعامل مع الاشتراكات المؤجلة.
سيتعين عليك تنفيذ إشعارات Android في الوقت الفعلي لاكتشاف وقت حدوث استبدال الاشتراك ومعالجة رمز جديد.

أو يمكنك فقط استخدام IAPHUB الذي يقوم بكل ذلك من أجلك 🙂

أي خطط لحل هذه المشكلة؟

كما يذكر iaphub ، فإن المشكلة هي أن onPurchasesUpdated يتم استدعاؤه بواسطة الوسيطة purchases كـ null عند استخدام الوضع DEFERRED.

من مستندات جوجل :

بالنسبة إلى وضع الاستبدال المؤجل ، يتلقى تطبيقك مكالمة إلى قائمة مشترياتك المُحدَّثة بقائمة فارغة من المشتريات وحالة ما إذا كانت الترقية أو الرجوع إلى إصدار أقدم كانت ناجحة.

لذا فهي مجرد مسألة التعامل مع هذه الحالة داخل ذلك المستمع.

لكنني غير متأكد من الطريقة الصحيحة للتعامل مع هذا الموقف:

  • حل الوعد بمعلومات الاشتراك السابقة
  • حل الوعد بـ undefined
  • رفض الوعد برمز PURCHASE_DEFERRED

ما رأيك؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات