Falha ao tentar realizar compra In-app Billing

556 views
Skip to first unread message

Jean Carlos Almeida

unread,
Aug 28, 2014, 4:32:28 PM8/28/14
to androidb...@googlegroups.com
Pessoal implementei minha classe para in-app Billing e tudo ocorreu perfeitamente só que...

Não consigo realizar compra pelo celular do desenvolvedor (O meu).

Não consigo testar o aplicativo debugando, quando clico em comprar, aparece: "Esta versão do aplicativo não está configurada para faturamento....", pelo que entendi isto é por que o aplicativo não está na google play, porém ele está com a mesma versão, só que estou executando direto do eclipse.

Instalando em um dispositivo terceiro, consegui realizar a compra, porém não ocorreu o fluxo que eu desejava após a conclusão da compra, porém como vou saber o que está dando errado se não consigo debugar?

Por favor alguém sabe me ajudar?

Segue código caso achem necessário:

public class Compra extends ActivityBase{
 
private static String noAd = "";
 
private IabHelper mHelper;
 
private int codigoCompra = 1001;
 
private ProgressDialog progresso;
 
private ActivityBase tela;


 
 
@Override
   
public void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.compra); //Criar this
        noAd
= "MINHA CHAVE"
 mHelper
= new IabHelper(this,"MEU PAYLOAD");
 mHelper
.startSetup(new IabHelper.OnIabSetupFinishedListener() {
 
public void onIabSetupFinished(IabResult result) {
 
if (!result.isSuccess()) {
 
return;
 
}
 
if (mHelper == null) return;
 mHelper
.queryInventoryAsync(getInventarioListener);
 
}
 
});
 tela
= this;
 
 
String compra = getIntent().getStringExtra("Compra");
 
}
 
 
public void comprar(View v)
 
{
 removerAnuncios
();
 
}


 
IabHelper.QueryInventoryFinishedListener getInventarioListener = new IabHelper.QueryInventoryFinishedListener() {
 
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
 
if (mHelper == null) return;
 
if (result.isFailure()) {
 
return;
 
}
 
 consultarCompras
();
 
 
// Produto comprado
 
Purchase noAdProduto = inventory.getPurchase(noAd);
 
boolean noAdComprado = (noAd != null &&
 verifyDeveloperPayload
(noAdProduto));
 
if (noAdComprado)
 
{
 salvarCompra
(tela.getString(R.string.noAd));
 
}
 
}
 
};


 
IabHelper.OnIabPurchaseFinishedListener compraFinalizadaListener = new IabHelper.OnIabPurchaseFinishedListener() {
 
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
 progresso
.dismiss();
 
if (mHelper == null) return;
 
if (result.isFailure()) {
 
Suporte.alertar(tela, "Falha ao realizar compra!");
 
//EasyTracker.getInstance(tela).send(MapBuilder.createEvent("Compra",
 
//"Falha ao comprar", "Produto: "+purchase.getSku(), null).build());
 
return;
 
}
 
if (!verifyDeveloperPayload(purchase)) {
 
Suporte.alertar(tela.getApplicationContext(), "Falha ao realizar compra. Foi detectada uma tentativa de fraude!");
 
//EasyTracker.getInstance(tela).send(MapBuilder.createEvent("Compra",
 
//"Tentativa de fraude", "Produto: "+purchase.getSku()+" - Payload: "+purchase.getDeveloperPayload(), null).build());
 
return;
 
}




 
if (purchase.getSku().equals(noAd)) {
 
Suporte.alertar(tela, "Compra realizada com sucesso!");
 salvarCompra
(noAd);
 
//tela.desabilitarAdPosCompra();
 
}
 
}
 
};


 
private boolean verifyDeveloperPayload(Purchase p) {
 
return p != null && p.getDeveloperPayload().equals("MEU PAYLOAD");
 
}
 
 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   
Log.i("AA","onActivityResult(" + requestCode + "," + resultCode + "," + data);


   
// Pass on the activity result to the helper for handling
   
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
       
this.setOnActivityResultCompra(requestCode, resultCode, data);
   
}
   
else {
       
Log.i("BB", "onActivityResult handled by IABUtil.");
   
}
 
}


 
public void removerAnuncios() {
 mostrarCarregando
();
 
String payload = "CHAVE");


 mHelper
.launchPurchaseFlow(this, noAd, codigoCompra,
 compraFinalizadaListener
, payload);
 
}
 
 
private void salvarCompra(String key)
 
{
 
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
 
SharedPreferences.Editor editor = sharedPref.edit();
 editor
.putBoolean(key, true);
 editor
.commit();


 
if(sharedPref.getInt(key+"_ID", -1) < 1)
 
{
 enviarCompra
(key);
 
}
 
}
 
 
private void enviarCompra(String key)
 
{
 
new ControleCompra(this).execute(key);
 
}
 
 
private void consultarCompras()
 
{
 
new ControleCompra(this).execute(this.getString(R.string.GETCOMPRAS));
 
}
 
 
public boolean comprado(Activity cx, String key)
 
{
 
return cx.getPreferences(Context.MODE_PRIVATE).getBoolean(key, false);
 
}
 
 
private void mostrarCarregando()
 
{
 progresso
= new ProgressDialog(this);
 progresso
.setTitle(R.string.solicitandoCompra);
 
CharSequence carregando = this.getString(R.string.carregando)+"...";
 progresso
.setMessage(carregando);
 progresso
.setProgressStyle(ProgressDialog.STYLE_SPINNER);
 progresso
.show();
 
}


Após realizada a compra, deveria ser salvo em preferences a compra e assim quando alguma activity com anúncio fosse carregada seria verificado que foi comprada a remoção do mesmo.

Any?

Neto Lobo

unread,
Aug 29, 2014, 7:38:01 AM8/29/14
to androidb...@googlegroups.com
Você não pode utilizar o mesmo email de desenvolvedor para testar o app in billing, configure outro email.


--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--

dms

unread,
Sep 2, 2014, 1:37:23 PM9/2/14
to androidb...@googlegroups.com
Jean,

Este in-app Billing é uma complicação total. Tive muita dificuldade para implementar no meu app e não tive retorno satisfatório em vendas.

Mas as dicas são:
1) Implemente um Payload.
2) No meu app, toda vez que é iniciado ele consulta a loja para verificar se comprou o produto ou não. Talvez usar uma shared preference seja mais rápido, mas tem o problema de você não saber se a pessoa devolveu o produto. Só se periodicamente você verificar se a pessoa ainda é "dona" do produto comprado.
3) Os produtos de teste servem apenas para testar as rotinas de compra, eles sempre dão erro quando se tenta verificar a compra dos mesmos. Li que é um bug no código, não sei se já arrumaram nem a veracidade desta informação.
4) Faça o teste de compra num aparelho real, no emulador não funcionou bem, com um cartão de crédito real.
5) Cancele a compra do item, produto, o mais rápido possível após alguns testes. E se for o caso compre novamente. Pois se você cancela depois de 1 semana, o dinheiro é devolvido mas o usuário continua com a posse do produto. Fiz teste de devolução em 1 dia e não deu problema, após alguns horas o produto era retirado da posse do usuários.

Espero ter ajudado.

[]s Daniel

 
String<span style="color: #000;" class="styled-by-p
...

Rudson Lima

unread,
Sep 10, 2014, 1:42:15 PM9/10/14
to androidb...@googlegroups.com
Aproveitando a thread..

Duvida:

@DMS o que você quer dizer com "Implemente um Payload"? Qual a finalidade dele?



 

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Rudson Lima ( live-O ) Desenvolvedor Android
Contato +55 85 87050560 - Fortaleza-ce
Social facebook | google+ | linkedin

Jean Carlos Almeida

unread,
Sep 10, 2014, 2:32:57 PM9/10/14
to androidb...@googlegroups.com

Pelo que entendi ele verifica se o codigo que voce enviou a google para emitir o pagamento é o mesmo que retornou.

You received this message because you are subscribed to a topic in the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/androidbrasil-dev/ffHO0rk4Xmc/unsubscribe.
To unsubscribe from this group and all its topics, send an email to androidbrasil-...@googlegroups.com.

Rudson Lima

unread,
Sep 10, 2014, 2:34:17 PM9/10/14
to androidb...@googlegroups.com
o Código que vc fala é o id do item? como no exemplo da Google é o "premium"?

dms

unread,
Sep 10, 2014, 4:46:42 PM9/10/14
to androidb...@googlegroups.com
Rudson,


  • The fifth argument contains a ‘developer payload’ string that you can use to send supplemental information about an order (it can be an empty string). Typically, this is used to pass in a string token that uniquely identifies this purchase request. If you specify a string value, Google Play returns this string along with the purchase response. Subsequently, when you make queries about this purchase, Google Play returns this string together with the purchase details.

    Security Recommendation: It’s good practice to pass in a string that helps your application to identify the user who made the purchase, so that you can later verify that this is a legitimate purchase by that user. For consumable items, you can use a randomly generated string, but for non-consumable items you should use a string that uniquely identifies the user.

luciofm

unread,
Sep 10, 2014, 4:59:45 PM9/10/14
to androidb...@googlegroups.com
Eu sugiro também fazer a verificação da compra no seu servidor.

Quando o usuário faz uma compra com sucesso, o Google retorna um JSON com os dados da compra, e uma assinatura para esse JSON.

O ideal é verificar se a assinatura bate com o JSON no seu servidor, assim você evita muitas fraudes.

Tenho um app com IAP que tem aproximadamente 500 vendas e já registrei umas 150 tentativas de fraude validando a assinatura da venda.

Lúcio Maciel
luc...@gmail.com

Rudson Lima

unread,
Sep 10, 2014, 5:03:33 PM9/10/14
to androidb...@googlegroups.com
@Lucio seria esses carinhas getOriginalJson() e getSignature()?

luciofm

unread,
Sep 10, 2014, 5:08:38 PM9/10/14
to androidb...@googlegroups.com
Deve ser, não estou utilizando o IabHelper, escrevi o meu próprio código para IAB.



Lúcio Maciel
luc...@gmail.com

Jean Carlos Almeida

unread,
Sep 10, 2014, 6:50:17 PM9/10/14
to androidb...@googlegroups.com

Não.  Quando envia uma solicitação de compra, vc passa um codigo, e a google retorna esse codigo para voce ter certeza que nenhum outro agente se infiltrou no meio de uma transação para burlar.

Rudson Lima

unread,
Sep 11, 2014, 9:27:00 AM9/11/14
to androidb...@googlegroups.com
Bom dia..

A Forma que estou utilizando o in-app é o de subscriptions e pra finalizar só estar faltando eu pegar a data de termino;

Ex: Fiz a inscrição hoje e quando vejo o app no Google play lá ele diz que a data de termino é 11/10/2014, alguém sabe me dizer onde eu pego essa data?

Obrigado;;;
Reply all
Reply to author
Forward
0 new messages