using UnityEngine; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using SimpleJSON; using AOT; public delegate void MTXValidateReceiptLocallyCallback(NimbleBridge_Error error); public class NimbleBridge_MTXTransaction : SafeHandle { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void BridgeMTXValidateReceiptLocallyCallback(IntPtr errorPtr, IntPtr callbackDataPtr); [MonoPInvokeCallback(typeof(BridgeMTXValidateReceiptLocallyCallback))] private static void OnMTXValidateReceiptLocallyCallback(IntPtr errorPtr, IntPtr callbackDataPtr) { var helper = NimbleBridge_CallbackHelper.Get(); var error = new NimbleBridge_Error(errorPtr); var callback = (MTXValidateReceiptLocallyCallback)helper.GetData(callbackDataPtr); helper.RunOnMainThread(callbackDataPtr, () => callback(error)); } public enum Type { PURCHASE, RESTORE } public enum State { UNDEFINED, USER_INITIATED, WAITING_FOR_PREPURCHASE_INFO, WAITING_FOR_PLATFORM_RESPONSE, WAITING_FOR_VERIFICATION, WAITING_FOR_GAME_TO_CONFIRM_ITEM_GRANT, WAITING_FOR_PLATFORM_CONSUMPTION, COMPLETE } /*! * NIMBLE_MTX_IOS6_FORMAT_RECEIPT_KEY * * This represents a key for the json string returned by NimbleBridge_MTXTransaction.GetAdditionalInfo() * * The value in the json string corresponding to NIMBLE_MTX_IOS6_FORMAT_RECEIPT_KEY is the hex data * representation of the iOS6 receipt for a completed transaction. * */ public const string NIMBLE_MTX_IOS6_FORMAT_RECEIPT_KEY = "iOS6Receipt"; #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private void NimbleBridge_MTXTransaction_Dispose(IntPtr wrapper) { } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern void NimbleBridge_MTXTransaction_Dispose(IntPtr wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private string NimbleBridge_MTXTransaction_getTransactionId(NimbleBridge_MTXTransaction wrapper) { return wrapper.m_sku; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern string NimbleBridge_MTXTransaction_getTransactionId(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private string NimbleBridge_MTXTransaction_getItemSku(NimbleBridge_MTXTransaction wrapper) { return wrapper.m_sku; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern string NimbleBridge_MTXTransaction_getItemSku(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private int NimbleBridge_MTXTransaction_getState(NimbleBridge_MTXTransaction wrapper) { return 0; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern int NimbleBridge_MTXTransaction_getState(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private int NimbleBridge_MTXTransaction_getType(NimbleBridge_MTXTransaction wrapper) { return 0; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern int NimbleBridge_MTXTransaction_getType(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private float NimbleBridge_MTXTransaction_getPriceDecimal(NimbleBridge_MTXTransaction wrapper) { return 0.0f; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern float NimbleBridge_MTXTransaction_getPriceDecimal(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private string NimbleBridge_MTXTransaction_getItemSellId(NimbleBridge_MTXTransaction wrapper) { return string.Empty; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern string NimbleBridge_MTXTransaction_getItemSellId(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private double NimbleBridge_MTXTransaction_getTimestamp(NimbleBridge_MTXTransaction wrapper) { return 0.0; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern double NimbleBridge_MTXTransaction_getTimestamp(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private string NimbleBridge_MTXTransaction_getReceipt(NimbleBridge_MTXTransaction wrapper) { return string.Empty; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern string NimbleBridge_MTXTransaction_getReceipt(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private string NimbleBridge_MTXTransaction_getAdditionalInfo(NimbleBridge_MTXTransaction wrapper) { return string.Empty; } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern string NimbleBridge_MTXTransaction_getAdditionalInfo(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private NimbleBridge_Error NimbleBridge_MTXTransaction_getError(NimbleBridge_MTXTransaction wrapper) { return new NimbleBridge_Error(IntPtr.Zero); } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern NimbleBridge_Error NimbleBridge_MTXTransaction_getError(NimbleBridge_MTXTransaction wrapper); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) static private void NimbleBridge_MTXTransaction_validateReceiptLocally(NimbleBridge_MTXTransaction wrapper, BridgeMTXValidateReceiptLocallyCallback callback, IntPtr callbackData) { } #else [DllImport (MarshalUtility.CINTERFACE_LIB_NAME)] static private extern void NimbleBridge_MTXTransaction_validateReceiptLocally(NimbleBridge_MTXTransaction wrapper, BridgeMTXValidateReceiptLocallyCallback callback, IntPtr callbackData); #endif #if UNITY_EDITOR || ( ! UNITY_IPHONE && ! UNITY_ANDROID ) private string m_sku; public NimbleBridge_MTXTransaction(string sku) : base(IntPtr.Zero, true) { m_sku = sku; } #endif private NimbleBridge_MTXTransaction() : base(IntPtr.Zero, true) { } internal NimbleBridge_MTXTransaction(IntPtr handle) : base(IntPtr.Zero, true) { SetHandle(handle); } public override bool IsInvalid { get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() { NimbleBridge_MTXTransaction_Dispose(handle); return true; } // getTransactionId() returns a local Nimble-generated ID. This is separate from the 1st party (StoreKit/GooglePlay) transaction ID. public string GetTransactionId() { return NimbleBridge_MTXTransaction_getTransactionId(this); } public string GetItemSku() { return NimbleBridge_MTXTransaction_getItemSku(this); } public State GetTransactionState() { return (State) NimbleBridge_MTXTransaction_getState(this); } public Type GetTransactionType() { return (Type) NimbleBridge_MTXTransaction_getType(this); } public float GetPriceDecimal() { return NimbleBridge_MTXTransaction_getPriceDecimal(this); } public string GetItemSellId() { return NimbleBridge_MTXTransaction_getItemSellId (this); } public double GetTimestamp() { return NimbleBridge_MTXTransaction_getTimestamp(this); } public string GetReceipt() { return NimbleBridge_MTXTransaction_getReceipt(this); } [Obsolete("Use GetAdditionalInfoDictionary instead")] public string GetAdditionalInfo() { return NimbleBridge_MTXTransaction_getAdditionalInfo(this); } public Dictionary GetAdditionalInfoDictionary() { JSONNode json = JSON.Parse(NimbleBridge_MTXTransaction_getAdditionalInfo(this)); Console.WriteLine(" Dictionary GetAdditionalInfoDictionary(): " + NimbleBridge_MTXTransaction_getAdditionalInfo(this)); Console.WriteLine(" Dictionary GetAdditionalInfoDictionary() json: " + json.ToString()); return MarshalUtility.ConvertJsonToDictionary((JSONObject)json); } public NimbleBridge_Error GetError() { return NimbleBridge_MTXTransaction_getError(this); } /*! * Validate iOS7-style receipt locally. (GOSREQ-1084) * The game team must call this manually. There is no automated action by Nimble. * * @param ValidateReceiptLocallyCallback callback containing error if available, null otherwise */ public void ValidateReceiptLocally(MTXValidateReceiptLocallyCallback callback) { var helper = NimbleBridge_CallbackHelper.Get(); var receiptCbData = helper.MakeCallbackData(callback); NimbleBridge_MTXTransaction_validateReceiptLocally(this, OnMTXValidateReceiptLocallyCallback, receiptCbData); } }