Estou implementando a compra de Assinaturas em uma aplicação android.
Até o momento, as ordens de pagamento já estão configuradas no ‘Google Play Console de Desenvolvedor’ e eu consigo debitar o valor definido em cada uma das SKU no cartão de crédito.
Ao final disto, quero pegar os dados do JSON que deveriam vir “INAPP_PURCHASE_DATA” dentro do ‘onActivityResult’ da aplicação.
Porém, ao realizar a chamada no ‘bundle’, não é retorna nada. Todos os lugares do código onde deveriam retornar os dados da compram sempre retornam um valor Nulo. Mas mesmo assim a compra é debitada do meu cartão. O que me leva ao processo de correr até o console do ‘Google Wallet’ e cancelar o faturamento.
Eis aqui o que estou fazendo no momento:
//Defini o serviço antes do OnCreate.
[code]ServiceConnection mServiceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IInAppBillingService.Stub.asInterface(service);
}
};
[/code]
//No ‘onCreate’ eu defino o SKU que vem de outra Activity, inicio o Servico e a configuração do IABHelper.
[code]@Override
public void onCreate(Bundle savedInstanceState) {
.
.
.
skuSubs = getIntent().getExtras().getString(“SKU_TYPE”);
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);
mHelper = new IabHelper(this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
Log.d(TAG, "In-app Billing setup failed: " result);
}else{
Log.d(TAG, "In-app Billing is set up OK");
}
}
});
}[/code]
//aqui eu defino o metodo que será usado no ‘onClick’ da minha Activity para abrir a janela de Dialogo da assinatura. (o developerPayload é gerado em outro lugar do código)
public void buyClick(View view) {
mHelper.launchPurchaseFlow(this, skuSubs, 10001, mPurchaseFinishedListener, developerPayload);
}
//No método ‘onActivityResult’ eu capturo o retorno do ‘INAPP_PURCHASE_DATA’ pelo ‘Bundle’.
[code]@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
if(data.getExtras()!=null){
Bundle bundle = data.getExtras();
editText.setText(bundle.getString("INAPP_PURCHASE_DATA"));
}else{
editText.setText("null");
}
}[/code]
// Aqui o ‘mPurchaseFinishedListener’ trata os dados da compra. Em testes anteriores, tentei capturar os dados pela classe ‘Purchase’, porém sem sucesso.
[code]IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
return;
}else
if (purchase.getSku().equals(skuSubs)) {
mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
}
};
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
StringBuffer sb = new StringBuffer();
if (result.isFailure()) {
// Handle failure
return;
} else {
mHelper.consumeAsync(inventory.getPurchase(skuSubs), mConsumeFinishedListener);
}
}
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
if (result.isSuccess()) {
//ok msg
} else {
//fail msg
}
}
}; [/code]
//No ‘onDestroy’ eu termino com o ‘Serviço’ e com o ‘IABHelper’.
@Override
public void onDestroy() {
super.onDestroy();
if (mService != null) unbindService(mServiceConn);
if (mHelper != null) {
mHelper.dispose();
mHelper = null;
}
}
No meu ‘AndroidManifest.xml’ estão definidos:
e
Quando configuro isso, dependendo do SKU que é enviado na Activity anterior eu recebo os dados da compra corretamente.
Quando faço a compra, ela é determinada como concluída e depois não recebo o resultado da compra.
Abro o Developer Console e logo após entro no Wallet para cancelar a Assinatura que foi debitada.
Gostaria de saber como eu faço essa requisição dentro da aplicação? Não consigo pegar o retorno da compra até agora.