苹果内购IAP集成说明
苹果内购IAP集成说明
参考文档:
https://www.jianshu.com/p/4045ebf81a1c
https://www.jianshu.com/p/8f6691c9e34e?from=timeline
集成步骤:
- 参照参考文档导入IAP插件,插件内包含2个unitypackage,都需要导入
- 参照参考文档建立PurchaseManager 类
- 实现PurchaseManager 类的支付逻辑
- 在需要拉起支付的地方进行支付调用
参考代码:
using UnityEngine;
using System.Collections;
using UnityEngine.Purchasing;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class PurchaseManager : MonoBehaviour, IStoreListener
{
private IStoreController controller;
private bool bInitStore = false;
private static PurchaseManager manager;
public static PurchaseManager GetSingleton()
{
return manager;
}
private void Awake()
{
if (manager == null)
manager = this;
}
private void Start () {
#if UNITY_IOS
Init();
#endif
//EventDispatcher.Instance().RegistEventListener("UserService/payMoney", PayMoneyCallback);
//EventDispatcher.Instance().RegistEventListener("paynodify", PaynodifyCallback);
}
private void Init()
{
var module = StandardPurchasingModule.Instance();
ConfigurationBuilder builder = ConfigurationBuilder.Instance(module);
builder.AddProduct("com.jiuying.farm.6", ProductType.Consumable);
builder.AddProduct("com.jiuying.farm.12", ProductType.Consumable);
builder.AddProduct("com.jiuying.farm.25", ProductType.Consumable);
builder.AddProduct("com.jiuying.farm.50", ProductType.Consumable);
builder.AddProduct("com.jiuying.farm.108", ProductType.Consumable);
UnityPurchasing.Initialize(this, builder);
}
/// <summary>
/// Called when Unity IAP is ready to make purchases.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
this.controller = controller;
bInitStore = true;
}
/// <summary>
/// Called when Unity IAP encounters an unrecoverable initialization error.
///
/// Note that this will not be called if Internet is unavailable; Unity IAP
/// will attempt initialization until it becomes available.
/// </summary>
public void OnInitializeFailed(InitializationFailureReason error)
{
Debug.Log("OnInitializeFailed " + error.ToString());
bInitStore = true;
}
/// <summary>
/// Called when a purchase completes.
///
/// May be called at any time after OnInitialized().
/// </summary>
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)
{
Debug.Log("购买回调 " + e.purchasedProduct.receipt);
Dictionary<string, object> obj = MiniJSONSelf.Json.Deserialize(e.purchasedProduct.receipt) as Dictionary<string, object>;
//MessageControl.Instance().sendByJson("UserService/payMoney",new object[] {obj["TransactionID"].ToString(), obj["Payload"].ToString()});
Dictionary<string,string> dic = new Dictionary<string,string> ();
dic.Add ("TransactionID", obj ["TransactionID"].ToString ());
dic.Add ("Payload", obj ["Payload"].ToString ());
dic.Add ("userId", SystemModel.user.userId);
RestHttpAPI.HttpAPI.Instance.Post1 ("extra/payMoney", dic, payMoneyCallback);
//Debug.Log ("TransactionID=" + obj ["TransactionID"].ToString () + "&Payload=" + obj ["Payload"].ToString ());
return PurchaseProcessingResult.Complete;
}
/// <summary>
/// Called when a purchase fails.
/// </summary>
public void OnPurchaseFailed(UnityEngine.Purchasing.Product item, PurchaseFailureReason r)
{
Debug.Log(item + " 购买失败 OnPurchaseFailed" + r.ToString());
SystemModel.GetSingleton().eventSystem.gameObject.SetActive(true);
}
public void OnPurchaseClicked(string productId)
{
if (!bInitStore)
{
Init();
return;
}
Debug.Log("开始购买!");
controller.InitiatePurchase(productId);
SystemModel.GetSingleton().eventSystem.gameObject.SetActive(false);
}
private void PayMoneyCallback(EventBase eb)
{
SystemModel.GetSingleton().eventSystem.gameObject.SetActive(true);
Hashtable tb = eb.eventValue as Hashtable;
PopupCommon.GetSingleton().ShowView(tb["message"].ToString(), false, null);
}
private void PaynodifyCallback(EventBase eb)
{
SystemModel.GetSingleton().eventSystem.gameObject.SetActive(true);
Hashtable tb = eb.eventValue as Hashtable;
if (tb["success"].ToString() != "1")
{
PopupCommon.GetSingleton().ShowView(tb["message"].ToString(), false, null);
return;
}
UIMainManager.GetManager().mainHall.UpdateDiamondText(tb["newPoint"].ToString());
}
private void payMoneyCallback(string text,string error){
SystemModel.GetSingleton().eventSystem.gameObject.SetActive(true);
if (error != null) {
PopupCommon.GetSingleton ().ShowView (error, false, null);
return;
}
text = text.Replace ("\\\"", "\"");
text = text.Substring (1, text.Length - 2);
Dictionary<string, object> args = MiniJSONSelf.Json.Deserialize(text) as Dictionary<string, object>;
if (!bool.Parse (args ["success"].ToString ())) {
PopupCommon.GetSingleton ().ShowView (args ["message"].ToString (), false, null);
} else {
PopupCommon.GetSingleton ().ShowView ("充值成功", false, null);
UIMainManager.GetManager().mainHall.UpdateDiamondText(args["newPoint"].ToString());
}
}
}
拉起调用支付参考代码:
btnBuyIOS.onClick.AddListener(delegate()
{
string productId = "";
switch (index)
{
case 1:
productId = "com.jiuying.farm.6";
break;
case 2:
productId = "com.jiuying.farm.12";
break;
case 3:
productId = "com.jiuying.farm.25";
break;
case 4:
productId = "com.jiuying.farm.50";
break;
case 5:
productId = "com.jiuying.farm.108";
break;
}
PurchaseManager.GetSingleton().OnPurchaseClicked(productId);
});
注意:
测试支付需要退出设备的Apple Id,拉起支付后会要求进行登录。填入苹果配置的沙盒测试假账号(非真实账户)即可进行测试,不会进行扣款。
如果不退出Apple ID,将会无法拉起支付