Home

Awesome

In-App Billing Plugin for .NET MAUI, Xamarin, and Windows

A simple In-App Purchase plugin for .NET MAUI, Xamarin, and Windows to query item information, purchase items, restore items, and more.

Subscriptions are supported on iOS, Android, and Mac. Windows/UWP/WinUI 3 - does not support subscriptions at this time.

Important Version Information

Documentation

Get started by reading through the In-App Billing Plugin documentation.

NuGet

Platform Support

PlatformVersion
Xamarin.iOS & iOS for .NET10+
Xamarin.Mac, macOS for .NET, macCatlyst for .NETAll
Xamarin.TVOS, tvOS for .NET10.13.2
Xamarin.Android, Android for .NET21+
Windows 10 UWP10+
Windows App SDK (WinUI 3)10+
Xamarin.FormsAll
.NET MAUIAll

Created By: @JamesMontemagno

Version 8 Major Updates

Version 7 Major Updates

If you receive an error in Google Play you may need to add this to your AndroidManifest.xml inside the application node:

<meta-data
  android:name="com.google.android.play.billingclient.version"
  android:value="6.1.0" />

If you are building against .NET 8 for Android you will need to add the following packages when using v7:

<ItemGroup Condition="'$(TargetFramework)' == 'net8.0-android'">  
        <PackageReference Include="Xamarin.AndroidX.Activity" Version="1.9.0.3" /> <!-- Temporary workaround, see: https://github.com/xamarin/AndroidX/issues/764 -->  
        <PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.9.0.3" /> <!-- Temporary workaround, see: https://github.com/xamarin/AndroidX/issues/764 -->  
        <PackageReference Include="Xamarin.AndroidX.Collection" Version="1.4.0.5" /> <!-- Temporary workaround, see: https://github.com/xamarin/AndroidX/issues/800 -->  
        <PackageReference Include="Xamarin.AndroidX.Collection.Ktx" Version="1.4.0.4" /> <!-- Temporary workaround, see: https://github.com/xamarin/AndroidX/issues/800 -->  
        <PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.4.0" />  
</ItemGroup>

Pending Transactions:

To respond to pending transactions you can subscribe to a listener in your Android project startup:

// Connect to the service here
await CrossInAppBilling.Current.ConnectAsync();

// Check if there are pending orders, if so then subscribe
var purchases = await CrossInAppBilling.Current.GetPurchasesAsync(ItemType.InAppPurchase);

if (purchases?.Any(p => p.State == PurchaseState.PaymentPending) ?? false)
{
  Plugin.InAppBilling.InAppBillingImplementation.OnAndroidPurchasesUpdated = (billingResult, purchases) =>
  {
       // decide what you are going to do here with purchases
       // probably acknowledge
       // probably disconnect
  };
}
else
{
  await CrossInAppBilling.Current.DisconnectAsync();
}

If you do connect the IsConnected propety will be true and when you make purchases or check purchases again you should check ahead of time and not re-connect or disconnect if there are pending purchases

I highly recommend reading the entire Google Play Billing System docs.

Consumable vs Non-consumables on Android

On Android if you purchase anything you must first Acknowledge a purchase else it will be refunded. See the android documentation.

https://developer.android.com/google/play/billing/integrate#process https://developer.android.com/google/play/billing/integrate#pending

For consumables, the consumeAsync() method fulfills the acknowledgement requirement and indicates that your app has granted entitlement to the user. This method also enables your app to make the one-time product available for purchase again.

So, if you have a consumable... ConsumePurchaseAsync will also acknowledge it, if you have a non-consumable you will need to call AcknowledgePurchaseAsync.

Version 4+ Linker Settings

For linking if you are setting Link All you may need to add:

Android:

Plugin.InAppBilling;Xamarin.Android.Google.BillingClient

Android Progaurd Rules

-keep class com.android.billingclient.api.** { *; }
-keep class com.android.vending.billing.** { *; }

iOS:

--linkskip=Plugin.InAppBilling

License

The MIT License (MIT), see LICENSE file.

Want To Support This Project?

All I have ever asked is to be active by submitting bugs, features, and sending those pull requests down! Want to go further? Make sure to subscribe to my weekly development podcast Merge Conflict, where I talk all about awesome Xamarin goodies and you can optionally support the show by becoming a supporter on Patreon.