In App Purchase 2
In-App Purchase on iOS, Android, Windows, macOS and XBox.
#
Featuresios | android | win-8 | win-10/uwp | mac | |
---|---|---|---|---|---|
consumables | ✅ | ✅ | ✅ | ✅ | ✅ |
non consumables | ✅ | ✅ | ✅ | ✅ | ✅ |
subscriptions | ✅ | ✅ | ✅ | ✅ | ✅ |
restore purchases | ✅ | ✅ | ✅ | ✅ | ✅ |
receipt validations | ✅ | ✅ | ✅ | ✅ | |
downloadable content | ✅ | ✅ | |||
introductory prices | ✅ | ✅ | ✅ | ✅ |
Supports:
- iOS version 7.0 or higher.
- Android version 2.2 (API level 8) or higher
- with Google Play client version 3.9.16 or higher
- Windows Store/Phone 8.1 or higher
- Windows 10 Mobile
- macOS version 10
- Xbox One
- (and any platform supporting Microsoft's UWP)
https://github.com/j3k0/cordova-plugin-purchase
Stuck on a Cordova issue?
If you're building a serious project, you can't afford to spend hours troubleshooting. Ionic’s experts offer premium advisory services for both community plugins and premier plugins.
Installation#
- Capacitor
- Cordova
- Enterprise
Ionic Enterprise comes with fully supported and maintained plugins from the Ionic Team. Learn More or if you're interested in an enterprise version of this plugin Contact Us
#
Supported Platforms- iOS
- Android
- Windows
#
Usage#
ReactLearn more about using Ionic Native components in React
#
Angular#
Full example#
PhilosophyThe API is mostly events based. As a user of this plugin, you will have to register listeners to changes happening to the products you register.
The core of the listening mechanism is the when()
method. It allows you to
be notified of changes to one or a set of products using a query mechanism:
The updated
event is fired whenever one of the fields of a product is
changed (its owned
status for instance).
This event provides a generic way to track the statuses of your purchases, to unlock features when needed and to refresh your views accordingly.
#
Registering productsThe store needs to know the type and identifiers of your products before you can use them in your code.
Use store.register()
to define them before your first call to store.refresh()
.
Once registered, you can use store.get()
to retrieve an IAPProduct
object.
The product id
and type
have to match products defined in your
Apple, Google or Microsoft developer consoles.
Learn more about it from the wiki.
#
Displaying productsRight after you registered your products, nothing much is known about them
except their id
, type
and an optional alias
.
When you perform the initial call to store.refresh()
, the platforms' server will
be contacted to load informations about the registered products: human
readable title
and description
, price
, etc.
This isn't an optional step, store owners require you to display information about a product exactly as retrieved from their server: no hard-coding of price and title allowed! This is also convenient for you as you can change the price of your items knowing that it'll be reflected instantly on your clients' devices.
Note that the information may not be available when the first view that needs them appears on screen. For you, the best option is to have your view monitor changes made to the product.
#
Purchasing#
initiate a purchasePurchases are initiated using the store.order("some_product_id")
method.
The store will manage the internal purchase flow. It'll end:
- with an
approved
event. The product enters theAPPROVED
state. - with a
cancelled
event. The product gets back to theVALID
state. - with an
error
event. The product gets back to theVALID
state.
See the product life-cycle section for details about product states.
#
finish a purchaseOnce the transaction is approved, the product still isn't owned: the store needs confirmation that the purchase was delivered before closing the transaction.
To confirm delivery, you'll use the product.finish()
method.
#
example usageDuring initialization:
When the purchase button is clicked:
#
un-finished purchasesIf your app wasn't able to deliver the content, product.finish()
won't be called.
Don't worry: the approved
event will be re-triggered the next time you
call store.refresh()
, which can very well be the next time
the application starts. Pending transactions are persistant.
#
simple caseIn the most simple case, where:
- delivery of purchases is only local ;
- you don't want (or need) to implement receipt validation ;
You may just want to finish all purchases automatically. You can do it this way:
NOTE: the "product" query will match any purchases (see "queries" to learn more details about queries).
#
Receipt validationTo get the most up-to-date information about purchases (in case a purchase have been canceled, or a subscription renewed), you should implement server side receipt validation.
This also protects you against fake "purchases", made by some users using "free in-app purchase" apps on their devices.
When a purchase has been approved by the store, it's enriched with
transaction information (see product.transaction
attribute).
To verify a purchase you'll have to do three things:
- configure the validator.
- call
product.verify()
from theapproved
event, before finishing the transaction. - finish the transaction when transaction is
verified
.
Shameless Plug: this is a feature many users struggle with, so as the author of this plugin, we can provide it to you as-a-service: https://billing.fovea.cc/ (which is free until you start making serious money)
#
example using a validation URL#
SubscriptionsFor subscription, you MUST implement remote receipt validation.
When the receipt validator returns a store.PURCHASE_EXPIRED
error code, the subscription will
automatically loose its owned
status.
Typically, you'll enable and disable access to your content this way.
#
Product life-cycleA product will change state during the application execution.
Find below a diagram of the different states a product can pass by.