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

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

创建APP 内购项目

Unity IAP iOS 内购以及获取交易收据进行验证_第1张图片

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

Unity IAP iOS 内购以及获取交易收据进行验证_第2张图片

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

Unity IAP iOS 内购以及获取交易收据进行验证_第3张图片

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

Unity IAP iOS 内购以及获取交易收据进行验证_第4张图片

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

在这里插入图片描述

2. 创建沙盒账号

Unity IAP iOS 内购以及获取交易收据进行验证_第5张图片
Unity IAP iOS 内购以及获取交易收据进行验证_第6张图片
在创建测试员的时候,记住那个邮箱不能填你已经有的 AppleID 的邮箱,填好后会有一篇验证信息发到你刚刚填写的邮箱,验证后就可以用了

3. unity 里面的操作

将 IAP 相关的文件导入 unity 中

Unity IAP iOS 内购以及获取交易收据进行验证_第7张图片

点击 in-App-Purchasing进去

Unity IAP iOS 内购以及获取交易收据进行验证_第8张图片
保证 Analytics 和in-App-Purchasing是打开状态就可以了

添加 IAPButton

Unity IAP iOS 内购以及获取交易收据进行验证_第9张图片

填写 IAPButton 里面的信息

Unity IAP iOS 内购以及获取交易收据进行验证_第10张图片
Unity IAP iOS 内购以及获取交易收据进行验证_第11张图片

  • 新建一个脚本


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);


	}

	/// 
	/// Called when Unity IAP is ready to make purchases.
	/// 
	public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
	{
		this.controller = controller;
		m_Controller = controller;
		m_AppleExtensions = extensions.GetExtension<IAppleExtensions> ();
		m_AppleExtensions.RegisterPurchaseDeferredListener (OnDeferred);
	}

	/// 
	/// 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.
	/// 
	public void OnInitializeFailed(InitializationFailureReason error)
	{
	}

	/// 
	/// Called when a purchase completes.
	///
	/// May be called at any time after OnInitialized().
	/// 
	//这个函数就是购买成功后自动调用的函数
	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;
	}

	/// 
	/// Called when a purchase fails.
	/// 
	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 上进行挂载方法

Unity IAP iOS 内购以及获取交易收据进行验证_第12张图片

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

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

Unity IAP iOS 内购以及获取交易收据进行验证_第13张图片

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

你可能感兴趣的:(unity,iOS,IAP,unity,IAP,iOS-内购)