75 votes

Tutoriel de facturation en App Android

Il semble que c’est assez compliqué à mettre en œuvre en application de facturation dans une application Android. Y a-t-il un bon tutoriaux pour cela ? L’exemple d’application dans le kit de développement a seulement une activité, qui sorte de simplifie à l’excès elle pour une application comme le mien qui a de multiples activités.

42voto

sfratini Points 1814

Eh bien, je vais essayer d'expliquer ce que j'ai vécu. Je ne me considère pas comme un expert sur ce sujet, mais je me suis cassé la tête à plusieurs jours.

Pour commencer, j'ai eu un très mauvais moment à essayer de comprendre le flux de travail de l'exemple et de la demande. J'ai pensé qu'il devrait être mieux de commencer par un exemple simple, cependant il est plus difficile de séparer le code en petits morceaux et de ne pas savoir si vous êtes en rupture de rien. Je vais vous dire ce que j'ai et ce que j'ai changé à partir de l'exemple de la faire fonctionner.

J'ai une seule Activité où tous mes achats à venir. Il est appelé Pro.

Tout d'abord, vous devez mettre à jour la variable base64EncodedPublicKey dans votre classe de Sécurité avec votre Marché public clé de développeur ou vous verrez une belle Exception.

Eh bien, je lier mon Activité à mon BillingService comme suit:

      public class Pro extends TrackedActivity implements OnItemClickListener {

            private BillingService mBillingService;
            private BillingPurchaseObserver mBillingPurchaseObserver;
            private Handler mHandler;

            @Override
            protected void onCreate(Bundle savedInstanceState) {    
                super.onCreate(savedInstanceState);     
                setContentView(R.layout.pro);


                //Do my stuff

                mBillingService = new BillingService();
                mBillingService.setContext(getApplicationContext());

                mHandler = new Handler();
                mBillingPurchaseObserver = new BillingPurchaseObserver(mHandler);

            }

        }



    @Override
    protected void onStart() {
       //Register the observer to the service
        super.onStart();
        ResponseHandler.register(mBillingPurchaseObserver);   
    }


    @Override
    protected void onStop() {
        //Unregister the observer since you dont need anymore
        super.onStop();
        ResponseHandler.unregister(mBillingPurchaseObserver);
    }

    @Override
    protected void onDestroy() {
       //Unbind the service
        super.onDestroy();
        mBillingService.unbind();
    }

De cette façon, tous les achats parler à ce service, qui sera ensuite, envoyez le JSON demandes du marché. Vous pourriez penser que les achats sont effectués sur le même instant, mais non. Vous envoyez la demande et l'achat pourrait venir quelques minutes ou heures plus tard. Je pense que cela est principalement du à la surcharge du serveur et de l'approbation des cartes de crédit.

Ensuite, j'ai une ListView avec mes articles, et j'ai ouvert un AlertDialog sur chacun d'eux, en les invitant à acheter l'objet. Lors d'un clic sur un élément, je fais ceci:

  private class BuyButton implements DialogInterface.OnClickListener {

       private BillingItem item = null;
       private String developerPayload;

       public BuyButton(BillingItem item, String developerPayload) {
        this.item = item;
        this.developerPayload = developerPayload;
        }

            @Override
            public void onClick(DialogInterface dialog, int which) {

                if (GeneralHelper.isOnline(getApplicationContext())){
                    //I track the buy here with GA SDK. 

        mBillingService.requestPurchase(this.item.getSku(), this.developerPayload);             
                } else {                
                    Toast.makeText(getApplicationContext(), R.string.msg_not_online, Toast.LENGTH_SHORT).show();
                }

            }

        }

Bien, vous devriez voir que le Marché s'ouvre et l'utilisateur ait terminé ou annule l'acheter.

Ce qui est alors important, c'est mon PurChaseObserver, qui gère tous les événements marché de l'envoie. C'est une dépouillé version de celui-ci, mais vous devriez obtenir le point (Voir mes commentaires à travers le code):

private class BillingPurchaseObserver extends PurchaseObserver {
        public BillingPurchaseObserver(Handler handler) {
            super(Pro.this, handler);
        }

        @Override
        public void onBillingSupported(boolean supported) {

            if (supported) {
                //Enable buy functions. Not required, but you can do stuff here. The market first checks if billing is supported. Maybe your country is not supported, for example. 
            } else {
                Toast.makeText(getApplicationContext(), R.string.billing_not_supported, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
                int quantity, long purchaseTime, String developerPayload) {

//This is the method that is called when the buy is completed or refunded I believe. 
// Here you can do something with the developerPayload. Its basically a Tag you can use to follow your transactions. i dont use it. 

        BillingItem item = BillingItem.getBySku(getApplicationContext(), itemId);

        if (purchaseState == PurchaseState.PURCHASED) {
            if (item != null){
//This is my own implementation that sets the item purchased in my database. BillingHelper is a class with methods I use to check if the user bought an option and update the UI. You should also check for refunded. You can see the Consts class to find what you need to check for. 

                    boolean resu = item.makePurchased(getApplicationContext());
                    if (resu){                      
                        Toast.makeText(getApplicationContext(), R.string.billing_item_purchased, Toast.LENGTH_LONG).show();
                    }
                }
            }
        }

        private void trackPurchase(BillingItem item, long purchaseTime) {           
            //My code to track the purchase in GA
        }

        @Override
        public void onRequestPurchaseResponse(RequestPurchase request,
                ResponseCode responseCode) {

               //This is the callback that happens when you sent the request. It doesnt mean you bought something. Just that the Market received it. 

            if (responseCode == ResponseCode.RESULT_OK) {               

                Toast.makeText(getApplicationContext(), R.string.billing_item_request_sent, Toast.LENGTH_SHORT).show();

            } else if (responseCode == ResponseCode.RESULT_USER_CANCELED) {
                //The user canceled the item. 
            } else {
            //If it got here, the Market had an unexpected problem. 
            }
        }

        @Override
        public void onRestoreTransactionsResponse(RestoreTransactions request,
                ResponseCode responseCode) {
            if (responseCode == ResponseCode.RESULT_OK) {
//Restore transactions should only be run once in the lifecycle of your application unless you reinstalled the app or wipe the data. 

                SharedPreferences.Editor edit = PreferencesHelper.getInstance().getDefaultSettings(getApplicationContext()).edit();
                edit.putBoolean(Consts.DB_INITIALIZED, true);
                edit.commit();

            } else {
    //Something went wrong
            }
        }
    }

Et je crois que vous ne devriez pas avoir à modifier quoi que ce soit d'autre. Le reste du code "fonctionne". Vous pouvez essayer d'utiliser l'exemple de code SKU au premier dans vos propres éléments "d'android.test.achetés". Pour l'instant j'ai testé et il fonctionne cependant j'ai encore besoin de couvrir tout comme le remboursés état. Dans ce cas, je me suis laisser à l'utilisateur de garder les caractéristiques, mais je voulez vous assurer qu'il fonctionne parfaitement avant de portées il.

J'espère que cela vous aide, vous et les autres.

13voto

Alexander Sidikov Points 502

V3 : Voici un tutoriel pour un démarrage rapide... He´s en utilisant les classes d’assistance de l’exemple de google (Trivial en voiture)... Bon, comme premier « Bonjour facturation »...

http://www.techotopia.com/index.php/Integrating_Google_Play_In-app_Billing_into_an_AndroidApplication%e2%80%93_A_Tutorial

9voto

unlimit Points 1767

Pour en application facturation v3, j’ai trouvé ce vraiment utile http://blog.blundell-apps.com/simple-inapp-billing-payment-v3/

5voto

Christopher Perry Points 7972

Si vous voulez utiliser une bibliothèque facile de publier à travers le jeu de Google et l’Appstore d’Amazon, vous pouvez aller avec RoboBillingLibrary. Il isole les détails des deux en une bibliothèque facile à utiliser. Il y a des instructions ici détaillées : https://github.com/christopherperry/RoboBillingLibrary

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X