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
,