Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внутренние покупки в приложении, In-app purchase 
:(
    Опции темы
rlepricon
Дата 13.9.2017, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



Добрый день.

Пытаюсь разобраться с внутренними покупками в приложении, но никак не могу осилить :-(

Если есть у кого-то подробный гайд на русском, поделитесь, пожалуйста. Пока даже не знаю про что спросить, кроме того, как это подробно работает и как мне встроить это в своё приложение?

Хочу в игре продавать подсказки к головоломке. Как я понимаю, мне надо ещё на своей стороне делать серверную часть, которая как раз и отправляет подсказки. Не совсем понимаю как это всё будет вместе работать. Поделитесь опытом smile.

Спасибо. 
PM MAIL   Вверх
Мелена
Дата 28.9.2017, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.9.2017

Репутация: нет
Всего: нет



и я послушаю.
PM MAIL   Вверх
Hiori
Дата 6.10.2017, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



Цитата
Хочу в игре продавать подсказки к головоломке. Как я понимаю, мне надо ещё на своей стороне делать серверную часть, которая как раз и отправляет подсказки. Не совсем понимаю как это всё будет вместе работать. 

а в чем Вы видите основную проблему?

по-хорошему я бы ввела некую систему аккаунтов (как авторизоваться и что для акка нужно - дело десятое, важна сама суть), на акке должна существовать некая игровая валюта, которая и будет списываться при получении подсказки (почему не сразу реальные денежки - чтобы не пихать множество раз пользователю под нос оплату, а раз купил, скажем, кристаллы и потом покупай за них подсказки, пока не кончатся, а там снова единожды оплата с карты)

сервер может быть любым, но в Вашем случае (не понимаете как и что и, как я поняла, первый опыт) проще всего сваять простенький отклик на php, я думаю с программированием под пэху на апаче Вы сталкивались хоть раз.

при нажатии "подсказка" в адрес сервера можно отправить всего одно поле - UserName, скрипт на сервере уменьшит в БД количество внутриигровой валюты и отправит приложению ответ "да", если хватило и "нет", если валюты не хватает на подсказку. А приложение, получив ответ, либо дает подсказку, либо говорит о нехватке валюты и предлагает ее купить.

не нужно кидать в меня тапками с надписью "account security" и т.п., да, отправлять одно поле - глупость, но просили же суть, а не готовый вариант, правда?
PM MAIL   Вверх
iillyyaa2033
Дата 6.10.2017, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.6.2017

Репутация: нет
Всего: нет



У гугла все уже есть. Берите и пользуйтесь.
PM MAIL   Вверх
rlepricon
Дата 7.10.2017, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



Цитата(Hiori @ 6.10.2017,  07:40)
Цитата
Хочу в игре продавать подсказки к головоломке. Как я понимаю, мне надо ещё на своей стороне делать серверную часть, которая как раз и отправляет подсказки. Не совсем понимаю как это всё будет вместе работать. 

а в чем Вы видите основную проблему?

по-хорошему я бы ввела некую систему аккаунтов (как авторизоваться и что для акка нужно - дело десятое, важна сама суть), на акке должна существовать некая игровая валюта, которая и будет списываться при получении подсказки (почему не сразу реальные денежки - чтобы не пихать множество раз пользователю под нос оплату, а раз купил, скажем, кристаллы и потом покупай за них подсказки, пока не кончатся, а там снова единожды оплата с карты)

сервер может быть любым, но в Вашем случае (не понимаете как и что и, как я поняла, первый опыт) проще всего сваять простенький отклик на php, я думаю с программированием под пэху на апаче Вы сталкивались хоть раз.

при нажатии "подсказка" в адрес сервера можно отправить всего одно поле - UserName, скрипт на сервере уменьшит в БД количество внутриигровой валюты и отправит приложению ответ "да", если хватило и "нет", если валюты не хватает на подсказку. А приложение, получив ответ, либо дает подсказку, либо говорит о нехватке валюты и предлагает ее купить.

не нужно кидать в меня тапками с надписью "account security" и т.п., да, отправлять одно поле - глупость, но просили же суть, а не готовый вариант, правда?

Спасибо smile
Теперь стало понятнее smile

Буду разбираться дальше smile
PM MAIL   Вверх
rlepricon
Дата 20.10.2017, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



Поделюсь своими изысканиями, вдруг кому-то поможет.

Остановился на использовании библиотеки Android In-App Billing v3 Library - она просто оказалось для меня самой понятной и простой для моих задач.
гитхаб тут: https://github.com/anjlab/android-inapp-billing-v3
Там вроде всё описано, но пробегусь ещё раз:
1. Подключаем библиотеку к проекту, для этого в файл build.gradle (Module: app) в разделе dependencies в самый конец добавляем строчку: compile 'com.anjlab.android.iab.v3:library:1.0.44'
У меня получилось так:
Код

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "ru.crazyprojects.android.game"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 4
        versionName '1.2'
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.anjlab.android.iab.v3:library:1.0.44'
}

Не забываем после внесения изменений, нажать Sync Now в верхнем правом углу окна.

2. Добавляем в файл с Activity две библиотеки:

import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;

3. Снабжаем нашу Activity функционалом BillingProcessor.IBillingHandler:

public class Game extends AppCompatActivity implements BillingProcessor.IBillingHandler

4. Создаём переменную:

BillingProcessor bp;

5. Проверяем, что плеймаркет доступен, затем создаём и инициализируем переменную: 
Код

if(!BillingProcessor.isIabServiceAvailable(this)) {
            Toast.makeText(this, "In-app billing service is unavailable", Toast.LENGTH_LONG).show();
        }

        bp = new BillingProcessor(this, null, this);
        bp.initialize();


6. Заполняем соответствующие методы.

У меня получилось так:
Код

package ru.crazyprojects.android.game;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;

public class Game extends AppCompatActivity implements BillingProcessor.IBillingHandler {

    BillingProcessor bp;

    private GameView gameView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getSupportActionBar().hide();
        gameView = new GameView(this, getResources(), Game.this);
        setContentView(gameView);
        
        ----//-----//-----//-----//------//----

        if(!BillingProcessor.isIabServiceAvailable(this)) {
            Toast.makeText(this, "In-app billing service is unavailable", Toast.LENGTH_LONG).show();
        }

        bp = new BillingProcessor(this, null, this);
        bp.initialize();
    }

    @Override
    public void onBackPressed() {

    }

    @Override
    public void onBillingInitialized() {
    /*
    * Called when BillingProcessor was initialized and it's ready to purchase
    */
    }

    @Override
    public void onProductPurchased(String productId, TransactionDetails details) {
    /*
    * Called when requested PRODUCT ID was successfully purchased
    */
     
    // Метод вызывается когда товар куплен. Строковый идентификатор товара приходит в переменной produktID. Именно с таким же идентификатором товар должен быть создан в плеймаркете для данного приложения.
    
    // смотрим что пользователь купил, и что-то делаем... 

    }

    @Override
    public void onBillingError(int errorCode, Throwable error) {
    /*
    * Called when some error occurred. See Constants class for more details
    *
    * Note - this includes handling the case where the user canceled the buy dialog:
    * errorCode = Constants.BILLING_RESPONSE_RESULT_USER_CANCELED
    */
    // Вызывается когда что-то пошло не так. Ну и это надо обработать.

        Toast.makeText(this, "ERROR!!!", Toast.LENGTH_LONG).show();
        Log.d("LOG", "Error purchasing hint...");
    }

    @Override
    public void onPurchaseHistoryRestored() {
    /*
    * Called when purchase history was restored and the list of all owned PRODUCT ID's
    * was loaded from Google Play
    */

    // вызывается в момент инициализации переменной bp и видимо подключения к плеймаркету. Тут нам приходят все покупки совершённые ранее. Анализируем и как-то обрабатываем.
        
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // тут не разобрался :-(
        if (!bp.handleActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    public void onDestroy() {
        if (bp != null) {
            bp.release();
        }
        super.onDestroy();
    }

    public void purchaseHint(String hintValue) {
        //Log.d("LOG", hintValue);
        // Вызываем когда надо что-то купить. В качестве параметра указываем строковый идентификатор товара, так же как он указан в плеймаркете для данного приложения.
        bp.purchase(this, hintValue);
    }

    @Override
    public void onPause() {
        super.onPause();
        gameView.terminateThread();
    }

    @Override
    public void onResume() {
        super.onResume();
        if (gameView.gameThread != null) {
            gameView.createThread(gameView.getHolder());
        }
    }
}


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

Немного скомкано, но надеюсь поможет.

Дальше разбираюсь со схемой с моим бэкенд сервером.

Это сообщение отредактировал(а) rlepricon - 31.10.2017, 22:52
PM MAIL   Вверх
rlepricon
Дата 22.10.2017, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



Ещё небольшое, но для меня оказалось важным, дополнение:
Для тестирования покупок необходимо, чтобы тестируемое приложение было подписано, и выложено в Google Play, лучше всего это делать через бета-тестирование. 
Если просто запускать приложение из Android Studio на телефоне, то при попытке совершить покупку будет выведено сообщение, что данная версия приложения не работает с платёжной системой Googl Play, при этом выложив приложение в Google Play, всё начнёт работать.
  
PM MAIL   Вверх
rlepricon
Дата 11.12.2017, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



Небольшое дополнение.

Дописал новогоднюю головоломку и решил добавить туда донаты. То есть платежи, которые можно совершать многократно.
То есть, если мы совершаем покупку, то для для повторной покупки товар необходимо реализовать. 
Чтобы реализовать товар, в метод 
@Override
public void onProductPurchased(String productId, TransactionDetails details)

добавляем строку bp.consumePurchase(productId);

после этого товар можно приобретать повторно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.1240 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.