Unity IAP iOS 内购以及获取交易收据进行验证

1. 准备工作,先到iTunesConnect 上进行添加内购项目和沙盒测试账号

创建APP 内购项目

选择其中一种类型,进行创建

填写内购项目的内容(其中的产品 ID 记住,在接下来有很多地方需要用到)

屏幕快照一定要选到,不然会显示该内购项目元数据丢失

状态显示为黄色:准备提交才是正确的

2. 创建沙盒账号



在创建测试员的时候,记住那个邮箱不能填你已经有的 AppleID 的邮箱,填好后会有一篇验证信息发到你刚刚填写的邮箱,验证后就可以用了

3. unity 里面的操作

将 IAP 相关的文件导入 unity 中

点击 in-App-Purchasing进去


保证 Analytics 和in-App-Purchasing是打开状态就可以了

添加 IAPButton

填写 IAPButton 里面的信息



- 新建一个脚本



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.UI;
using System.Text;
using System;
using MiniJSON;
using UnityEngine.Purchasing.Security;


public class PurchaseManager : MonoBehaviour, IStoreListener
{


    private IStoreController controller;
    ConfigurationBuilder builder;

    private IStoreController m_Controller;
    private IAppleExtensions m_AppleExtensions;

    void Start()
    {
        var module = StandardPurchasingModule.Instance();
        builder = ConfigurationBuilder.Instance(module);
        builder.AddProduct("产品 ID", ProductType.Subscription);
        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;
        m_Controller = controller;
        m_AppleExtensions = extensions.GetExtension<IAppleExtensions> ();
        m_AppleExtensions.RegisterPurchaseDeferredListener (OnDeferred);
    }

    /// <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)
    {
    }

    /// <summary>
    /// Called when a purchase completes.
    ///
    /// May be called at any time after OnInitialized().
    /// </summary>
    //这个函数就是购买成功后自动调用的函数
    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)
    {
        Debug.Log ("IAP成功");
        if (Application.platform == RuntimePlatform.IPhonePlayer ||
            Application.platform == RuntimePlatform.tvOS) {
            string transactionReceipt = m_AppleExtensions.GetTransactionReceiptForProduct (e.purchasedProduct);
            Debug.Log (transactionReceipt);
            //这里的transactionReceipt是 Base64加密后的交易收据,将这个收据发送给远程服务器就会得到订单信息的 Json 数据

        }    
        return PurchaseProcessingResult.Complete;
    }

    /// <summary>
    /// Called when a purchase fails.
    /// </summary>
    public void OnPurchaseFailed(Product item, PurchaseFailureReason r)
    {
        Debug.Log ("IAP失败");
        Debug.Log ("失败原因:"+r.ToString());
    }


//将这个函数挂载到需要进行内购的 UI(Button)上
    public void OnPurchaseClicked(string productId)
    {
        controller.InitiatePurchase(productId);
    }


    private void OnDeferred (Product item)
    {
        Debug.Log ("Purchase deferred: " + item.definition.id);
    }
}

在要进行内购的 Button 上进行挂载方法

4. 打包到 Xcode 里面进行沙盒测试

在运行之前记得把 IAP 打开,还有将真机的 AppleID注销再进行测试

5. 验证订单信息

在购买成功后自动调用的函数里面

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)
    {
        Debug.Log ("IAP成功");
        if (Application.platform == RuntimePlatform.IPhonePlayer ||
            Application.platform == RuntimePlatform.tvOS) {
            string transactionReceipt = m_AppleExtensions.GetTransactionReceiptForProduct (e.purchasedProduct);
            Debug.Log (transactionReceipt);
            //这里的transactionReceipt是 Base64加密后的交易收据,将这个收据发送给远程服务器就会得到订单信息的 Json 数据

        }    
        return PurchaseProcessingResult.Complete;
    }

使用transactionReceipt发送请求
在沙盒环境中,发送transactionReceipt苹果的测试服务器( https://sandbox.itunes.apple.com/verifyReceipt )验证

在正式服务器中(已上线Appstore),发送transactionReceipt到苹果的正式服务器( https://buy.itunes.apple.com/verifyReceipt )验证
验证后返回的Json 数据如下:

{
    "receipt": {
        "original_purchase_date_pst": "2017-11-15 15:25:20 America/Los_Angeles",
        "purchase_date_ms": "1510788320209",
        "unique_identifier": "0ea7808637555b2c633eb07aa1cb0894c821a6f9",
        "original_transaction_id": "1000000352597239",
        "bvrs": "0",
        "transaction_id": "1000000352597239",
        "quantity": "1",
        "unique_vendor_identifier": "01B57C2E-9E91-42FF-9B0D-4983175D6694",
        "item_id": "1141751870",
        "original_purchase_date": "2017-11-15 23:25:20 Etc/GMT",
        "product_id": "100.gold.coins",
        "purchase_date": "2017-11-15 23:25:20 Etc/GMT",
        "is_trial_period": "false",
        "purchase_date_pst": "2017-11-15 15:25:20 America/Los_Angeles",
        "bid": "com.unity3d.unityiap.demo",
        "original_purchase_date_ms": "1510788320209"
    },
    "status": 0
}

参考文章:
https://www.jianshu.com/p/4045ebf81a1c
https://docs.unity3d.com/Manual/UnityIAPiOSMAS.html

猜你喜欢

转载自blog.csdn.net/star__119/article/details/79882640