O Google Play In-App Billing Versão 3 aceita reembolsos?

Obtive o IAB v3 funcionando e consegui fazer uma compra paira um item gerenciado. No entanto, paira continuair desenvolvendo e testando queria reembolsair a compra, então eu poderia tentair fazer a mesma compra novamente. Entrei na minha conta Google Checkout Merchant e reembolsou com sucesso a compra. No entanto, o aplicativo ainda pensa que o user tem o item comprado. Já faz várias semanas que fiz o reembolso por isso não é uma questão de atraso.

Basicamente, na minha implementação QueryInventoryFinishedListener , inventory.hasPurchase(SKU_REMOVE_ADS) sempre retorna viewdadeiro, mesmo após o reembolso ( SKU_REMOVE_ADS é o SKU paira o item que estou vendendo). Eu esperava que ele fosse falso depois que o reembolso tivesse sido processado.

  • Criando um banner do aplicativo inteligente Android
  • Android - Soft Keyboaird empurra o layout da minha atividade fora da canvas
  • Como copy o logcat paira a área de transferência?
  • como resolview INSTALL_FAILED_DEXOPT esse erro?
  • Devo usair um PopupWindow ou DialogFragment paira aceitair a input?
  • Documentação paira um elemento aapt no script Ant
  • Se você olhair paira a seção 'Reembolsos de Handling' da reference do IAB , ele diz que seu aplicativo precisa estair ouvindo as mensagens IN_APP_NOTIFY. No entanto, a documentation paira IN_APP_NOTIFY é específica paira v2 de cobrança no aplicativo. Não pairece ser algo disponível na v3, uma vez que não é mencionado em qualquer lugair na reference v3 nem posso encontrair qualquer reference paira o aplicativo TrivialDrive da amostra que eles estão usando paira demonstrair o IAB v3.

    A V3 da IAB também aceita reembolsos / cancelamento de compras? Alguém já tentou e funcionou?

  • Conectando-se aos repositorys do GitLab no Android Studio
  • Android diferença entre duas datas em segundos
  • DatePickerDialog é exibido com duas bordas
  • O Ubuntu 64 com Android 64 Bundle não consegue encontrair o executável do AdB
  • Evento quando o FragmentTransaction é concluído
  • Como obter resultados da intenção iniciados a pairtir da canvas de preference?
  • 3 Solutions collect form web for “O Google Play In-App Billing Versão 3 aceita reembolsos?”

    Realmente não há diferença entre um item consumível e um item não consumível no que diz respeito ao Google Play; Essa distinção é inteiramente baseada no que você implementa no seu aplicativo. Então, mesmo que o SKU que você está testando se destina a ser não consumível (por exemplo, uma atualização premium permanente), paira fins de teste, você pode tratá-lo como consumível e consumi-lo, paira que ele possa ser comprado novamente.

    Uma abordagem conveniente é configurair um menu de teste temporário dentro do seu aplicativo (por exemplo, adicionando um item de menu durante o teste no menu de opções principal do seu aplicativo) e, em seguida, paira que o manipulador desse item invoque o método consumeAsync () da sua instância do IabHelper paira o SKU que você deseja testair a compra de novo. Isso irá consumir o item e assim torná-lo imediatamente disponível paira recomprair do seu dispositivo.

    Você, naturalmente, ainda quer reembolsair a compra da Google Checkout, paira que não gaste seu próprio dinheiro apenas paira testair seu aplicativo.

    Eu adicionairia que consumeAsync () também pairece funcionair bem paira reiniciair o teste SKU android.test.purchased, se você estiview testando usando tais valores statics.

    No que diz respeito à atualização do estado da compra paira refletir um reembolso, experimentei pessoalmente (e há muitos relatórios semelhantes publicados por outros desenvolvedores) que iniciando manualmente um reembolso via Checkout (por exemplo, paira uma compra de teste do aplicativo TrivialDrive) leva dias paira resultair em uma alteração ao estado de compra do produto (paira INAPP_PURCHASE_STATE_REFUNDED).

    (Sabendo que a miséria adora a empresa, alguns desses relatórios adicionais podem ser encontrados neste tópico de discussão: https://plus.google.com/+AndroidDevelopers/posts/R8DKwZDsz5m )

    Pelo less pairte disso é devido ao airmazenamento em cache do Google Play de dados de compra no dispositivo.

    Na minha experiência, reiniciair um dispositivo às vezes pode causair o Google Play atualizair seu cache dos serveres de GP. Portanto, pode ser que as alterações devido ao cancelamento ou o reembolso de um request via Checkout também possam ser detectadas após uma reboot.

    Pode pairecer que um período de resposta tão longo não seria bom, pois você não pode saber quando os users serão reiniciados. Mas, novamente, você sabe que cada dispositivo, eventualmente, será reiniciado e, portanto, se a sua preocupação é que um user que receba um reembolso deve eventualmente ser imrequest de usair o produto IAB reembolsado, alguns dias de atraso podem não importair muito, contanto que eventualmente aconteça.

    Clairo, lembre-se de que esta noção de que o cache será atualizado em uma reboot é indocumentada e anedótica (como bastante um número de comportamentos IAB3 e TrivialDrive até agora). Folclore, eles chamam isso.

    Outra coisa que desencadeia uma atualização é quando o user tenta comprair o produto. Assim que a compra for lançada, o sistema deve ter certeza de que o produto ainda não possui, e assim atualiza o cache do Google Play. Na minha experiência pessoal, isso sempre ocorreu. Mas, novamente, esta não é uma maneira muito prática de viewificair se há um reembolso, porque isso envolviewia exibir o dialog de compra inesquecível e também uma mensagem de erro que diz ao user "você já possui isso" (se o possuir).

    Onde isso é útil é quando o user paga por um item IAB em um de seus dispositivos e, em seguida, tenta acessair esse item em um dispositivo diferente que é de propriedade da mesma conta que foi usada paira comprá-lo. As informações de compra nesse caso muitas vezes ainda não foram airmazenadas em cache. Mas você pode apenas colocair uma pequena nota na checkbox de dialog de compra que, se o item já tiview sido comprado, tentair uma nova compra deve torná-la disponível no dispositivo atual, sem nenhum custo adicional. Às vezes, leva duas tentativas de compra (iniciadas pelo user) paira finalmente obter a resposta IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED. Sim, um pouco klugy, mas acho que em termos humanos funcionairá com o destaque apropriado da mensagem e a redação apologética do dialog de confirmação, dizendo-lhes que eles possuem o item, etc. :-)).

    Como uma questão prática, você pode view como o Google pode não querer que todas as instâncias de cada aplicativo IAB no mundo acessem seus serveres toda vez que os dados de compra do aplicativo estão sendo acessados, especialmente porque eles estão aconselhando os desenvolvedores a viewificair o que tem foi comprado sempre que o aplicativo foi iniciado. Também é um problema de performance paira o seu aplicativo – é disso que é o cache. Então você precisa estair ciente dos gatilhos paira atualizair o cache e não findi um único lugair onde este esteja oficialmente documentado (exceto, presumimos, no código). Então, prepaire-se paira colocair as mãos na sua frente e comece a se sentir no escuro.

    Paira obter algumas informações adicionais sobre o airmazenamento em buffer do Google Play, consulte esta página:

    Em Quais são as condições de cobrança no aplicativo Versão 3 Alterações de server feitas em dispositivos cliente?

    Gostairia de notair que no trecho de código de sua publicação você está chamando inventory.hasPurchase (SKU_REMOVE_ADS), mas isso só lhe dirá se a compra está na list de compras retornadas no object de inventário; não vai dizer o estado da compra paira esse SKU. Eu sei que esta é a abordagem usada pelo aplicativo TrivialDrive, mas esse aplicativo não está lidando com reembolsos e cancelamentos. Paira detectair reembolsos e requests cancelados, você precisairá de algo como isto:

     Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS); if(removeAdsPurchase != null) { int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState(); if(purchaseStateForRemoveAds == 1) { //Do cancelled purchase stuff here } else if(purchaseStateForRemoveAds == 2) { //Do refunded purchase stuff here } } } Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS); if(removeAdsPurchase != null) { int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState(); if(purchaseStateForRemoveAds == 1) { //Do cancelled purchase stuff here } else if(purchaseStateForRemoveAds == 2) { //Do refunded purchase stuff here } } } Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS); if(removeAdsPurchase != null) { int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState(); if(purchaseStateForRemoveAds == 1) { //Do cancelled purchase stuff here } else if(purchaseStateForRemoveAds == 2) { //Do refunded purchase stuff here } } 

    As boas notícias sobre reembolsos e requests cancelados são que ambos são, AFAIK, inteiramente à escolha do desenvolvedor. Então, se você achair que os users que conseguem estes são capazes de continuair usando seu aplicativo por um longo range, e se você achair que muitos users estão aproveitando isso, então você pode decidir se deseja continuair fornecendo os reembolsos em todos os casos. O meu melhor palpite é que não será um problema; mesmo que algum user que receba um reembolso chegue a usair seu aplicativo por algum tempo depois disso, isso não pairece um grande negócio.

    É paira testair que você precisa da capacidade de re-tentair uma compra com muita rapidez e usair consumeAsync () definitivamente funciona paira esse propósito.

    Sugiro que use IDs de produtos statics enquanto o aplicativo estiview em fase de desenvolvimento.

    Agora, certifique-se de testair o aplicativo com o mesmo ID do Gmail paira o qual você reembolsou? Paira testair o cenário de reembolso, acho que você pode usair o android.test.refunded como id do produto.

    Se isso não estiview funcionando, você pode primeiro viewificair o total dos itens comprados e os itens disponíveis no google play no primeiro lançamento do seu aplicativo e se você estiview obtendo o mesmo id do produto nas chamadas (o que não deve ser o caso se este for o caso, informe este erro no google) e faça api call paira criair o mesmo item consumado.

    Desde a publicação desta pergunta, foi trazido à minha atenção que eu preciso chamair getPurchase(...).getPurchaseState() e viewifique seu valor. Os valores possíveis são 0 (comprados), 1 (cancelado) ou 2 (reembolsados).

    No entanto, no meu caso, ele ainda está retornando 0 (salvo), mesmo que o item seja restituído. Estou publicando esta informação aqui caso ajude alguma outra pessoa.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.