← Kaikki laajennukset

Natiivilaajennus

KlugBilling

com.klug.billing

APM EI OLE TARPEEN. Lataa ja nauti. Yksinkertaisempaa ei voi olla. Päivitä vain Adobe AIR SDK. Jos tarvitset apua, olemme täällä.

Sovelluksen sisäiset ostot ja tilaukset AIR-sovelluksille App Storessa ja Google Playssa, yhdellä ActionScript-rajapinnalla molemmille kaupoille.

iOS Android Tuotantokäytössä Alkaen €19 / vuosi · Osta

Yleiskatsaus

KlugBilling myy kertaostettavia tuotteita ja tilauksia AIR-sovelluksestasi. iPhonella ja iPadilla se asioi App Storen kanssa, Androidilla Google Playn kanssa, ja ActionScript-koodisi pysyy samana molemmissa.

Se lataa tuotteesi lokalisoiduilla nimillä ja hinnoilla, avaa kaupan ostonäkymän, raportoi ostotapahtuman jokaisen vaiheen ja päättää sen, kun olet toimittanut tuotteen. Aiempien ostojen palautus, iOS-sovelluksen kuitti ja Google Playn allekirjoitetut ostotiedot sisältyvät, joten palvelimesi voi tarkistaa jokaisen myynnin.

Androidilla KlugBilling käyttää ajantasaista Google Play Billing Library 8 -kirjastoa. Se lisätään automaattisesti sovellusta paketoitaessa ja täyttää Google Playn vaatimukset uusille sovelluksille ja päivityksille.

KlugBilling myy sovellustemme tilaukset iOS:llä ja Androidilla, todisteenamme toimivuudesta.

Ominaisuudet

  • Itsenäinen: yksi ANE, ei ydinkirjastoa tai riippuvaisia ANE-laajennuksia lisättäväksi
  • Yksi rajapinta App Storelle ja Google Playlle
  • Kertaostettavat tuotteet ja automaattisesti uusiutuvat tilaukset
  • Lokalisoidut nimet, kuvaukset ja hinnat suoraan kaupasta
  • Tilausjaksot, tarjoukset ja hinnoitteluvaiheet
  • Jokainen ostotapahtuman tila tapahtumana: ostossa, ostettu, epäonnistunut, peruttu, palautettu, lykätty
  • Ostojen palautus (iOS) ja omistettujen ostojen luettelo (Android)
  • Tiedot palvelinpuolen tarkistuksiin: iOS-sovelluksen kuitti, Googlen allekirjoitetut ostotiedot ja allekirjoitus
  • Android: ostot tarkistetaan Play-julkista avaintasi vasten

Tuetut alustat

iOS iPhone · iPad · App Store
Android puhelimet · tabletit · taittuvat laitteet · Google Play Billing Library 8

Muilla alustoilla InAppBilling.isSupported palauttaa false, joten sama koodi voi pysyä monialustaisessa sovelluksessa.

Aloitus

Lisää laajennus sovelluksesi descriptoriin:

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

Manifestimerkintöjä tai aktiviteetteja ei tarvita. Luo tuotteesi App Store Connectissa ja Google Play Consolessa samoilla tuotetunnuksilla ja kopioi sovelluksesi base64-muotoinen julkinen avain Play Consolesta (Monetization setup).

Koodiesimerkit

Neljä täydellistä esimerkkiä rajapinnasta, joka pyörii sovelluksissamme. Jokainen kutsu palaa heti; tulokset saapuvat tapahtumina kohteeseen InAppBilling.service. Koko dokumentaatio →

1 · Yhteys kauppaan
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 · Tuotteiden näyttäminen lokalisoiduin hinnoin
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 · Osto, toimitus, päättäminen
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 · Aiempien ostojen palautus
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();
    }
}

Rajapintayleiskatsaus

InAppBilling.isSupportedTrue iOS:llä ja Androidilla, muualla false.
InAppBilling.serviceAinoa kauppapalvelu; kaikki alla olevat kutsut ja tapahtumat kulkevat sen kautta.
setup(service)Muodostaa yhteyden BillingService-olion kuvaamaan kauppaan. Tulos: SETUP_SUCCESS tai SETUP_FAILURE.
checkAvailability(callback)AVAILABLE, NOT_AVAILABLE tai STORE_UPGRADE_REQUIRED.
canMakePaymentsFalse, kun ostot on poistettu käytöstä laitteessa.
getProducts(productIds, subscriptionIds)Lataa kaupan tiedot. Tulos: PRODUCTS_LOADED, INVALID_PRODUCT tai PRODUCTS_FAILED.
getProduct(id)Ladattu Product: title, description, price, priceString, currencyCode, subscriptionPeriod, subscriptionOffers.
makePurchase(request)Avaa kaupan ostonäkymän PurchaseRequest-pyynnölle; valinnainen tilaustarjous.
finishPurchase(purchase)Päättää ostotapahtuman toimituksen jälkeen. Tulos: FINISH_SUCCESS tai FINISH_FAILED.
getPendingPurchases()Ostotapahtumat, jotka kauppa pitää vielä avoimina.
restorePurchases()iOS: palauttaa Apple ID:n aiemmat ostot.
getPurchases()Android: luettelee Google-tilin ostot.
applicationReceiptiOS: sovelluksen kuitti base64-muodossa palvelimellesi, mukana refresh().
dispose()Katkaisee yhteyden kauppaan.

Tapahtumat

InAppBillingEventSETUP_SUCCESS, SETUP_FAILURE, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED
ProductEventPRODUCTS_LOADED (products), INVALID_PRODUCT, PRODUCTS_FAILED
PurchaseEventPURCHASES_UPDATED (data = Purchase-oliot), PURCHASE_FAILED, FINISH_SUCCESS, FINISH_FAILED, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED, GET_PURCHASES_COMPLETE, GET_PURCHASES_FAILED
AvailabilityEventCOMPLETE ja saatavuuden tulos
ApplicationReceiptEventREFRESH_SUCCESS, REFRESH_FAILED

Osta KlugBilling

Vuosilisenssi yhdelle AIR-sovellukselle, kaikki päivitykset 12 kuukauden ajan. Maksun jälkeen saat laajennuksen, ActionScript-kirjaston ja dokumentaation sähköpostitse, yleensä yhden arkipäivän kuluessa. Lisenssi ja ehdot

Perus
€19 / vuosi
  • Lisenssi yhdelle AIR-sovellukselle
  • Kaikki päivitykset 12 kuukauden ajan
  • Ei tukea
Osta Perus
Vakio
€149 / vuosi
  • Lisenssi yhdelle AIR-sovellukselle
  • Kaikki päivitykset 12 kuukauden ajan
  • Vastaus sähköpostitse 7 päivän kuluessa
Osta Vakio
Prioriteetti
€299 / vuosi
  • Lisenssi yhdelle AIR-sovellukselle
  • Kaikki päivitykset 12 kuukauden ajan
  • Vastaus sähköpostitse 48 tunnin kuluessa
Osta Prioriteetti
Link (Stripe) laskee verot kassalla. Syötät AIR-sovelluksesi sovellustunnuksen kassalla.

Vaatimukset

AIR SDK51.x (HARMAN)
iOSiOS 13 tai uudempi, tuotteet App Store Connectissa
AndroidAndroid 6.0 (API 23) tai uudempi, tuotteet Google Play Consolessa
Google PlayPlay Billing Library 8.3, lisätään paketoinnissa
Palvelin (suositeltu)Tarkistaa iOS-sovelluksen kuitin tai Googlen allekirjoitetut ostotiedot