← Alle utvidelser

Native utvidelse

KlugBilling

com.klug.billing

INGEN APM NØDVENDIG. Last ned og bruk. Det blir ikke enklere enn dette. Bare oppdater Adobe AIR SDK. Trenger du hjelp, er vi her.

Kjøp i appen og abonnementer for AIR-apper på App Store og Google Play, med ett ActionScript-API for begge butikkene.

iOS Android I produksjon Fra €19 / år · Kjøp

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

iOS iPhone · iPad · App Store
Android telefoner · nettbrett · sammenleggbare telefoner · Google Play Billing Library 8

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:

app.xml
<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 →

1 · Koble til butikken
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 · Vis produkter med lokaliserte priser
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 · Kjøp, lever, avslutt
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 · Gjenopprett tidligere kjøp
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-oversikt

InAppBilling.isSupportedTrue på iOS og Android, false andre steder.
InAppBilling.serviceDen 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.
canMakePaymentsFalse 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.
applicationReceiptiOS: appkvitteringen som base64 for serveren din, med refresh().
dispose()Kobler fra butikken.

Hendelser

InAppBillingEventSETUP_SUCCESS, SETUP_FAILURE, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED
ProductEventPRODUCTS_LOADED (products), INVALID_PRODUCT, PRODUCTS_FAILED
PurchaseEventPURCHASES_UPDATED (data = Purchase-objekter), PURCHASE_FAILED, FINISH_SUCCESS, FINISH_FAILED, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED, GET_PURCHASES_COMPLETE, GET_PURCHASES_FAILED
AvailabilityEventCOMPLETE med tilgjengelighetsresultatet
ApplicationReceiptEventREFRESH_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

Enkel
€19 / år
  • Lisens for én AIR-applikasjon
  • Alle oppdateringer i 12 måneder
  • Ingen støtte
Kjøp Enkel
Standard
€149 / år
  • Lisens for én AIR-applikasjon
  • Alle oppdateringer i 12 måneder
  • Svar på e-post innen 7 dager
Kjøp Standard
Prioritet
€299 / år
  • Lisens for én AIR-applikasjon
  • Alle oppdateringer i 12 måneder
  • Svar på e-post innen 48 timer
Kjøp Prioritet
Skatter og avgifter beregnes ved kassen av Link (Stripe). Du oppgir applikasjons-ID-en til AIR-appen din under kassen.

Krav

AIR SDK51.x (HARMAN)
iOSiOS 13 eller nyere, produkter i App Store Connect
AndroidAndroid 6.0 (API 23) eller nyere, produkter i Google Play Console
Google PlayPlay Billing Library 8.3, legges til ved pakking
Server (anbefalt)Verifiserer iOS-appkvitteringen eller Googles signerte kjøpsdata