Skip to content
A libGDX cross-platform API for InApp purchasing.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/ISSUE_TEMPLATE Update issue templates Dec 12, 2018
gdx-pay-android-amazon gdx-pay-android setup fixed, dependencies of Amazon/Googlebilling mod… Nov 27, 2018
gdx-pay-android-googlebilling Google Billing: purchaseRestore restored consumed and cancelled produ… Jun 25, 2019
gdx-pay-client Removed googleplay implementation, PurchaseSystem and android-IAP Apr 23, 2019
gdx-pay-iosmoe-apple Further project cleanup, example project extracted, Android Studio im… Dec 4, 2018
gdx-pay-iosrobovm-apple iOS #198 Crash java.lang.IllegalArgumentException: No strong ref exists Jun 24, 2019
gdx-pay-server 0.12.1 published Apr 23, 2019
gdx-pay #169 remove various unused, unimplemented modules Jul 14, 2018
gradle/wrapper #182 Upgrade to Gradle 4.6 / Build Tools 28 Nov 17, 2018
.gitignore Added Multi-OS Engine support Nov 14, 2016
.travis.yml Travis generate keystore before building Nov 27, 2018
AUTHORS Added Multi-OS Engine support Nov 14, 2016
CHANGES Initial commit Oct 6, 2014
LICENSE Initial commit Oct 6, 2014 0.12.1 published Apr 23, 2019
build.gradle 1.0.0 published Jun 26, 2019 #123 update robovm to 2.3.1-SNAPSHOT Apr 20, 2017
gradlew #144 update libraries gradle to latest to have a succesful build. Apr 19, 2017
gradlew.bat #144 update libraries gradle to latest to have a succesful build. Apr 19, 2017
publish_android.gradle #9: Moved the group and version to standard properties in the root bu… Feb 26, 2016
publish_java.gradle #9: Moved the group and version to standard properties in the root bu… Feb 26, 2016
publish_to_maven_repo.gradle Add developer url Apr 20, 2017 Release procedure: documented initial steps, added build step Sep 29, 2017
settings.gradle Removed googleplay implementation, PurchaseSystem and android-IAP Apr 23, 2019

Build Status Maven Central Dependency Status

This project aims to provide a cross-platform API for InApp purchasing. The gdx-pay project is a libGDX extension. Current release version is 0.12.1. Please use at least libGDX v1.9.8, Robovm 2.3.5 or multi-os-engine v1.3.8.

SNAPSHOT builds are published regularly on

Supported payment services

Click on the links to view the subproject's readme files for service-dependant information and artifacts.


The recommended way to use gdx-pay is via dependency management with Gradle or Maven. Artifacts are available in Maven Central.


ext {
    gdxPayVersion = '0.12.1'

Add the following dependencies:


    compile "com.badlogicgames.gdxpay:gdx-pay-client:$gdxPayVersion"


    compile "com.badlogicgames.gdxpay:gdx-pay:$gdxPayVersion:sources"
    compile "com.badlogicgames.gdxpay:gdx-pay-client:$gdxPayVersion:sources"

You also need to add the following file to your GdxDefinition.gwt.xml in your html project:

    <inherits name="com.badlogic.gdx.pay_client"/>

That's all you need to use gdx-pay in the core project. Of course, you want to use a certain IAP service in your game. Look in the service subproject's readme files linked above.


The main interface you use to communicate with payment services is the PurchaseManager. Add a field holding it to your main game class:

public PurchaseManager purchaseManager;

In the launcher class you instantiate the PurchaseManager for the payment service you want to use:

game.purchaseManager = new DesiredPlatformPurchaseManager(...);

See the documentation of your desired payment service linked above on how to instantiate its PurchaseManager implementation.


Before using the PurchaseManager for payments, it needs to get installed: You need to provide a callback listener implementing the PurchaseObserver interface and a configuration. Typically, the configuration just passes the items you want to offer:

    PurchaseManagerConfig pmc = new PurchaseManagerConfig();
    pmc.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(YOUR_ITEM_SKU));
    pmc.addOffer(new Offer().setType(OfferType.CONSUMABLE).setIdentifier(YOUR_ITEM_SKU));
    pmc.addOffer(new Offer().setType(OfferType.SUBSCRIPTION).setIdentifier(YOUR_ITEM_SKU));
    // some payment services might need special parameters, see documentation
    pmc.addStoreParam(storename, param)

    purchaseManager.install(new MyPurchaseObserver(), pmc, true);

When the PurchaseManager is sucessfully installed, your PurchaseObserver will receive a callback and purchaseManager.installed() will return true. That might take some seconds depending on the payment service. You can now request information or purchase items.

If you are completely done with the PurchaseManager, call its dispose() method.

Request item information

It is important to know which of the items you added to the configuration are available at which price. Use getInformation() to retrieve an item Information object to do so:

Information skuInfo = purchaseManager.getInformation(sku);
if (skuInfo == null || skuInfo.equals(Information.UNAVAILABLE)) {
   // the item is not available...
} else {
   // enable a purchase button and set its price label

Purchase items

This is for what you are reading this! It is pretty easy to start a purchasement:


If the purchasement was successfully done, you will receive a call to PurchaseObserver.handlePurchase(). If there was an error, you might receive a call to your observer's handlePurchaseError() or handlePurchaseCanceled() method.

Restore purchases

If the user reinstalls your game or erased its data, it is important to let him restore his past purchases. You can do so by calling


You will get a callback to your observer's handleRestore() method with a list of past transactions.

Please note: Don't use this to query the user's bought entitlements on every game start, but persist them yourself. Call this method only when the user hits a "reclaim" button. The most important reasons for this:

  • (iOS only) Apple will reject your game if it calls purchaseRestore() without user interaction
  • You get only reliable results if the device is connected to the internet. If you don't persist entitlements yourself, your paying users are not able to use their purchases offline.
  • purchaseRestore() might take some time to fetch its results

Example project

If you have questions or problems, take a look at the example project demonstrating how to configure and use gdx-pay.

News & Community

Check the libGDX blog for news and updates. You can get help on the libGDX forum and talk to other users on the IRC channel #libgdx at or the libgdx discord.

Reporting Issues

Something not working quite as expected? Do you need a feature that has not been implemented yet? Check the issue tracker and add a new one if your problem is not already listed. Please try to provide a detailed description of your problem, including the steps to reproduce it.

Building from source

To build from source, clone or download this repository, then open it in Android Studio. Perform the following command to compile and upload the library in your local repository:

./gradlew assemble uploadArchives -PLOCAL

See build.gradle file for current version to use in your dependencies.


Awesome! If you would like to contribute with a new feature or a bugfix, fork this repo and submit a pull request. Also, before we can accept substantial code contributions, we need you to sign the libGDX Contributor License Agreement.


The gdx-pay project is licensed under the Apache 2 License, meaning you can use it free of charge, without strings attached in commercial and non-commercial projects. We love to get (non-mandatory) credit in case you release a game or app using gdx-pay!

You can’t perform that action at this time.