Ü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
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:
<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 →
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 }); }
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 } }
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; } } }
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.isSupported | True unter iOS und Android, sonst false. |
| InAppBilling.service | Der 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. |
| canMakePayments | False, 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. |
| applicationReceipt | iOS: der App-Beleg als base64 für Ihren Server, mit refresh(). |
| dispose() | Trennt die Verbindung zum Store. |
Ereignisse
| InAppBillingEvent | SETUP_SUCCESS, SETUP_FAILURE, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED |
| ProductEvent | PRODUCTS_LOADED (Produkte), INVALID_PRODUCT, PRODUCTS_FAILED |
| PurchaseEvent | PURCHASES_UPDATED (data = Purchase-Objekte), PURCHASE_FAILED, FINISH_SUCCESS, FINISH_FAILED, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED, GET_PURCHASES_COMPLETE, GET_PURCHASES_FAILED |
| AvailabilityEvent | COMPLETE mit dem Verfügbarkeitsergebnis |
| ApplicationReceiptEvent | REFRESH_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
- Lizenz für eine AIR-Anwendung
- Alle Updates für 12 Monate
- Kein Support
- Lizenz für eine AIR-Anwendung
- Alle Updates für 12 Monate
- Antwort per E-Mail innerhalb von 7 Tagen
- Lizenz für eine AIR-Anwendung
- Alle Updates für 12 Monate
- Antwort per E-Mail innerhalb von 48 Stunden
Voraussetzungen
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 oder neuer, Produkte in App Store Connect |
| Android | Android 6.0 (API 23) oder neuer, Produkte in der Google Play Console |
| Google Play | Play Billing Library 8.3, beim Paketieren hinzugefügt |
| Server (empfohlen) | Prüft den iOS-App-Beleg oder die signierten Kaufdaten von Google |