Android биллинг - как настроить кнопки покупки и правильно прочитать, отменен ли пользователь или куплен?

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

Button buy = (Button)findViewById(R.id.buy); 
buy.setOnClickListener(new Button.OnClickListener() 
{  
   public void onClick(View v) 
   {                                           
     try
     {
        if (mBillingService.requestPurchase(issueProductId, 
                                                Consts.ITEM_TYPE_INAPP , null)) 
        {
          // Not sure what to do here. Has the person been sent to the buy screen yet or no?
          // There are these strings I need to check for but not entirely certain how:                

          if(mBillingService.checkBillingSupported(Consts.ITEM_TYPE_INAPP))
          { 
                 // OK
          } 
          else 
          {
             // If billing is not supported,  give them the item for free
                 Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
                 ExtraHelpActivity.this.startActivity(myIntent);    
          }    

          try
          {   
          if (mBillingService.requestPurchase(issueProductIdPsych, 
                     Consts.ITEM_TYPE_INAPP ,  null)) 
          {
                  // HOW DO I CHECK HERE IF THE USER CANCELED OUT OF THE PURCHASE? 
                  // EVEN ON CANCEL, THEY ARE BEING TAKEN TO THE ITEM THAT THEY NEED TO PAY FOR.  


              // Send them to the screen of the article.
                  Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
              ExtraHelpActivity.this.startActivity(myIntent);                         
          } 
        }
     catch ( Exception e )
     {
        // Report exception.
     }  
     });

Я добавил несколько встроенных комментариев, где я запутался. Я не уверен, как читать, если человек купил предмет или отменил. Если бы кто-то мог помочь мне с этим, это было бы здорово.

Прямо сейчас этот код выводит человека на экран покупки, и некоторые люди покупают, но когда люди нажимают "Отмена", они все равно попадают на предмет, который они не покупали.:)

РЕДАКТИРОВАТЬ:

Кстати, если пользователи уже купили товар и хотят вернуться к нему, состояние запроса на покупку не изменится, верно? Так какой метод в конечном итоге срабатывает? Я проверил с одной покупкой, и я смог купить доступ к одному экрану со статьей, но теперь не могу получить к нему снова, так как экран оплаты говорит мне, что я уже купил этот элемент, и не переходил на следующую страницу.

Вот как выглядит мой новый метод onStateChanged:

@Override
public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
                int quantity, long purchaseTime, String developerPayload) 
{
    if (purchaseState == PurchaseState.PURCHASED) 
    {
        mOwnedItems.add(itemId);

        if ( itemId != null && itemId.trim().equals("3") )
        {
        Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
        ExtraHelpActivity.this.startActivity(myIntent);
        }
        if ( itemId != null && itemId.trim().equals("4") )
        {
           Intent myIntent = new Intent(ExtraHelpActivity.this, NumberOfBusinessesActivity.class);
    }                
   }
   else 
   if (purchaseState == PurchaseState.CANCELED) 
   {  
                // purchase canceled
   } 
   else 
   if (purchaseState == PurchaseState.REFUNDED) 
   {
                // user ask for a refund
   }
   else
   {   
                if ( itemId != null && itemId.equals("3") )
                {
                      Intent myIntent = new Intent(ExtraHelpActivity.this, PsychologyActivity.class);
                      ExtraHelpActivity.this.startActivity(myIntent);
                }
                if ( itemId != null && itemId.equals("4") )
                {
                      Intent myIntent = new Intent(ExtraHelpActivity.this, NumberOfBusinessesActivity.class);
                      ExtraHelpActivity.this.startActivity(myIntent);   
                }                   
     }           
}

и когда я проверил его и купил статью, он попал сюда if (purchaseState == PurchaseState.PURCHASED) но не индивид, если дела внутри него, хотя ID элемента равен "3" или "4"

РЕДАКТИРОВАТЬ:

и вот как я объявляю идентификаторы продукта в начале действия:

String issueProductIdWebMarketing = "1";    
    String issueProductIdDonate = "2";  
    String issueProductIdPsych = "3";
    String issueProductIdNumberofBusinesses = "4";

Спасибо!!

2 ответа

Решение

Согласно руководству по интеграции биллинга:

когда запрашиваемая транзакция меняет состояние (например, покупка успешно списана с кредитной карты или пользователь отменяет покупку), приложение Google Play отправляет намерение IN_APP_NOTIFY. Это сообщение содержит идентификатор уведомления, который можно использовать для получения сведений о транзакции для запроса REQUEST_PURCHASE.

И намерение com.android.vending.billing.PURCHASE_STATE_CHANGED содержит purchaseState

Состояние покупки заказа. Возможные значения: 0 (приобретено), 1 (отменено), 2 (возвращено) или 3 (истекло, только для покупок по подписке).

источник (таблица 4)


РЕДАКТИРОВАТЬ: в образце подземелий, внутренний класс расширяется PurchaseObserver (увидеть Dungeons деятельность), которая делает работу, особенно видеть (onPurchaseStateChange)


EDIT2: некоторый псевдокод

в деятельности (Dungeons класс в образце sdk):

Button buy = (Button)findViewById(R.id.buy); 
buy.setEnabled(false);
buy.setOnClickListener(new Button.OnClickListener() {  
    public void onClick(View v) 
    {
        // show purchase dialog and call mBillingService.requestPurchase() on dialog validation
    }
});

// request to see if supported
if (!mBillingService.checkBillingSupported()) {
    // not supported
}

в наблюдателе (DungeonsPurchaseObserver в образце):

public void onBillingSupported(boolean supported, String type) {
    if (type == null || type.equals(Consts.ITEM_TYPE_INAPP)) {
        if (supported) {
           // billing supported: enable buy button
        } else {
           // billing not supported: disable buy button
        }
    }
}

public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
    int quantity, long purchaseTime, String developerPayload) {
    if (purchaseState == PurchaseState.PURCHASED) {
        // item purchased
    } else if (purchaseState == PurchaseState.CANCELED) {
        // purchase canceled
    } else if (purchaseState == PurchaseState.REFUND) {
        // user ask for a refund
    }
}

Проблема в том, что вызов mBillingService.requestPurchase не синхронно. Таким образом, вы не можете сразу проверить, была ли покупка успешной или нет.

Я рекомендую вам использовать библиотеку AndroidBillingLibrary. С его помощью вы можете легко получить все события Google Play. Для этого вы можете использовать onRequestPurchaseResponse() а также onPurchaseStateChanged() от помощников AbstractBillingActivity или же AbstractBillingFragment,

Другие вопросы по тегам