React-native-iap: Preocupação com relação a `getAvailablePurchases ()`

Criado em 11 abr. 2020  ·  11Comentários  ·  Fonte: dooboolab/react-native-iap

Versão do react-native-iap

4.4.3

Versão do react-native

0.61.6

Plataformas em que você enfrentou o erro (IOS ou Android ou ambos?)

Android

Comportamento esperado

Em primeiro lugar, obrigado por todos os esforços que você colocou para fazer e manter esta biblioteca, realmente agradeço por isso.

getAvailablePurchases() não deve devolver a assinatura que foi cancelada (não renovada)

Comportamento real

no ambiente de teste (usando conta de teste com cartão de teste), quando faço assinaturas em meu aplicativo e cancelo a assinatura antes de expiracytime (5 minutos após a compra na conta de teste), minha assinatura não será listada no resultado de getAvailablePurchases() quando o tempo de expiração é excedido. Qual é o comportamento desejado.
No entanto, se eu permitir que minha assinatura seja renovada (não cancelando antes do período de renovação) e, em seguida, cancelar depois disso, getAvailablePurchases() ainda listará minha assinatura, mesmo depois que o tempo de expiração for excedido. Minha pergunta é: por que ainda lista as assinaturas que não assinamos mais?

Além disso, quero saber os detalhes sobre getAvailablePurchases() , faz uma chamada para o faturamento do Google para recuperar as compras disponíveis? ou mantém a lista de compras localmente?

configuração de teste: https://developer.android.com/google/play/billing/billing_testing#testing -subscriptions

Ambiente testado (emulador? Dispositivo real?)

dispositivo real

Passos para reproduzir o comportamento

assinar uma assinatura, deixá-la ser renovada e, em seguida, cancelar. A assinatura ainda seria listada como compras disponíveis

🚶🏻 stale

Comentários muito úteis

@darriuk Acabei de testar o cancelamento da assinatura e confirmei que a propriedade autoRenewingAndroid está definida como false . Mas! Somente se o usuário cancelar a assinatura explicitamente. Em caso de cancelamento de assinatura devido ao pagamento recusado, a assinatura permanece ativa para sempre. Este é um grande problema com as assinaturas e não há solução alternativa. Tive uma ideia de comparar transactionDate e se esta data estiver atrasada no prazo de assinatura, cancele o serviço da minha parte. Mas parece que transactionDate é sempre a primeira data de pagamento da assinatura.

Todos 11 comentários

Eu gostaria de adicionar algumas perguntas. E se não usarmos serviços de back-end para validação. como posso entender a assinatura feita e cancelada pelo usuário. como posso lidar com isso?
Também na minha conta sandbox tem 6 produtos de assinatura. Todos eles estão ativos como pode ser possível?
PARA IOS.

A Apple sugere fortemente o uso de validação de servidor devido ao risco de ser hackeado.

Eu escrevi uma API de back-end que leva o recibo do usuário e verifica isso. Se não for encontrada nenhuma transação mais recente, significa que o usuário não se inscreveu, então estou tornando esse usuário um não premium (ou o que quer que você queira fazer). Eu chamo isso de API na abertura do aplicativo. Meu aplicativo verifica diariamente.

Também estou observando um comportamento semelhante com getAvailablePurchases . O comportamento esperado é que, depois que uma assinatura for cancelada, o método getAvailablePurchases devolverá a compra até que ela expire. Após a expiração, a compra não deve aparecer nos resultados de getAvailablePurchases (com um período de carência de 5 minutos adicionado se a expiração foi causada por falha no pagamento repetido da assinatura).

O comportamento real é que, após o cancelamento de uma assinatura, o método getAvailablePurchases retorna uma matriz contendo a compra da assinatura, _mesmo depois que o sub expira_ . A única pista de que o sub foi cancelado é que dentro do objeto SubscriptionPurchase retornado, a propriedade autoRenewingAndroid está definida como false .

Não tenho ideia de quando a compra é removida dos resultados retornados por getAvailablePurchases . Alguém sabe?

@darriuk Acabei de testar o cancelamento da assinatura e confirmei que a propriedade autoRenewingAndroid está definida como false . Mas! Somente se o usuário cancelar a assinatura explicitamente. Em caso de cancelamento de assinatura devido ao pagamento recusado, a assinatura permanece ativa para sempre. Este é um grande problema com as assinaturas e não há solução alternativa. Tive uma ideia de comparar transactionDate e se esta data estiver atrasada no prazo de assinatura, cancele o serviço da minha parte. Mas parece que transactionDate é sempre a primeira data de pagamento da assinatura.

@vkachan , pelo que me lembro, transactionDate é sempre para o primeiro pagamento da assinatura.

Uma atualização minha: executei getAvailablePurchases novamente aproximadamente 22 horas após o cancelamento da assinatura e ele finalmente está retornando um array vazio. Parece que o servidor de faturamento do Google está demorando muito para atualizar a resposta.

Vou tentar um pagamento de assinatura recusado hoje e ver quanto tempo leva para ser removido da resposta getAvailablePurchases .

ATUALIZAR
Testei o pagamento da assinatura recusada e getAvailablePurchases levou aproximadamente 32 horas para retornar um array vazio. Portanto, a compra _fica_ sendo removida eventualmente, só leva um bom tempo para acontecer.

Pode confirmar o que @darriuk está dizendo. Eu executei uma assinatura de teste, ela terminou e, em seguida, a assinatura ainda era apresentada como ativa por getAvailablePurchases por cerca de 24 horas. Talvez haja alguma maneira de forçar a recarga pelo lado do Google? 🤔

Teve problemas semelhantes, lidar com iap no lado do cliente é uma bagunça, agora usando react-native-iaphub .
Iaphub cuida da validação do recibo do servidor.

@tomerdev Como tem sido sua experiência com o iaphub? Eu estava pensando em começar a usá-lo, mas queria ver o que outro desenvolvedor acha do produto.

@captaincole Sem problemas ao usar o iaphub, implementou a biblioteca e fez uma compra no sandbox muito rápido.
Isso definitivamente me economizou muito tempo. Eu o recomendaria se você não pudesse gastar MUITO tempo cuidando do IAP, eu pessoalmente prefiro focar no meu aplicativo.

Olá, parece que não houve nenhuma atividade sobre este problema recentemente. O problema foi corrigido ou ainda requer a atenção da comunidade? Este problema pode ser resolvido se nenhuma outra atividade ocorrer. Você também pode rotular esse problema como "Para discussão" ou "Bom primeiro problema" e eu o deixarei em aberto. Obrigado por suas contribuições.

Fechar este problema após um período prolongado de inatividade. Se esse problema ainda estiver presente na versão mais recente, sinta-se à vontade para criar um novo problema com informações atualizadas.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

MacMillan13 picture MacMillan13  ·  3Comentários

makarsky picture makarsky  ·  3Comentários

sanilcgs picture sanilcgs  ·  3Comentários

safciplak picture safciplak  ·  3Comentários

schumannd picture schumannd  ·  3Comentários