Plugin.InAppBilling 9.1.0

dotnet add package Plugin.InAppBilling --version 9.1.0
                    
NuGet\Install-Package Plugin.InAppBilling -Version 9.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Plugin.InAppBilling" Version="9.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Plugin.InAppBilling" Version="9.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Plugin.InAppBilling" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Plugin.InAppBilling --version 9.1.0
                    
#r "nuget: Plugin.InAppBilling, 9.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Plugin.InAppBilling@9.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Plugin.InAppBilling&version=9.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Plugin.InAppBilling&version=9.1.0
                    
Install as a Cake Tool

In-App Billing Plugin for .NET MAUI and Windows

A simple In-App Purchase plugin for .NET MAUI 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

  • v9 now supports .NET 9+ and Android Billing v7
  • v8 now supports .NET 8+ .NET MAUI and Windows Apps.
  • v7 now supports .NET 6+, .NET MAUI, UWP, and Xamarin/Xamarin.Forms projects
  • v7 is built against Android Billing Library 6.0
  • See migration guides below

Documentation

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

NuGet

Platform Support

Platform Version
iOS for .NET 10+
macCatlyst for .NET All
tvOS for .NET 10.13.2
Android for .NET 21+
Windows App SDK (WinUI 3) 10+
.NET MAUI All

Created By: @JamesMontemagno

Version 8 Major Updates

  • Nice new re-write and re-implementation of APIs!
  • Built against .NET 8
  • Now using latest Android Billing v6.2.1

Version 7 Major Updates

  • Android: You must compile and target against Android 12 or higher (or Android 13 if v7.1)
  • Android: Now using Android Billing v6
  • Android: Major changes to Android product details, subscriptions, and more
  • Android: Please read through: https://developer.android.com/google/play/billing/migrate-gpblv6
  • Android: AcknowledgePurchaseAsync is now FinalizePurchaseAsync
  • All: There are now "Extras" for all products that give you back tons of info for each platform

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="X.X.X" />

Update X.X.X with the version of the Billing Library that is a dependency on the NuGet package.

Pending Transactions:

  • If the result of PurchaseAsync is PurchaseState.PaymentPending, store the order details locally and inform the user that they will have access to the product when the payment completes
  • When the user starts the app (and/or visits a particular page), if the stored PurchaseState is PaymentPending, call GetPurchasesAsync and query the result for a purchase that matches the stored purchase.
  • If the PurchaseState for this purchase is still PaymentPending, show the same no-access message
  • If the PurchaseState is Purchased, call ConsumePurchaseAsync or AcknowledgePurchaseAsync, depending on the product type

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.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-android35.0 is compatible.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-ios18.0 is compatible.  net9.0-maccatalyst was computed.  net9.0-maccatalyst18.0 is compatible.  net9.0-macos was computed.  net9.0-macos15.0 is compatible.  net9.0-tvos was computed.  net9.0-windows was computed.  net9.0-windows10.0.19041 is compatible.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (6)

Showing the top 5 NuGet packages that depend on Plugin.InAppBilling:

Package Downloads
Zebble.Billing

Zebble IAP plugin for Xamarin.

VerticesEngine.Android

The Android port of the Cross Platform Vertices Engine.

VerticesEngine.iOS

The iOS port of the cross platform engine Vertices Engine

ContactManager.Core

Package Description

RedCorners.IAP

In App Purchase Plugins

GitHub repositories (2)

Showing the top 2 popular GitHub repositories that depend on Plugin.InAppBilling:

Repository Stars
LiamMorrow/LiftLog
A cross platform app for tracking your lifts in the gym
jamesmontemagno/app-ac-islandtracker
Animal Crossing Island Tracking Mobile App
Version Downloads Last Updated
9.1.0 1,802 7/4/2025
9.0.5-beta 3,485 11/29/2024
9.0.4-beta 119 11/27/2024
9.0.3-beta 97 11/27/2024
9.0.2-beta 364 10/18/2024
9.0.1-beta 211 10/8/2024
9.0.0-beta 124 10/3/2024
8.0.5 29,450 10/18/2024
8.0.5-beta 129 10/18/2024
8.0.4 769 10/3/2024
8.0.3-beta 414 8/9/2024
8.0.2-beta 185 7/23/2024
8.0.1-beta 130 7/23/2024
8.0.0-beta 190 7/16/2024
7.1.3 29,109 7/15/2024
7.1.2 1,157 7/12/2024 7.1.2 is deprecated because it has critical bugs.
7.1.2-beta 251 5/11/2024
7.1.1-beta 3,646 12/13/2023
7.1.0 74,560 10/30/2023
7.1.0-beta 848 10/4/2023
7.0.5 31,834 8/4/2023
7.0.5-beta 3,098 6/4/2023
7.0.4-beta 663 6/3/2023
7.0.3-beta 674 6/3/2023
7.0.2-beta 678 6/1/2023
7.0.1-beta 699 6/1/2023
7.0.0-beta 694 5/31/2023
6.7.1-beta 722 5/12/2023
6.7.0 56,687 10/20/2022
6.6.2-beta 884 9/25/2022
6.6.1 4,166 9/22/2022
6.6.1-beta 777 9/22/2022
6.6.0-beta 718 9/22/2022
6.5.0-beta 786 9/20/2022
6.4.0-beta 734 9/1/2022
6.3.3-beta 2,700 5/11/2022
6.3.2-beta 793 3/7/2022
6.3.1-beta 717 2/15/2022
6.3.0-beta 234 2/13/2022
6.0.0-beta 1,494 1/14/2022
5.7.1-beta 734 5/12/2023
5.6.2-beta 848 9/25/2022
5.6.1 12,711 9/22/2022
5.6.1-beta 736 9/22/2022
5.6.0-beta 735 9/22/2022
5.5.0-beta 704 9/20/2022
5.4.0-beta 693 9/1/2022
5.3.3-beta 7,236 5/11/2022
5.3.2-beta 2,657 3/7/2022
5.3.1-beta 1,908 2/15/2022
5.3.0-beta 1,016 2/13/2022
5.2.0-beta 1,624 1/14/2022
5.1.1-beta 1,054 12/26/2021
5.1.0-beta 14,513 11/21/2021
5.0.1-beta 7,692 7/18/2021
5.0.0-beta 957 7/13/2021
4.4.0-beta 1,199 7/13/2021
4.2.0-beta 2,492 5/6/2021
4.1.2-beta 13,768 2/8/2021
4.1.1-beta 928 2/8/2021
4.1.0-beta 869 2/7/2021
4.0.2 93,786 1/2/2021
4.0.2-beta 916 1/2/2021
4.0.1-beta 5,232 11/4/2020
4.0.0-beta 7,045 8/20/2020
2.1.0.187-beta 20,681 2/4/2019
2.0.0.173-beta 3,389 9/29/2018
2.0.0 192,896 5/23/2018
1.4.1.157-beta 1,713 5/9/2018
1.2.5.145-beta 1,724 5/2/2018
1.2.5.144-beta 1,648 5/2/2018
1.2.5 4,189 5/1/2018
1.2.4.140-beta 1,685 4/24/2018
1.2.4.138-beta 1,824 4/2/2018
1.2.4.137-beta 1,542 3/29/2018
1.2.4.136-beta 1,765 3/27/2018
1.2.4.133-beta 2,180 3/17/2018
1.2.4.130-beta 1,817 2/26/2018
1.2.4.123-beta 1,869 1/26/2018
1.2.4.122-beta 1,713 1/25/2018
1.2.4.116-beta 1,968 1/10/2018
1.2.4.113-beta 1,774 1/6/2018
1.2.4.112-beta 1,927 12/20/2017
1.2.4.111-beta 1,728 12/20/2017
1.2.4 28,540 1/18/2018
1.2.3.107 25,010 10/11/2017
1.2.3.98-beta 1,738 10/9/2017
1.2.2 5,519 7/13/2017
1.2.2-beta72 1,622 7/9/2017
1.2.1 10,623 7/3/2017
1.2.0.54-alpha 1,651 7/1/2017
1.2.0.51-alpha 1,677 6/28/2017
1.2.0.50-alpha 3,812 6/21/2017
1.2.0.49-alpha 1,614 6/20/2017
1.1.0.46-beta 2,974 6/15/2017
1.1.0.35-beta 3,749 4/18/2017
1.1.0.34-beta 3,066 3/23/2017
1.1.0.33-beta 1,539 3/23/2017
1.1.0.32-beta 1,617 3/22/2017
1.1.0.23-beta 2,150 2/10/2017
1.1.0.15-beta 1,661 2/6/2017
1.1.0.9-beta 1,695 1/23/2017
1.1.0.3-beta 1,544 1/21/2017
1.1.0.2-beta 1,572 1/21/2017
1.0.0.31-beta 1,568 1/16/2017
1.0.0.30-beta 1,637 1/15/2017
1.0.0.27-beta 1,549 1/14/2017