https://blog.csdn.net/ar__ha/article/details/64439872
Unity Services里的Unity IAP對於IOS和GooglePlay的支付用這個插件就足夠了。
1.集成插件
Window-Services(Ctrl+0)在Services面板Link你的工程,啟用In-App Purchase,Import/Update一下,插件就在Assets/Plugins/UnityPurchasing下。
2.設置
以GooglePlay的設置為例
Window - Unity Iap - Android - Target Google Play :選擇GooglePlay,
Window - Unity Iap - Receipt Validation Obfuscator :輸入GooglePlay的PublicKey,
點擊Obfuscate secrets后,在Assets/Plugins/UnityPurchasing/generated下會生產GooglePlayTangle自動生成的文件,不用管他。
但是要注意到他的宏定義
#if UNITY_ANDROID || UNITY_IPHONE || UNITY_STANDALONE_OSX || UNITY_TVOS
3.DEMO
插件的demo在Assets/Plugins/UnityPurchasing/scenes/IAP Demo 這個場景里
也可以直接看cs文件,Assets/Plugins/UnityPurchasing/script/IAPDemo.cs
主要用到的是UnityEngine.Purchasing.IStoreListener 這個接口
4.初始化
-
//使用這個解析IAP成功后的receipt
-
private UnityEngine.Purchasing.Security.CrossPlatformValidator validator;
-
-
-
private void InitUnityPurchase() {
-
var module = StandardPurchasingModule.Instance();
-
var builder = ConfigurationBuilder.Instance (module);
-
-
//添加計費點
-
// UnityEngine.Purchasing.ProductType
-
builder.AddProduct( "item1", ProductType.Consumable, new IDs
-
{
-
{ "蘋果計費點", AppleAppStore.Name },
-
{ "谷歌計費點", GooglePlay.Name}
-
}
-
);
-
-
validator = new CrossPlatformValidator(GooglePlayTangle.Data(), AppleTangle.Data(), Application.bundleIdentifier);
-
-
UnityPurchasing.Initialize ( this, builder);
-
}
-
private IStoreController m_Controller;
-
-
-
//UNITY IAP初始化成功
-
public void OnInitialized (IStoreController controller, IExtensionProvider extensions) {
-
m_Controller = controller;
-
-
// On Apple platforms we need to handle deferred purchases caused by Apple's Ask to Buy feature.
-
// On non-Apple platforms this will have no effect; OnDeferred will never be called.
-
var m_AppleExtensions = extensions.GetExtension<IAppleExtensions> ();
-
m_AppleExtensions.RegisterPurchaseDeferredListener(OnDeferred);
-
-
var product = m_Controller.products.WithID("item1");
-
//價格 (帶貨幣單位的字符串)
-
var priceString = product.metadata.localizedPriceString;
-
//價格 (換算匯率后的價格)
-
var price = product.metadata.localizedPrice;
-
}
-
//初始化失敗(沒有網絡的情況下並不會調起,而是一直等到有網絡連接再嘗試初始化)
-
public void OnInitializeFailed (InitializationFailureReason error) {
-
-
Debug.Log( "Billing failed to initialize!");
-
switch (error) {
-
case InitializationFailureReason.AppNotKnown:
-
Debug.LogError( "Is your App correctly uploaded on the relevant publisher console?");
-
break;
-
case InitializationFailureReason.PurchasingUnavailable:
-
// Ask the user if billing is disabled in device settings.
-
Debug.Log( "Billing disabled!");
-
break;
-
case InitializationFailureReason.NoProductsAvailable:
-
// Developer configuration error; check product metadata.
-
Debug.Log( "No products available for purchase!");
-
break;
-
}
-
}
-
public void DoIapPurchase (Action<bool, string> callback) {
-
if (m_Controller != null) {
-
var product = m_Controller.products.WithID ("item1");
-
if (product != null && product.availableToPurchase) {
-
//調起支付
-
m_Controller.InitiatePurchase(product);
-
}
-
else {
-
callback ( false, "no available product");
-
}
-
}
-
else {
-
callback ( false, "m_Controller is null");
-
}
-
}
-
public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e) {
-
try {
-
var result = validator.Validate (e.purchasedProduct.receipt);
-
Debug.Log ( "Receipt is valid. Contents:");
-
foreach (IPurchaseReceipt productReceipt in result) {
-
Debug.Log(productReceipt.productID);
-
Debug.Log(productReceipt.purchaseDate);
-
Debug.Log(productReceipt.transactionID);
-
-
AppleInAppPurchaseReceipt apple = productReceipt as AppleInAppPurchaseReceipt;
-
if (null != apple) {
-
Debug.Log(apple.originalTransactionIdentifier);
-
Debug.Log(apple.subscriptionExpirationDate);
-
Debug.Log(apple.cancellationDate);
-
Debug.Log(apple.quantity);
-
-
-
//如果有服務器,服務器用這個receipt去蘋果驗證。
-
var receiptJson = JSONObject.Parse(e.purchasedProduct.receipt);
-
var receipt = receiptJson.GetString("Payload");
-
}
-
-
GooglePlayReceipt google = productReceipt as GooglePlayReceipt;
-
if (null != google) {
-
Debug.Log(google.purchaseState);
-
Debug.Log(google.purchaseToken);
-
}
-
}
-
return PurchaseProcessingResult.Complete;
-
} catch (IAPSecurityException) {
-
Debug.Log( "Invalid receipt, not unlocking content");
-
return PurchaseProcessingResult.Complete;
-
}
-
return PurchaseProcessingResult.Complete;
-
}
-
public void OnPurchaseFailed(Product i, PurchaseFailureReason p) {
-
Logger.Warning( "purchase failed of reason : " + p.ToString());
-
}
-
/// <summary>
-
/// iOS Specific.
-
/// This is called as part of Apple's 'Ask to buy' functionality,
-
/// when a purchase is requested by a minor and referred to a parent
-
/// for approval.
-
///
-
/// When the purchase is approved or rejected, the normal purchase events
-
/// will fire.
-
/// </summary>
-
/// <param name="item">Item.</param>
-
private void OnDeferred(Product item)
-
{
-
Logger.Warning( "Purchase deferred: " + item.definition.id);
-
}