React-native-iap: Обеспокоенность по поводу `getAvailablePurchases ()`

Созданный на 11 апр. 2020  ·  11Комментарии  ·  Источник: dooboolab/react-native-iap

Версия react-native-iap

4.4.3

Версия react-native

0,61,6

Платформы, на которых вы столкнулись с ошибкой (IOS или Android или оба?)

Android

Ожидаемое поведение

Прежде всего, спасибо за все усилия, которые вы приложили для создания и поддержки этой библиотеки, очень признательны.

getAvailablePurchases() не должен возвращать отмененную (не продленную) подписку.

Фактическое поведение

в тестовой среде (с использованием тестовой учетной записи с тестовой картой), когда я делаю подписку в своем приложении и отменяю подписку до expiracytime (через 5 минут после покупки в тестовой учетной записи), моя подписка не будет отображаться в результате getAvailablePurchases() при превышении срока годности. Это желаемое поведение.
Однако, если я позволю своей подписке продлеваться (не отменяя ее до периода продления), а затем отменю ее после этого, getAvailablePurchases() все равно будет отображать мою подписку, даже после того, как истечет срок действия. Мой вопрос: почему в нем все еще отображается подписка, на которую я больше не подписан?

Кроме того, я хочу узнать подробности о getAvailablePurchases() , вызывает ли он вызов в Google billing для получения доступных покупок? или он хранит список покупок локально?

настройка теста: https://developer.android.com/google/play/billing/billing_testing#testing -subscriptions

Протестированная среда (Эмулятор? Настоящее устройство?)

реальное устройство

Шаги по воспроизведению поведения

подпишитесь на подписку, дайте ей продлить, а затем отмените. Подписка по-прежнему будет отображаться в списке доступных покупок.

🚶🏻 stale

Самый полезный комментарий

@darriuk Я только что протестировал отмену подписки и подтвердил, что для свойства autoRenewingAndroid установлено значение false . Но! Только если пользователь явно отменяет подписку. В случае отмены подписки из-за отклонения платежа, подписка остается активной навсегда. Это действительно большая проблема с подписками, и ее нет. У меня возникла идея сравнить transactionDate и если эта дата отстает от срока подписки, то отменить услугу на моей стороне. Но похоже, что transactionDate всегда первая дата оплаты подписки.

Все 11 Комментарий

Я хотел бы добавить пару вопросов. Что, если мы не будем использовать серверные службы для проверки. как я могу понять, что подписка была сделана и отменена пользователем. как я могу справиться с этим ?.
Также в моей песочнице есть 6 продуктов по подписке. Все они активны, как это возможно?
ДЛЯ iOS.

Apple настоятельно рекомендует использовать проверку сервера из-за риска взлома.

Я написал серверный API, который принимает квитанцию ​​пользователя и проверяет это. Если последняя транзакция не обнаружена, это означает, что пользователь не подписался, поэтому я делаю этого пользователя не-премиумом (или как вы хотите). Я вызываю этот API при открытии приложения. Мое приложение проверяет ежедневно.

Я также наблюдаю подобное поведение с getAvailablePurchases . Ожидаемое поведение заключается в том, что после отмены подписки метод getAvailablePurchases должен возвращать покупку до истечения срока ее действия. По истечении срока покупка не должна отображаться в результатах getAvailablePurchases (с добавлением льготного периода в 5 минут, если истечение срока было вызвано отказом от повторной оплаты подписки).

Фактическое поведение заключается в том, что после отмены подписки метод getAvailablePurchases возвращает массив, содержащий покупку подписки, _ даже после истечения срока подписки_ . Единственный ключ , что к югу отменяется, что в возвращаемый SubscriptionPurchase объект по autoRenewingAndroid свойство имеет значение false .

Я понятия не имею, когда покупка удаляется из результатов, возвращаемых getAvailablePurchases . Кто-нибудь знает?

@darriuk Я только что протестировал отмену подписки и подтвердил, что для свойства autoRenewingAndroid установлено значение false . Но! Только если пользователь явно отменяет подписку. В случае отмены подписки из-за отклонения платежа, подписка остается активной навсегда. Это действительно большая проблема с подписками, и ее нет. У меня возникла идея сравнить transactionDate и если эта дата отстает от срока подписки, то отменить услугу на моей стороне. Но похоже, что transactionDate всегда первая дата оплаты подписки.

@vkachan, насколько я помню, transactionDate действительно всегда для первой оплаты подписки.

Одно обновление от меня: я снова запустил getAvailablePurchases примерно через 22 часа после отмены подписки, и, наконец, он возвращает пустой массив. Похоже, что биллинговому серверу Google требуется время, чтобы обновить ответ.

Я собираюсь попробовать отклоненный платеж по подписке сегодня и посмотреть, сколько времени займет удаление из ответа getAvailablePurchases .

ОБНОВИТЬ
Я протестировал отклоненный платеж по подписке, и getAvailablePurchases потребовалось около 32 часов, чтобы вернуть пустой массив. Таким образом, покупка в конечном итоге будет удалена, это займет некоторое время.

Могу подтвердить, что говорит @darriuk . Я запустил тестовую подписку, она закончилась, а затем подписка все еще отображалась как активная с getAvailablePurchases течение примерно 24 часов. Может, есть способ принудительной перезагрузки со стороны Google? 🤔

Были аналогичные проблемы, обработка iap на стороне клиента - беспорядок, теперь используется react-native-iaphub .
Iaphub заботится о проверке получения сервера.

@tomerdev Каким был ваш опыт работы с iaphub? Я думал о том, чтобы перейти на его использование, но хотел узнать, что другой разработчик думает об этом продукте.

@captaincole Нет проблем с использованием iaphub, довольно быстро реализовал библиотеку и приобрел песочницу.
Это определенно сэкономило мне много времени. Я бы порекомендовал это, если вы не можете тратить много времени на IAP, я лично предпочитаю сосредоточиться на своем приложении.

Привет, похоже, в последнее время не было никакой активности по этой проблеме. Проблема устранена или все еще требует внимания сообщества? Эта проблема может быть закрыта, если больше не будет никаких действий. Вы также можете пометить этот вопрос как «Для обсуждения» или «Хороший первый выпуск», и я оставлю его открытым. Спасибо за ваш вклад.

Закрытие этого вопроса после длительного периода бездействия. Если эта проблема все еще присутствует в последней версии, вы можете создать новую проблему с актуальной информацией.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги