246 lines
7.8 KiB
C#
246 lines
7.8 KiB
C#
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";
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 初始化IAP 功能
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 初始化结果
|
|
/// </summary>
|
|
/// <param name="success"></param>
|
|
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 <GuruSDK.InitIAP> first.");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
#region Data
|
|
|
|
/// <summary>
|
|
/// 获取商品信息
|
|
/// </summary>
|
|
/// <param name="productName"></param>
|
|
/// <returns></returns>
|
|
public static ProductInfo GetProductInfo(string productName)
|
|
{
|
|
return GuruIAP.Instance?.GetInfo(productName) ?? null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取商品信息 (提供 ProductId)
|
|
/// </summary>
|
|
/// <param name="productId"></param>
|
|
/// <returns></returns>
|
|
public static ProductInfo GetProductInfoById(string productId)
|
|
{
|
|
return GuruIAP.Instance?.GetInfoById(productId) ?? null;
|
|
}
|
|
|
|
|
|
[Obsolete("Will be discarded in next version. Using GetProductInfoById(string productId) instead.")]
|
|
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;
|
|
}
|
|
|
|
[Obsolete("Will be discarded in next version. Using GetProductInfo(string productName) instead.")]
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询某个商品是否已经包含订单了
|
|
/// </summary>
|
|
/// <param name="productName"></param>
|
|
/// <returns></returns>
|
|
public static bool IsProductHasReceipt(string productName)
|
|
{
|
|
return GuruIAP.Instance.IsProductHasReceipt(productName);
|
|
}
|
|
|
|
|
|
public static string GetProductLocalizedPriceString(string productName)
|
|
{
|
|
return GuruIAP.Instance.GetLocalizedPriceString(productName);
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region Purchase
|
|
|
|
private static Action<string, bool> _onPurchaseCallback;
|
|
|
|
/// <summary>
|
|
/// 购买商品, 通过商品Name
|
|
/// </summary>
|
|
/// <param name="productName"></param>
|
|
/// <param name="purchaseCallback"></param>
|
|
public static void Purchase(string productName, Action<string, bool> purchaseCallback = null)
|
|
{
|
|
if (CheckIAPReady())
|
|
{
|
|
_onPurchaseCallback = purchaseCallback;
|
|
GuruIAP.Instance.Buy(productName);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 购买商品, 通过商品ID
|
|
/// </summary>
|
|
/// <param name="productId"></param>
|
|
/// <param name="purchaseCallback"></param>
|
|
public static bool PurchaseById(string productId, Action<string, bool> purchaseCallback = null)
|
|
{
|
|
var productName = GetProductInfoById(productId)?.Name ?? "";
|
|
|
|
if (CheckIAPReady() && !string.IsNullOrEmpty(productName))
|
|
{
|
|
Purchase(productName, purchaseCallback);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 支付回调
|
|
/// </summary>
|
|
/// <param name="productId"></param>
|
|
/// <param name="success"></param>
|
|
private static void OnBuyEnd(string productName, bool success)
|
|
{
|
|
_onPurchaseCallback?.Invoke(productName, success);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 支付开始
|
|
/// </summary>
|
|
/// <param name="productName"></param>
|
|
private static void OnBuyStart(string productName)
|
|
{
|
|
Callbacks.IAP._onPurchaseStart?.Invoke(productName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 支付失败
|
|
/// </summary>
|
|
/// <param name="productName"></param>
|
|
/// <param name="reason"></param>
|
|
private static void OnBuyFailed(string productName, string reason)
|
|
{
|
|
Callbacks.IAP._onPurchaseFailed?.Invoke(productName, reason);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Restore Purchase
|
|
|
|
/// <summary>
|
|
/// 恢复购买
|
|
/// </summary>
|
|
/// <param name="restoreCallback"></param>
|
|
public static void Restore(Action<bool, string> restoreCallback = null)
|
|
{
|
|
if( restoreCallback != null) Callbacks.IAP.OnIAPRestored += restoreCallback;
|
|
if (CheckIAPReady())
|
|
{
|
|
GuruIAP.Instance.Restore();
|
|
}
|
|
}
|
|
private static void OnRestored(bool success, string msg)
|
|
{
|
|
Callbacks.IAP._onIAPRestored?.Invoke(success, msg); // 更新回复购买回调
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Receipt
|
|
|
|
/// <summary>
|
|
/// 获取订单收据
|
|
/// </summary>
|
|
/// <param name="productId"></param>
|
|
/// <param name="receipt"></param>
|
|
/// <param name="appleProductIsRestored"></param>
|
|
private static void OnGetReceipt(string productId, string receipt, bool appleProductIsRestored = false)
|
|
{
|
|
var productName = GetProductInfoById(productId)?.Name ?? "";
|
|
if(!string.IsNullOrEmpty(productName))
|
|
Model.AddReceipt(receipt, productName, productId, appleProductIsRestored);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Buy NoAds
|
|
|
|
|
|
/// <summary>
|
|
/// 设置购买去广告道具的标志位
|
|
/// </summary>
|
|
/// <param name="value"></param>
|
|
public static void SetBuyNoAds(bool value = true)
|
|
{
|
|
ADService.Instance.IsBuyNoAds = value;
|
|
}
|
|
|
|
|
|
#endregion
|
|
}
|
|
} |