namespace Guru
{
using UnityEngine;
using System;
using System.Linq;
public partial class GuruSDK
{
public static bool IsIAPReady = false;
//---------- 支付失败原因 ----------
public const string BuyFail_PurchasingUnavailable = "PurchasingUnavailable";
public const string BuyFail_Pending = "ExistingPurchasePending";
public const string BuyFail_ProductUnavailable = "ProductUnavailable";
public const string BuyFail_SignatureInvalid = "SignatureInvalid";
public const string BuyFail_UserCancelled = "UserCancelled";
public const string BuyFail_PaymentDeclined = "PaymentDeclined";
public const string BuyFail_DuplicateTransaction = "DuplicateTransaction";
public const string BuyFail_Unknown = "Unknown";
///
/// 初始化IAP 功能
///
public static void InitIAP(byte[] googleKey, byte[] appleRootCerts)
{
GuruIAP.Instance.OnInitResult += OnIAPInitResult;
GuruIAP.Instance.OnRestored += OnRestored;
GuruIAP.Instance.OnBuyStart += OnBuyStart;
GuruIAP.Instance.OnBuyEnd += OnBuyEnd;
GuruIAP.Instance.OnBuyFailed += OnBuyFailed;
GuruIAP.Instance.OnGetProductReceipt += OnGetReceipt;
GuruIAP.Instance.InitWithKeys(googleKey, appleRootCerts, IsDebugMode);
}
///
/// 初始化结果
///
///
private static void OnIAPInitResult(bool success)
{
LogI($"IAP init result: {success}");
IsIAPReady = success;
Callbacks.IAP._onIAPInitComplete?.Invoke(success);
}
private static bool CheckIAPReady()
{
if (!IsIAPReady)
{
LogE("IAP is not ready, call first.");
return false;
}
return true;
}
#region Data
public static ProductSetting GetProductSettingById(string productId)
{
var products = GuruSettings.Instance.Products;
if (products != null && products.Length > 0)
{
return products.FirstOrDefault(p => p.ProductId == productId);
}
return null;
}
public static ProductSetting GetProductSetting(string productName)
{
var products = GuruSettings.Instance.Products;
if (products != null && products.Length > 0)
{
return products.FirstOrDefault(p => p.ProductName == productName);
}
return null;
}
///
/// 查询某个商品是否已经包含订单了
///
///
///
public static bool IsProductHasReceipt(string productName)
{
return GuruIAP.Instance.IsProductHasReceipt(productName);
}
#endregion
#region Purchase
private static Action _onPurchaseCallback;
///
/// 购买商品, 通过商品Name
///
///
///
public static void Purchase(string productName, Action purchaseCallback = null)
{
if (CheckIAPReady())
{
_onPurchaseCallback = purchaseCallback;
GuruIAP.Instance.Buy(productName);
}
}
///
/// 购买商品, 通过商品ID
///
///
///
public static bool PurchaseById(string productId, Action purchaseCallback = null)
{
var productName = GetProductSettingById(productId)?.ProductName ?? "";
if (CheckIAPReady() && !string.IsNullOrEmpty(productName))
{
Purchase(productName, purchaseCallback);
return true;
}
return false;
}
///
/// 支付回调
///
///
///
private static void OnBuyEnd(string productName, bool success)
{
_onPurchaseCallback?.Invoke(productName, success);
}
///
/// 支付开始
///
///
private static void OnBuyStart(string productName)
{
Callbacks.IAP._onPurchaseStart?.Invoke(productName);
}
///
/// 支付失败
///
///
///
private static void OnBuyFailed(string productName, string reason)
{
Callbacks.IAP._onPurchaseFailed?.Invoke(productName, reason);
}
#endregion
#region Restore Purchase
private static Action _onRestored;
///
/// 恢复购买
///
///
public static void Restore(Action restoreCallback)
{
if (CheckIAPReady())
{
_onRestored = restoreCallback;
GuruIAP.Instance.Restore();
}
}
private static void OnRestored(bool success)
{
_onRestored?.Invoke(success);
}
#endregion
#region Receipt
private static void OnGetReceipt(string productId, string receipt, bool appleProductIsRestored = false)
{
var productName = GetProductSettingById(productId).ProductName;
Model.AddReceipt(receipt, productName, productId, appleProductIsRestored);
}
#endregion
}
}