← Alle Erweiterungen

Native Erweiterung

KlugBilling

com.klug.billing

KEIN APM NÖTIG. Herunterladen und loslegen. Einfacher geht es nicht. Einfach das Adobe AIR SDK aktualisieren. Wenn Sie Hilfe brauchen, sind wir für Sie da.

In-App-Käufe und Abonnements für AIR-Apps im App Store und bei Google Play, mit einer ActionScript-API für beide Stores.

iOS Android Im Produktiveinsatz Ab €19 / Jahr · Kaufen

Überblick

KlugBilling verkauft Einmalprodukte und Abonnements aus Ihrer AIR-App. Auf iPhone und iPad spricht es mit dem App Store, unter Android mit Google Play, und Ihr ActionScript-Code bleibt für beide gleich.

Es lädt Ihre Produkte mit lokalisierten Titeln und Preisen, öffnet den Kaufdialog des Stores, meldet jeden Schritt einer Transaktion und schließt sie ab, sobald Sie das Produkt ausgeliefert haben. Das Wiederherstellen früherer Käufe, der iOS-App-Beleg und die signierten Kaufdaten von Google Play sind enthalten, sodass Ihr Server jeden Verkauf prüfen kann.

Unter Android nutzt KlugBilling die aktuelle Google Play Billing Library 8. Sie wird beim Paketieren der App automatisch hinzugefügt und erfüllt die Anforderungen von Google Play für neue Apps und Updates.

KlugBilling verkauft die Abonnements unserer Apps auf iOS und Android, unseres Praxisbeweises.

Funktionen

  • Eigenständig: eine ANE, keine Kernbibliothek und keine abhängigen ANEs, die Sie ergänzen müssten
  • Eine API für den App Store und Google Play
  • Einmalprodukte und sich automatisch verlängernde Abonnements
  • Lokalisierte Titel, Beschreibungen und Preise direkt aus dem Store
  • Abo-Zeiträume, Angebote und Preisphasen
  • Jeder Transaktionsstatus als Ereignis: Kauf läuft, gekauft, fehlgeschlagen, abgebrochen, wiederhergestellt, zurückgestellt
  • Käufe wiederherstellen (iOS) und eigene Käufe auflisten (Android)
  • Daten für serverseitige Prüfungen: der iOS-App-Beleg, die signierten Kaufdaten von Google und die Signatur
  • Android: Käufe werden mit Ihrem öffentlichen Play-Schlüssel geprüft

Unterstützte Plattformen

iOS iPhone · iPad · App Store
Android Smartphones · Tablets · faltbare Geräte · Google Play Billing Library 8

Auf anderen Plattformen gibt InAppBilling.isSupported false zurück, sodass derselbe Code in einer plattformübergreifenden App bleiben kann.

Erste Schritte

Fügen Sie die Erweiterung Ihrem Application Descriptor hinzu:

app.xml
<extensions>
    <extensionID>com.klug.billing</extensionID>
</extensions>

Es sind keine Manifest-Einträge und keine Activities nötig. Legen Sie Ihre Produkte in App Store Connect und in der Google Play Console mit denselben Produkt-IDs an und kopieren Sie den öffentlichen base64-Schlüssel Ihrer App aus der Play Console (Monetarisierung einrichten).

Codebeispiele

Vier vollständige Abläufe, entnommen der API, die in unseren Apps läuft. Jeder Aufruf kehrt sofort zurück; Ergebnisse treffen als Ereignisse auf InAppBilling.service ein. Vollständige Dokumentation →

1 · Mit dem Store verbinden
Store.as
import com.klug.billing.*;
import com.klug.billing.events.*;

var store:InAppBillingService = InAppBilling.service;

if ( InAppBilling.isSupported )   // iOS, Android
{
    store.addEventListener( InAppBillingEvent.SETUP_SUCCESS, onSetup );
    store.addEventListener( InAppBillingEvent.SETUP_FAILURE, onSetupFailed );
    store.addEventListener( PurchaseEvent.PURCHASES_UPDATED, onPurchasesUpdated );   // see 3

    var service:BillingService = new BillingService();
    if ( store.platform == "android" )
        service.setServiceType( InAppBillingServiceTypes.GOOGLE_PLAY_INAPP_BILLING )
               .setGooglePlayPublicKey( "MIIBIjANBgkqh..." );   // from the Play Console, Android only
    else
        service.setServiceType( InAppBillingServiceTypes.APPLE_INAPP_PURCHASE );
    store.setup( service );
}

function onSetup( e:InAppBillingEvent ):void
{
    store.checkAvailability( function( result:String ):void {
        if ( result == InAppBillingAvailability.AVAILABLE ) loadProducts();   // see 2
        else hideShop();   // e.g. purchases disabled by Screen Time
    });
}
2 · Produkte mit lokalisierten Preisen anzeigen
Products.as
function loadProducts():void
{
    store.addEventListener( ProductEvent.PRODUCTS_LOADED, onProducts );
    store.addEventListener( ProductEvent.PRODUCTS_FAILED, function( e:ProductEvent ):void {
        trace( "store not reachable: " + e.message );
    });
    // one-time products first, subscriptions second
    store.getProducts( [ "com.example.removeads" ],
                       [ "com.example.pro.monthly", "com.example.pro.yearly" ] );
}

function onProducts( e:ProductEvent ):void
{
    for each ( var p:Product in e.products )
    {
        // e.g. "Pro Yearly · 19,99 €" in the user's currency and language
        addShopButton( p.id, p.title + " · " + p.priceString );   // your app function
    }
}
3 · Kaufen, ausliefern, abschließen
Purchase.as
function buy( productId:String ):void
{
    var request:PurchaseRequest = new PurchaseRequest().setProductId( productId );
    if ( store.checkPurchaseRequestValid( request ) ) store.makePurchase( request );
}

// every step of every transaction, also open ones from earlier sessions
function onPurchasesUpdated( e:PurchaseEvent ):void
{
    for each ( var p:Purchase in e.data )
    {
        switch ( p.transactionState )
        {
            case Purchase.STATE_PURCHASED:
            case Purchase.STATE_RESTORED:
                // iOS: p.transactionReceipt (app receipt)
                // Android: p.originalMessage + p.signature (Google's signed purchase data)
                verifyOnServer( p, function():void {   // your server call
                    unlock( p.productId );              // your app function
                    store.finishPurchase( p );          // close it, or the store sends it again
                });
                break;
            case Purchase.STATE_FAILED:
            case Purchase.STATE_CANCELLED:
                store.finishPurchase( p );
                break;
            case Purchase.STATE_DEFERRED:
                showHint( "Waiting for approval" );   // e.g. Ask to Buy
                break;
        }
    }
}
4 · Frühere Käufe wiederherstellen
Restore.as
function restore():void
{
    if ( store.isGetPurchasesSupported )   // Android: list what the Google account owns
    {
        store.addEventListener( PurchaseEvent.GET_PURCHASES_COMPLETE, function( e:PurchaseEvent ):void {
            for each ( var p:Purchase in e.data ) unlock( p.productId );
        });
        store.getPurchases();
    }
    else   // iOS: restored transactions arrive in onPurchasesUpdated with STATE_RESTORED
    {
        store.addEventListener( PurchaseEvent.RESTORE_PURCHASES_SUCCESS, function( e:PurchaseEvent ):void {
            showHint( "Purchases restored" );
        });
        store.restorePurchases();
    }
}

API-Übersicht

InAppBilling.isSupportedTrue unter iOS und Android, sonst false.
InAppBilling.serviceDer einzige Store-Dienst; alle Aufrufe und Ereignisse unten.
setup(service)Verbindet mit dem Store, der durch einen BillingService beschrieben ist. Ergebnis: SETUP_SUCCESS oder SETUP_FAILURE.
checkAvailability(callback)AVAILABLE, NOT_AVAILABLE oder STORE_UPGRADE_REQUIRED.
canMakePaymentsFalse, wenn Käufe auf dem Gerät deaktiviert sind.
getProducts(productIds, subscriptionIds)Lädt Store-Daten. Ergebnis: PRODUCTS_LOADED, INVALID_PRODUCT oder PRODUCTS_FAILED.
getProduct(id)Ein geladenes Product: title, description, price, priceString, currencyCode, subscriptionPeriod, subscriptionOffers.
makePurchase(request)Öffnet den Kaufdialog des Stores für einen PurchaseRequest; optional mit Abo-Angebot.
finishPurchase(purchase)Schließt eine Transaktion nach der Auslieferung ab. Ergebnis: FINISH_SUCCESS oder FINISH_FAILED.
getPendingPurchases()Transaktionen, die der Store noch offen hält.
restorePurchases()iOS: stellt frühere Käufe der Apple-ID wieder her.
getPurchases()Android: listet die Käufe des Google-Kontos auf.
applicationReceiptiOS: der App-Beleg als base64 für Ihren Server, mit refresh().
dispose()Trennt die Verbindung zum Store.

Ereignisse

InAppBillingEventSETUP_SUCCESS, SETUP_FAILURE, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED
ProductEventPRODUCTS_LOADED (Produkte), INVALID_PRODUCT, PRODUCTS_FAILED
PurchaseEventPURCHASES_UPDATED (data = Purchase-Objekte), PURCHASE_FAILED, FINISH_SUCCESS, FINISH_FAILED, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED, GET_PURCHASES_COMPLETE, GET_PURCHASES_FAILED
AvailabilityEventCOMPLETE mit dem Verfügbarkeitsergebnis
ApplicationReceiptEventREFRESH_SUCCESS, REFRESH_FAILED

KlugBilling kaufen

Eine Jahreslizenz für eine AIR-Anwendung, mit allen Updates für 12 Monate. Nach der Zahlung erhalten Sie die Erweiterung, die ActionScript-Bibliothek und die Dokumentation per E-Mail, in der Regel innerhalb eines Werktags. Lizenz und Bedingungen

Simple
€19 / Jahr
  • Lizenz für eine AIR-Anwendung
  • Alle Updates für 12 Monate
  • Kein Support
Simple kaufen
Standard
€149 / Jahr
  • Lizenz für eine AIR-Anwendung
  • Alle Updates für 12 Monate
  • Antwort per E-Mail innerhalb von 7 Tagen
Standard kaufen
Priority
€299 / Jahr
  • Lizenz für eine AIR-Anwendung
  • Alle Updates für 12 Monate
  • Antwort per E-Mail innerhalb von 48 Stunden
Priority kaufen
Die Steuern werden an der Kasse von Link (Stripe) berechnet. Die Application-ID Ihrer AIR-App geben Sie beim Bezahlen ein.

Voraussetzungen

AIR SDK51.x (HARMAN)
iOSiOS 13 oder neuer, Produkte in App Store Connect
AndroidAndroid 6.0 (API 23) oder neuer, Produkte in der Google Play Console
Google PlayPlay Billing Library 8.3, beim Paketieren hinzugefügt
Server (empfohlen)Prüft den iOS-App-Beleg oder die signierten Kaufdaten von Google