信息化管理系统 | 数字孪生 · 智慧园区 · 数字大屏 | App · 微信 · 小程序 | 元宇宙 · 区块链 · 3D展厅 | 虚拟仿真系统 | 新零售电商

苹果内购IAP集成说明

苹果内购IAP集成说明
参考文档:
https://www.jianshu.com/p/4045ebf81a1c
https://www.jianshu.com/p/8f6691c9e34e?from=timeline
集成步骤:

  1. 参照参考文档导入IAP插件,插件内包含2个unitypackage,都需要导入
  2. 参照参考文档建立PurchaseManager 类
  3. 实现PurchaseManager 类的支付逻辑
  4. 在需要拉起支付的地方进行支付调用


参考代码:

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,将会无法拉起支付