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