Создание продуктов Google Play и выставление счетов в приложении

Я делаю приложение с RecyclerView со многими элементами (некоторые из них исправлены и по умолчанию по умолчанию), но я бы как сделать некоторые из них "не бесплатными", означает, что вы должны pay (, если это возможно, используя Google Play), чтобы разблокировать эти элементы, можете ли вы мне посоветовать, как мне понять этот сценарий? Откуда я знаю, что у пользователя есть товары, которые заплатили за них, и когда я знаю, что он заплатил за них.

Я не хочу использовать Database, потому что мне нужны только две таблицы, например:

ТАБЛИЦА ПОЛЬЗОВАТЕЛЯ

Где я буду хранить id (я думаю, это будет электронное письмо, если я наконец создам Login GMAIL, FACEBOOK)

ТАБЛИЧНАЯ КОРОБКА

Где я поставлю BOX, свободный и не бесплатный, а как Foreign Key, я поставлю user.id, чтобы получить ссылки на то, что BOX's принадлежит ему.

Right?

Но, если мне нужно выбрать этот путь, потому что если пользователь платит за box на моем APP, а затем он хочет использовать его на другом устройстве, он не будет иметь box, если он не войдет в систему на новом устройстве, правильно? Итак, если бы мне пришлось выбирать Database и Hosting, чтобы сделать это, какова будет ваша рекомендация? (С самого начала у меня не будет слишком много данных, поэтому мне не нужен лучший, я хочу общаться только с моим приложением Android).

Надеюсь, теперь это ясно, иначе, добавьте комментарий, и я попытаюсь объяснить это лучше.

ИЗМЕНИТЬ

Читая ответы, я вижу, что я могу использовать Firebase, как сказал @Haris Qureshi, что меня путает:

Как сохранить продукт? Я имею в виду, что я читал и смотрел видео на YouTube, и мне нужно сделать это в Console of Google Play, но мне нужно отправить .apk, а затем добавить продукты?

Если мне не нужно создавать Database, и я должен закончить с помощью Firebase, используя материал Storage из Firebase будет хранить мои продукты? Но я могу назначить его как PURCHASED, PAID, AVAILABLE? Также мне нужно интегрировать Authentication, правильно? Потому что он сказал, что как только вы покупаете продукт, он хранит gmail, который заплатил за него, и вы знаете, кто платил и не платил, поэтому, если он использует другое устройство, у него будут те же самые продукты (если он все еще с одним и тем же gmail).

Продукты могут быть динамикой? Я имею в виду, что вы можете создать, например, "событие" и поставить этот продукт только на x дней, так как мне понадобится Image, чтобы показать продукт, я имею в виду, что у продукта будет также Image, чтобы показать на UI, но я вижу, что в Console of Google Play я могу создать id для продукта, и если бы мне пришлось его создать динамически, я мог бы это сделать, потому что мне нужно сохранить Images on /res/mipmap right

EDIT2

Мне нужно то, что @Alex Mamo сказал мне:

Вы не можете хранить изображения в базе данных Firebase. Их нужно хранить в хранилище Firebase. В базе данных Firebase вам нужно сохранить только URL-адреса этих изображений.

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

Я создал продукты в разработчике консоли Google, и мне нужно подключить мое приложение к биллингам в приложении

Ответ 1

Что касается firebase, вы должны это сделать:

First Firebase - это база данных nosql, поэтому она использует JSON для добавления значений в базу данных. Также Firebase - это служба, в которой есть база данных, хранилища, облачных функций, аутентификации в реальном времени. Таким образом, ваш лучший вариант.

Теперь Что касается способа хранения, вы можете сделать это:

In realtime Database

{
  Users:{
    push_id_here{
          name:peter
          password:a_password_here
          email: email_here
              }
    push_id_here{
          name:john
          password:a_pass_here
          email: email_here
       }
     }

     Box:{
        push_id_here{
              productname: productx
              availability: available
              image: image_url_here
                     }
         push_id_here1{
                 productname: producty
                 availability:free
                 image: image_url_here
                     }
             }

Сначала да, аутентифицируйте пользователя, в отношении отправки изображения в хранилище и добавьте его в базу данных, это, вероятно, ваш лучший вариант.

Push_id_here: это в основном случайный идентификатор, сгенерированный для каждого node, как первичный ключ.

Вы делаете это так:

DatabaseReference ref=getInstance().getReference().child("Users").push();

Push() создаст случайный идентификатор. Вышеуказанная база данных реального времени, для ее создания вам необходимо подключиться к firebase в студии Android.

В студии android перейдите в Инструменты > Firebase > база данных реального времени и подключитесь к базе данных.

для отправки данных в базу данных вы можете сделать это:

 DatabaseReference ref=getInstance().getReference().child("Users").push();
 ref.child("name").setValue(name) //name that you can get from `Editext`
 ref.child("email").setValue(email)

Что касается аутентификации, вам также нужно подключиться к аутентификации firebase, перейдите в Инструменты > Firebase > firebase authenticate и enable.

Аутентификация означает, что он будет аутентифицирован в firebase, обычно он аутентифицирует электронную почту и пароль, есть также аутентификация телефона. Для аутентификации вы можете добавить это в свой код:

firebaseAuth.signInWithEmailAndPassword(email,password)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {


                if(task.isSuccessful()){
                    //code here
                }else{
                    Log.e("ERROR",task.getException().toString());
                    Toast.makeText(LoginActivity.this, task.getException().getMessage(),Toast.LENGTH_LONG).show();
                }
            }
        });

Пример:

Образец db

В этом db Klx0N4pxsBHGVkhYuY0 есть push id и channels как Users в JSON я дал

Ответ 2

Здесь есть хорошие ответы, но, поскольку вы спросили меня, я постараюсь дать вам более подробную информацию. Наилучшей практикой для Implementing In-app Billing является официальная документация . Пожалуйста, ниже моего ответа на некоторые из ваших вопросов.

Как и многие другие пользователи, я использую Firebase как вашу базу данных для вашего приложения. Это база данных NoSQL, и она очень проста в использовании.

Как вы храните продукт?

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

Firebase-root
    |
    --- users
    |     |
    |     --- uid1
    |          |
    |          --- //user details (name, age, address, email and so on)
    |          |
    |          --- products
    |                |
    |                --- productId1 : true
    |                |
    |                --- productId2 : true
    |
    --- products
    |     |
    |     --- productId1
    |     |     |
    |     |     --- productName: "Apples"
    |     |     |
    |     |     --- price: 11
    |           |
    |           |
    |           --- users
    |                |
    |                --- uid1: true
    |                |
    |                --- uid2: true
    |
    --- purchasedProducts
         |      |
         |      --- uid1
         |           |
         |           --- productId1: true
         |           |
         |           --- productId2: true
         |
         --- paidProducts
         |      |
         |      --- uid2
         |           |
         |           --- productId3: true
         |
         --- availableProducts
         |      |
         |      --- uid3
         |           |
         |           --- productId4: true

Используя эту структуру базы данных, вы можете запросить свою базу данных для:

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

Каждый раз, когда продукт покупается, вам нужно только переместить продукт в соответствующую категорию. Как AL. сказал, вы можете настроить приложение для получения продуктов с помощью Firebase SDK. Это не проблема.

Это вызвано в Firebase denormalization очень нормально с базой данных Firebase. Для этого я recomand вижу этот видео. Если вам нужно что-то более сложное, я рекомендую вам прочитать этот пост, Правильно структурировать данные Firebase для сложного приложения.

Использование хранилища из Firebase будет хранить мои продукты?

Да, вы можете использовать Firebase Cloud Storage, который предназначен для разработчиков приложений, которым необходимо хранить и обслуживать созданные пользователями материалы, такие как фотографий или видеороликов.

Также мне нужно будет интегрировать аутентификацию, правильно?

Да, вам нужно использовать Firebase Authentication, потому что вам нужно знать личность пользователя. Знание пользовательской идентичности позволяет приложению безопасно сохранять пользовательские данные в облаке и обеспечивать такой же персонализированный опыт на всех пользовательских устройствах. Firebase Authentication предоставляет базовые службы, простые в использовании SDK и готовые библиотеки пользовательского интерфейса для аутентификации пользователей в вашем приложении. Он поддерживает аутентификацию с использованием паролей, телефонных номеров, популярных федеративных провайдеров идентификации, таких как Google, Facebook и Twitter, и многое другое.

Продукты могут быть динамикой? Я имею в виду, вы можете создать, например, "событие" и поместить этот продукт только на x дней?

Да, вы можете сделать это, используя Облачные функции для Firebase, который позволяет вам автоматически запускать бэкэнд-код в ответ на события, вызванные функциями Firebase и HTTPS-запросы. Ваш код хранится в облаке Google и запускается в управляемой среде. Нет необходимости управлять и масштабировать собственные серверы.

Вот как вы можете запросить базу данных для отображения названия продукта и цены всех продуктов.

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference yourRef = rootRef.child("products");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String productName = ds.child("productName").getValue(String.class);
            double price = ds.child("price").getValue(Double.class);
            Log.d("TAG", productName + price);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
yourRef.addListenerForSingleValueEvent(eventListener);

И вот как вы можете запросить свою базу данных, чтобы увидеть все purchasedProducts, принадлежащие определенному пользователю:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("purchasedProducts").child("uid1");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String productKey = ds.getKey();
            Log.d("TAG", productKey);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);

Ответ 3

Для каждой строки RecyclerView укажите a TextView, чтобы указать три состояния (то есть: - "Свободный", "Платный", "ПЛАТ" ) этого конкретного элемента на стороне строки. Вы можете сделать TextView с динамическим динамическим статусом "Pay", если вы хотите, чтобы пользователь перешел на экран покупки.

Теперь определите Adapter для RecyclerView и внутри которого есть enum с тремя статусами (то есть: - "FREE", "NOT_PAID", "PAID" ), чтобы указать статус текущего элемента и свойство удерживать значение enum. Когда Activity начинает заполнять это свойство (тип перечисления) в соответствии с исходными данными для определенных элементов динамически. На основе значения вы можете динамически изменять статус TextView (то есть: - "Свободный", "Платный", "ПЛАТ" ). Эта логика также должна идти на Adapter.

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

Ответ 4

Добавьте все свои продукты в Google Play Store, как в продуктах покупки приложений.

псевдокод

  • Создайте класс: Products, имеющий элементы данных как productID, productType, price, description, tag и т.д.

  • Запрос элементов, доступных для покупки, и сохраните их в Products с тегом AVAILABLE.

  • Запросить купленные предметы и сохранить их с помощью тега ПОКУПКА.

  • Используйте Firebase, чтобы получить бесплатные продукты и хранить их с тегом FREE.

  • Заполните RecyclerView с помощью ArrayList и укажите ваш TextView соответственно в своем адаптере.

Google хранит всю историю покупок, но если вы хотите добавить больше продуктов, вам нужно добавить продукты в консоль Google, а также опубликовать новую версию для Android.

Подробнее см. этот пример.

Ответ 5

Пишите свой комментарий здесь. Я обратил внимание на отредактированную часть. Здесь мои два цента:

Как сохранить продукт? Я имею в виду, что я читал и смотрел видео на YouTube, и мне нужно сделать это в консоли Google Play, но мне нужно отправить .apk, а затем добавить продукты?

Вы можете сохранить его непосредственно из Firebase Console. После этого вы можете настроить приложение на получение продуктов с помощью Firebase SDK. Если у вас уже есть приложение, загруженное в Google Play, мне кажется, вам просто нужно загрузить обновленный APK, который мог бы выполнить извлечение данных (используя SDK Firebase).

Если мне не нужно создавать базу данных, и я должен закончить использование Firebase, использование материала Storage из Firebase будет хранить мои продукты? Но я могу назначить его как PURCHASED, PAID, AVAILABLE? Также мне нужно интегрировать аутентификацию, правильно?

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

База данных Firebase будет работать сама по себе без Firebase Auth, однако, настоятельно рекомендуется использовать ее вместе, чтобы использовать Правила безопасности.

Продукты могут быть динамикой? Я имею в виду, вы можете создать, например, "событие" и поставить этот продукт только на x дней, так как мне понадобится изображение для показа продукта, я имею в виду, что у продукта будет также изображение, отображаемое в пользовательском интерфейсе, но я см. в консоли Google Play. Я могу создать идентификатор для продукта, и если мне нужно будет создать его динамическое, я бы это сделал, потому что мне нужно правильно сохранить изображения в /res/mipmap?

Это зависит от того, как вы его реализуете, но да, безусловно, возможно создать динамический продукт. Вы могли бы получить информацию о продукте в БД и файл изображения в Cloud Storage for Firebase. Вы можете сделать эту динамику, добавив что-то вроде параметра expirationDate в детали продукта, а при извлечении данных в вашем приложении вы можете просто проверить, истекло ли это или нет.

Ответ 6

Если пользователь поменяет свой мобильный телефон и войдет в Google Play Store с тем же электронным письмом, которое он использовал для покупки продукта на предыдущем мобильном телефоне, то приобретенный им продукт будет автоматически виден на новом мобильном устройстве.

Ответ 7

Сначала вам нужно знать, как создавать продукты в консоли разработчика Google Play. Вы можете проверить это.

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

Сначала узнайте, как сделать свой продукт в приложении, и как предоставить им детали и идентификаторы.

next Я помогу вам сделать вашу базу данных в firebase и узнать, когда разрешить покупку.

UPDATE

Я предполагаю, что вы уже связали свое приложение с firebase, если нет, то вы должны выяснить, как это сделать.

шаг 1

a) убедитесь, что вы выполнили аутентификацию в консоли firebase и включили (войдите с помощью электронной почты и пароля).

b) добавьте следующие зависимости:

  compile 'com.google.firebase:firebase-auth:11.0.2'
  compile 'com.google.firebase:firebase-database:11.0.2'

ШАГ 2

создайте свою активность в регистре (RegisterActivity), для простоты добавьте кнопку (называемую регистром) и два поля edittext (назовите их edit1 и edit2).

теперь мы регистрируем пользователя следующим образом:

    private String email;
    private String password;
    private FirebaseAuth mauth;

     //on create
    mauth=FirebaseAuth().getInstance();


    //on click of register button 

     //get what ever was typed in edit text fields and store them like that
     email=edit1.getText().toString();
     password=edit2.getText().toString();

     //create user like that 

      math.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>(){

           @Override
           public void onComplete(@NonNull Task< AuthResult> task){
             //on complete store users in database
             if(task.isSuccessful()){ 
              //get the user uid
               FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
               String uid=user.getUid();

                //create a reference called my users in database
                DatabaseReference users=FirebaseDatabase.getInstance().getReference().child("my_users");

                 users.child(uid).setValue("user");//you can attach on complete here and if task successful go to main activity.


             }

            }

       });

Шаг 3

Теперь вы можете сделать запрос активности входа в систему (LoginActivity), и он будет 1 кнопка входа в систему и 2 отредактированные поля. И вы входите в систему таким образом

       private String email;
       private String password;
       private FirebaseAuth mauth;

         //on create
mauth=FirebaseAuth().getInstance();


       //on click login

         math.signInUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>(){

       @Override
       public void onComplete(@NonNull Task< AuthResult> task){
         //on complete store users in database
         if(task.isSuccessful()){ 
          //get the user uid
           FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
           String uid=user.getUid();

            if(user!=null){
               //this means your user is registered so make intent to login activity
             }

         }

        }

   });

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

шаг 4

(так до сих пор вы можете создавать пользователей и хранить их идентификаторы в базе данных).

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

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

вот как это сделать:

           //in the activity of your listed items
            private FirebaseAuth mauth;
            private String currentuser:

            //on create

            mauth=FirebaseAuth().getInstance();
            //store the id of the current logged in user
            currentuser=mauth.getCurrentUser().getUid();

           //on click of an item (wood or  silver or  iron ....)

           //I will do the wood case and you do same for others

           //on click of wood item 

            DatabaseReference wood=FirebaseDatabase.getInstance().getReference().child("Wood");

             //check if user is inside wood

              wood.addListenerForSingleValueEvent(new ValueEventListener(){

                @Override
                public void onDataChange(DataSnapShot datasnapshot){

                     //inside here you check if user is in wood
                      if(datasnapshot.hasChild(currentuser)){

                         //this means user purchased the wood item
                       }else{


                        //user didn't purchase a wood item

                        //handle payment 
                        //after payment of wood is completed

                        //store user in wood node

                  DatabaseReference wood=FirebaseDatabase.getInstance().getReference().child("Wood");

         wood.child(currentuser).setValue("purchased");




                       }

                   }

               });

Ответ 8

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

a) с бэкэнд-системой приложения, может ли это быть FireStore (чтобы обрабатывать изображения продукта как "документ" ) - или даже Облачные функции, загружая фид продукта через API разработчика Google Play, а затем доставляя его как JSON на конечные устройства ( Облачные функции также позволяли бы вставлять в Firebase)... однако изображения продуктов нужно будет кэшировать локально (во внутреннем хранилище, а не в ресурсах).

b) с API разработчика Google Play, чтобы управлять продуктами и/или расходными материалами в приложении.

например. когда один запускает продукт в приложении с помощью веб-приложения, он будет вставлять продукт в Play Store, чтобы сделать его общеизвестным и FireStore, чтобы сделать его видимым и доступным для покупки в приложении Android (или с помощью облачных функций, он загрузил обновленный фид продукта из API с тем же эффектом).

Ответ 9

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

внутри функции bindViewHolder проверки recyclerview для следующего псевдокода

  • если item == "paid" && & элемент существует в списке sharedprefrences, делает его кликабельным (или что-то нужным)
  • если он не является (else part), перейдите на страницу оплаты.