Blank white box popup on android device, instead of purchase confirmation

This is entirely untested and slapped together, but is an example of how it could be handled:

using System;
using System.Reflection;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Linq;
using System.Collections.Generic;
using Plugin.InAppBilling;


public class DlcManager
{
	// TODO: setup your main thread to handle these vars. If they are not null, handle their value (display error, do stuff about newly purchased DLC, etc) and then set them back to null.
	public static string purchase_dlc_error = null;
	public static purchased_dlc_id = null;


	public async Task<bool> PurchaseDlc(string dlc_id = null)
	{
		var billing = CrossInAppBilling.Current;
		try
		{
			var connected = await billing.ConnectAsync();

			if (!connected)
				throw new Exception("Could not connect!");

			var purchase = await billing.PurchaseAsync(dlc_id, ItemType.InAppPurchase);

			if (purchase == null)
				throw new Exception("null purchase result");

			if (purchase.State == PurchaseState.Deferred || purchase.State == PurchaseState.PaymentPending || purchase.State == PurchaseState.Purchasing)
				throw new Exception("USER_MSG: Purchase pending. Please restart the game after completing your purchase.");
			else if (purchase.State == PurchaseState.Purchased || purchase.State == PurchaseState.Restored)
			{
				purchased_dlc_id = dlc_id;

				if (!purchase.IsAcknowledged.HasValue || !purchase.IsAcknowledged.Value)
					_ = CrossInAppBilling.Current.FinalizePurchaseAsync(purchase.PurchaseToken);

				return true;
			}

			throw new Exception("Unhandled purchase.State");
		}
		catch (InAppBillingPurchaseException e)
		{
			Debug.WriteLine("BILLING_ERROR InAppBillingPurchaseException: " + e);

			switch (e.PurchaseError)
			{
				case PurchaseError.AppStoreUnavailable:
					purchase_dlc_error = "The app store seems to be unavailable. Please try again later.";
					break;
				case PurchaseError.BillingUnavailable:
					purchase_dlc_error = "Billing seems to be unavailable. Please try again later.";
					break;
				case PurchaseError.PaymentInvalid:
					purchase_dlc_error = "Payment seems to be invalid. Please try again.";
					break;
				case PurchaseError.PaymentNotAllowed:
					purchase_dlc_error = "Payment does not seem to be enabled/allowed. Please try again.";
					break;
			}
		}
		catch (Exception e)
		{
			Debug.WriteLine("BILLING_ERROR Exception: " + e);

			if (e.Message.Contains("USER_MSG:"))
				purchase_dlc_error = e.Message.Replace("USER_MSG:", "").Trim();
			else
				purchase_dlc_error = "Failed to complete purchase. Please try again later.";
		}
		finally
		{
			await billing.DisconnectAsync();
			return false;
		}
	}
}

You would then run _ = DlcManager.PurchaseDlc("com.example.myapp"); from your game’s main thread to invoke a purchase process.