Oversikt
KlugBilling selger engangsprodukter og abonnementer fra AIR-appen din. På iPhone og iPad snakker den med App Store, på Android med Google Play, og ActionScript-koden din forblir den samme for begge.
Den laster inn produktene dine med lokaliserte titler og priser, åpner butikkens kjøpsark, rapporterer hvert trinn i en transaksjon og avslutter den når du har levert produktet. Gjenoppretting av tidligere kjøp, iOS-appkvitteringen og Google Plays signerte kjøpsdata er inkludert, slik at serveren din kan verifisere hvert salg.
På Android bruker KlugBilling det gjeldende Google Play Billing Library 8. Det legges til automatisk når appen pakkes, og oppfyller Google Plays krav for nye apper og oppdateringer.
KlugBilling selger abonnementene i appene våre på iOS og Android, vårt proof of concept.
Funksjoner
- Selvstendig: én ANE, ingen kjernebibliotek eller avhengige ANE-er å legge til
- Ett API for App Store og Google Play
- Engangsprodukter og automatisk fornyede abonnementer
- Lokaliserte titler, beskrivelser og priser rett fra butikken
- Abonnementsperioder, tilbud og prisfaser
- Hver transaksjonsstatus som en hendelse: kjøper, kjøpt, mislykket, avbrutt, gjenopprettet, utsatt
- Gjenopprett kjøp (iOS) og list opp eide kjøp (Android)
- Data for kontroller på serversiden: iOS-appkvitteringen, Googles signerte kjøpsdata og signatur
- Android: kjøp kontrolleres mot den offentlige Play-nøkkelen din
Støttede plattformer
På andre plattformer returnerer InAppBilling.isSupported false, slik at den samme koden kan bli værende i en plattformuavhengig app.
Kom i gang
Legg utvidelsen til i applikasjonsbeskrivelsen din:
<extensions>
<extensionID>com.klug.billing</extensionID>
</extensions>
Ingen manifestoppføringer og ingen aktiviteter er nødvendig. Opprett produktene dine i App Store Connect og i Google Play Console med de samme produkt-ID-ene, og kopier appens offentlige base64-nøkkel fra Play Console (Monetization setup).
Kodeeksempler
Fire komplette flyter, hentet fra API-et som kjører i appene våre. Hvert kall returnerer med en gang; resultatene kommer som hendelser på InAppBilling.service. Full dokumentasjon →
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-oversikt
| InAppBilling.isSupported | True på iOS og Android, false andre steder. |
| InAppBilling.service | Den ene butikktjenesten; alle kall og hendelser nedenfor. |
| setup(service) | Kobler til butikken som beskrives av en BillingService. Resultat: SETUP_SUCCESS eller SETUP_FAILURE. |
| checkAvailability(callback) | AVAILABLE, NOT_AVAILABLE eller STORE_UPGRADE_REQUIRED. |
| canMakePayments | False når kjøp er deaktivert på enheten. |
| getProducts(productIds, subscriptionIds) | Laster inn butikkdata. Resultat: PRODUCTS_LOADED, INVALID_PRODUCT eller PRODUCTS_FAILED. |
| getProduct(id) | Et innlastet Product: title, description, price, priceString, currencyCode, subscriptionPeriod, subscriptionOffers. |
| makePurchase(request) | Åpner butikkens kjøpsark for en PurchaseRequest; valgfritt abonnementstilbud. |
| finishPurchase(purchase) | Avslutter en transaksjon etter levering. Resultat: FINISH_SUCCESS eller FINISH_FAILED. |
| getPendingPurchases() | Transaksjoner som butikken fortsatt holder åpne. |
| restorePurchases() | iOS: gjenoppretter tidligere kjøp for Apple-ID-en. |
| getPurchases() | Android: lister opp kjøpene på Google-kontoen. |
| applicationReceipt | iOS: appkvitteringen som base64 for serveren din, med refresh(). |
| dispose() | Kobler fra butikken. |
Hendelser
| InAppBillingEvent | SETUP_SUCCESS, SETUP_FAILURE, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED |
| ProductEvent | PRODUCTS_LOADED (products), INVALID_PRODUCT, PRODUCTS_FAILED |
| PurchaseEvent | PURCHASES_UPDATED (data = Purchase-objekter), PURCHASE_FAILED, FINISH_SUCCESS, FINISH_FAILED, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED, GET_PURCHASES_COMPLETE, GET_PURCHASES_FAILED |
| AvailabilityEvent | COMPLETE med tilgjengelighetsresultatet |
| ApplicationReceiptEvent | REFRESH_SUCCESS, REFRESH_FAILED |
Kjøp KlugBilling
En årslisens for én AIR-applikasjon, med alle oppdateringer i 12 måneder. Etter betaling mottar du utvidelsen, ActionScript-biblioteket og dokumentasjonen på e-post, vanligvis innen én virkedag. Lisens og vilkår
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Ingen støtte
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 7 dager
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 48 timer
Krav
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 eller nyere, produkter i App Store Connect |
| Android | Android 6.0 (API 23) eller nyere, produkter i Google Play Console |
| Google Play | Play Billing Library 8.3, legges til ved pakking |
| Server (anbefalt) | Verifiserer iOS-appkvitteringen eller Googles signerte kjøpsdata |