创建产品Google Play和应用内结算

时间:2017-11-12 17:59:07

标签: android database firebase firebase-realtime-database google-play-services

我正在开展一款应用RecyclerView有很多项目(其中一些已修复,并且默认适合所有人),但我我想让其中一些“不自由”,意味着您必须pay如果可能,使用Google Play )来解锁这些项目,您能指导我吗?弄清楚这种情况?我怎么知道用户有物品已付款,当我知道他付钱时。

我不想使用Database,因为我猜我只需要两张桌子,例如;

  

TABLE USER

我会在哪里存储id(如果我最终创建Login GMAIL,FACEBOOK ,我想这将是电子邮件)

  

TABLE BOX

我将把免费且不免费的BOX放在Foreign Key我会让user.id获取他/她所拥有的BOX's的参考资料。

右?

但是,如果我必须选择这种方式,因为如果用户在我的APP上支付了box,然后他想在其他设备中使用它,那么它就不会有box除非他登录新设备,对吗?所以,如果我不得不选择DatabaseHosting来做,那么您的建议是什么? (从一开始,我就不会有太多的数据,所以我不需要最好的数据,我只想与我的Android应用程序进行通信。

我希望现在很清楚,否则,发表评论,我会尝试更好地解释它。

修改

阅读答案我看到我可以使用Firebase,正如@Haris Qureshi所说,我很困惑的是:

如何存放产品?我的意思是,我已经在YouTube上阅读并观看了视频,我必须在Console of Google Play中进行观看,但我是否需要发送.apk然后添加产品?

如果我不需要创建Database,并且我必须最终使用Firebase,那么使用Storage中的Firebase内容会存储我的产品吗?但我可以将其指定为PURCHASEDPAIDAVAILABLE?我还需要整合Authentication,对吗?因为他说,一旦你购买了产品,它就会存储已付款的gmail,你知道谁支付了而且没有支付,所以如果他使用其他设备,它将拥有相同的产品boughts(如果他仍然使用相同的gmail)

产品可以动态吗?我的意思是,您可以创建一个“事件”,并将该产品仅放置x天,因为我需要Image来展示产品,我的意思是该产品还会有Image在UI上显示,但我在Console of Google Play中看到我只能为产品创建id,如果我必须创建动态我可以这样做,因为我必须存储Images /res/mipmap上的x1 = as.complex(-1)^(1/3) x1 对吗?

EDIT2

我需要的是@Alex Mamo告诉我的事情:

  

您无法在Firebase数据库中存储图片。您需要将它们存储在Firebase存储中。在Firebase数据库中,您只需要存储这些图像的网址。

流程如下:将图片上传到Firebase存储 - >获取相应图片的网址(上传时) - >将网址存储在Firebase数据库中 - >使用参考来显示图像

我在google console developer上创建了这些产品,我必须将我的应用程序连接到应用内结算

9 个答案:

答案 0 :(得分:3)

这里有很好的答案但是因为你问过我,我会试着给你一些更多细节。 Implementing In-app Billing的最佳做法是official documentation。对于你的一些问题,请在我的答案下方。

正如许多其他用户所建议的那样,我也使用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

使用此数据库结构,您可以在数据库中查询:

  1. 属于单个用户的所有产品(已购买,已付款或可用)
  2. 购买特定产品的所有用户
  3. 所有购买的属于单个用户的产品
  4. 属于单个用户的所有付费产品
  5. 属于单个用户的所有可用产品
  6. 每次购买产品时,您只需将产品移至相应的类别。作为AL。说,您可以使用Firebase SDK设置应用以获取产品。那不是问题。

    在Firebase denormalization中调用此功能与Firebase数据库非常正常。为此,我重新审视了video。如果你想要更复杂的东西,请重新阅读这篇文章,Structuring your Firebase Data correctly for a Complex App

      

    使用Firebase中的存储内容会存储我的产品吗?

    是的,您可以使用专为需要存储和投放用户生成内容(例如照片或视频)的应用开发者而构建的Firebase Cloud Storage

      

    此外,我还需要集成身份验证,对吗?

    是的,您需要使用Firebase Authentication,因为您需要知道用户的身份。了解用户的身份允许应用程序安全地将用户数据保存在云中,并在所有用户的设备上提供相同的个性化体验。 Firebase身份验证提供后端服务,易于使用的SDK和现成的UI库,以对应用程序的用户进行身份验证。它支持使用密码,电话号码,流行的联合身份提供商(如Google,Facebook和Twitter等)进行身份验证。

      

    产品可以动态吗?我的意思是,您可以创建一个“事件”并将该产品仅放置x天?

    是的,您可以使用Cloud Functions For 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);
    

答案 1 :(得分:2)

对于RecyclerView的每一行,定义一个TextView来表示该特定项目的三个状态(即: - “免费”,“付费”,“付费”)行。如果您希望用户导航到购买屏幕,则可以动态点击状态为“付费”的TextView

现在为Adapter定义RecyclerView,其中enum有三个状态(即: - “FREE”,“NOT_PAID”,“PAID”)以指示当前项的状态和保存enum值的属性。当Activity开始根据特定项目的后端数据动态填充该属性(枚举类型)时。根据该值,您可以动态更改TextView的状态(即: - “免费”,“付费”,“付费”)。这个逻辑也应该放在Adapter上。

希望您能根据上述建议实施。如果您需要进一步的帮助,我可以提供实施。

答案 2 :(得分:2)

在应用购买产品中添加Google Play商店中的所有产品。

<强>伪代码

  1. 创建一个名为Products的班级,其数据成员为productIDproductTypepricedescriptiontag

  2. 查询可供购买的商品并将其保存在Products中 标签为AVAILABLE。

  3. 查询已购买的商品并使用标签PURCHASED进行保存。

  4. 使用Firebase获取免费产品并将其标记为免费。

  5. 使用给定的RecyclerView填充ArrayList并在适配器中相应地显示TextView

  6. Google会存储所有购买历史记录,但如果您想添加更多产品,则需要在Google控制台中添加产品以及发布新的Android版本。

    有关详细信息,请参阅此example

答案 3 :(得分:1)

here看到你的评论。我注意到编辑的部分。这是我的两分钱:

  

如何存储产品?我的意思是,我在YouTube上阅读和观看了视频,我必须在Google Play控制台中进行操作,但是我是否需要发送.apk然后添加产品?

您可以直接从Firebase Console存储它。之后,您可以使用Firebase SDK将应用设置为获取产品。如果您已将应用程序上传到Google Play,我认为您只需上传可以执行数据检索的更新APK(使用Firebase SDK)。

  

如果我不需要创建数据库,并且我必须最终使用Firebase,使用Firebase中的存储内容将存储我的产品?但我可以将其指定为PURCHASEDPAIDAVAILABLE?此外,我还需要集成身份验证,对吗?

如果我正确理解您的要求,您肯定会需要数据库。您可以更轻松地以这种方式组织产品。从(Firebase)数据库本身,您还可以将用户详细信息放在那里,如果它们已经PAID设置,或者只使用FREE的应用,这样就可以更方便地检查用户可以访问的产品。

Firebase数据库可以在没有Firebase Auth的情况下运行,但是,强烈建议您一起使用它,以便使用Security Rules

  

产品可以动态吗?我的意思是,你可以创建一个例如“事件”并将该产品仅放置x天,因为我需要一个Image来显示产品,我的意思是该产品还将在UI上显示一个Image,但是我在Google Play的控制台中看到我只能为该产品创建一个ID,如果我必须动态创建它,我可以这样做,因为我必须将图像存储在/ res / mipmap上吗? < / p>

这取决于您如何实现它,但是肯定可以创建动态产品。您可以在数据库和Cloud Storage for Firebase中的图像文件中获取产品详细信息。您可以通过在产品详细信息中添加类似expirationDate参数的内容来实现此动态,并且在应用中检索数据时,您只需检查它是否已过期。

答案 4 :(得分:1)

如果用户更换手机并使用之前用于在之前的手机上购买产品的同一封电子邮件登录Google Play商店,那么他购买的产品将在新手机上自动显示。

答案 5 :(得分:1)

首先,您需要了解如何在Google Play开发者控制台中创建产品。您可以查看this

您需要上传您的APK,但不一定要发布它。一旦你按照我提供的链接中提到的步骤执行此操作,您将能够创建像(木,银,铁)产品给他们的ID,并在需要允许购买时检索它们(这将是部分firebase将帮助我们做到这一点)。

首先了解如何制作您的应用内商品以及如何为其提供详细信息和ID。

接下来,我将帮助您在firebase中创建数据库并知道何时允许购买。

<强>更新

我会假设你已经将你的应用程序链接到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步

(所以到目前为止,您可以创建用户并将他们的ID存储在数据库中)。

现在创建一个活动,其回收者视图显示您的项目,如(木头,铁,银......)或其他什么,这就是诀窍(请记住,在此活动中,用户已经登录到您的应用)。

诀窍:现在你听用户点击一个项目然后你听一个叫(木头)或(铁)或(银)的节点,如果这些节点有当前的用户ID,那么用户已经购买了,如果没有然后用户没有购买(这是你在应用内购买弹出的地方......)

这是如何解决这个问题:

           //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");




                       }

                   }

               });

答案 6 :(得分:1)

关于firebase你必须这样做:

第一个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:基本上是为每个节点生成的随机ID,它就像一个主键。

你这样做:

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

Push()会创建一个随机ID。 以上是实时数据库,要创建它你必须连接到android studio中的firebase。

在android studio中,转到Tools&gt; Firebase&gt;实时数据库并连接到数据库。

将数据发送到数据库,您可以这样做:

 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身份验证,转到工具&gt; Firebase&gt; firebase验证并启用。

身份验证意味着它将在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();
                }
            }
        });

示例:

Sample db

在这个数据库中,Klx0N4pxsBHGVkhYuY0是推送ID,channels与我Users中的JSON类似

答案 7 :(得分:1)

为了处理动态产品,您需要一个与Android应用程序没有直接关系的Web应用程序,但它需要后端系统(仅用于控制发布过程),哪些接口...

a)使用应用程序的后端系统,无论是FireStore(为了处理产品图像为&#34;文档&#34;) - 甚至Cloud Functions,加载产品通过Google Play Developer API提供,然后将其作为JSON提供给终端设备(云功能也允许插入Firebase)......但是,产品图片需要在本地缓存(在内部存储中,而不是资源)。

b)使用Google Play Developer API,以管理应用内商品和/或消耗品。

例如。当一个人使用网络应用程序启动应用程序内产品时,它会将产品插入Play商店,以使其通常为人所知。 FireStore,使其在Android应用程序中可见和可购买(或使用云功能,它将从API加载更新的产品Feed,具有相同的效果)。

答案 8 :(得分:0)

你可以分享偏好,这将是一个简单的出路。 当用户登录时,您可以从响应中检索他的付费箱ID(取决于您的表)。创建recyclerView时,您可以检查项目是否已付款并存储在共享偏好中。

在recyclelerview的bindViewHolder函数中检查以下伪代码

  1. if item ==&#34; pay&#34; &安培;&安培;项目存在于sharedprefrences列表中,使其可点击(或您想要的东西)
  2. 如果不是(其他部分),请转到付款页面。