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
Muilla alustoilla InAppBilling.isSupported palauttaa false, joten sama koodi voi pysyä monialustaisessa sovelluksessa.
Aloitus
Lisää laajennus sovelluksesi descriptoriin:
<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 →
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(); } }
Rajapintayleiskatsaus
| InAppBilling.isSupported | True iOS:llä ja Androidilla, muualla false. |
| InAppBilling.service | Ainoa 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. |
| canMakePayments | False, 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. |
| applicationReceipt | iOS: sovelluksen kuitti base64-muodossa palvelimellesi, mukana refresh(). |
| dispose() | Katkaisee yhteyden kauppaan. |
Tapahtumat
| InAppBillingEvent | SETUP_SUCCESS, SETUP_FAILURE, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED |
| ProductEvent | PRODUCTS_LOADED (products), INVALID_PRODUCT, PRODUCTS_FAILED |
| PurchaseEvent | PURCHASES_UPDATED (data = Purchase-oliot), PURCHASE_FAILED, FINISH_SUCCESS, FINISH_FAILED, RESTORE_PURCHASES_SUCCESS, RESTORE_PURCHASES_FAILED, GET_PURCHASES_COMPLETE, GET_PURCHASES_FAILED |
| AvailabilityEvent | COMPLETE ja saatavuuden tulos |
| ApplicationReceiptEvent | REFRESH_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
- Lisenssi yhdelle AIR-sovellukselle
- Kaikki päivitykset 12 kuukauden ajan
- Ei tukea
- Lisenssi yhdelle AIR-sovellukselle
- Kaikki päivitykset 12 kuukauden ajan
- Vastaus sähköpostitse 7 päivän kuluessa
- Lisenssi yhdelle AIR-sovellukselle
- Kaikki päivitykset 12 kuukauden ajan
- Vastaus sähköpostitse 48 tunnin kuluessa
Vaatimukset
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 tai uudempi, tuotteet App Store Connectissa |
| Android | Android 6.0 (API 23) tai uudempi, tuotteet Google Play Consolessa |
| Google Play | Play Billing Library 8.3, lisätään paketoinnissa |
| Palvelin (suositeltu) | Tarkistaa iOS-sovelluksen kuitin tai Googlen allekirjoitetut ostotiedot |