适用于Unity的IAP v2.0插件
本文档提供示例代码,展示如何使用适用于应用内购买 (IAP) v2.0 SDK的Unity插件。
您可以在这里下载Unity插件:
已根据Apache许可证2.0版(“许可证”)获得许可。您必须遵守许可证要求,否则不得使用此文件。许可证的副本位于https://aws.amazon.com/apache-2-0/或本文件附带的“许可证”文件中。本文件按“原样”分发,不附带任何明示或暗示的担保或条件。请查看许可证,了解约束许可证项下权限和限制的具体措辞。
方法和事件
您可以发起方法调用并侦听事件。方法调用发起请求,其中一些请求会返回响应。事件是系统生成的异步消息,这些消息是响应方法调用而发送的,目的是将请求的数据返回给您。
除NotifyFulfillment
外,所有方法调用都会向系统请求数据。当您发起数据请求时,系统会立即返回一个包含requestId
字符串的对象,该字符串是唯一的请求标识字符串。请求的数据通过事件异步返回。NotifyFulfillment
方法调用不会返回响应,因为其目的是告知亚马逊,您的应用已将购买的商品交付给用户。
要获取事件中包含的数据,必须定义处理程序函数并将其绑定到特定类型事件的事件侦听器。可在您的事件处理程序中访问返回的数据,其中包括与请求方法调用中返回的requestId
相匹配的唯一requestId
。如有必要,您可以使用requestId
将特定请求与特定响应进行匹配。
在Unity中发起方法调用
要发起方法调用,必须执行以下一般步骤:
- 构造用于与插件交互的对象。
- 如果需要,构造用于将输入传递至操作的对象。
- 对于异步操作,定义在响应准备就绪时调用的回调函数。
- 调用操作,将任何必需的输入和/或回调函数作为参数传入。
GetUserData
GetUserData
发起请求,要求检索当前登录用户的用户ID和市场。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 在没有输入的情况下调用同步操作
RequestOutput response = iapService.GetUserData();
//返回值
string requestIdString = response.RequestId;
Purchase
Purchase
发起产品的购买流程。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 构造作为输入传递至操作的对象
SkuInput request = new SkuInput();
// 设置输入值
request.Sku = "sku";
// 在有输入对象的情况下调用同步操作
RequestOutput response = iapService.Purchase(request);
//返回值
string requestIdString = response.RequestId;
GetProductData
GetProductData
发起请求,要求检索最多100个SKU的商品数据。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 构造作为输入传递至操作的对象
SkusInput request = new SkusInput();
// 创建SKU字符串列表
List<string> list = new List<string>();
list.Add("sku1");
list.Add("sku2");
list.Add("sku3");
// 设置输入值
request.Skus = list;
// 在有输入对象的情况下调用同步操作
RequestOutput response = iapService.GetProductData(request);
//返回值
string requestIdString = response.RequestId;
GetPurchaseUpdates
GetPurchaseUpdates
发起请求,要求检索客户已购买和/或取消的商品的更新信息。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 构造作为输入传递至操作的对象
ResetInput request = new ResetInput();
// 设置输入值
request.Reset = true;
// 在有输入对象的情况下调用同步操作
RequestOutput response = iapService.GetPurchaseUpdates(request);
//返回值
string requestIdString = response.RequestId;
NotifyFulfillment
NotifyFulfillment
向亚马逊通知关于购买履行的情况。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 构造作为输入传递至操作的对象
NotifyFulfillmentInput request = new NotifyFulfillmentInput();
// 设置输入值
request.ReceiptId = "receiptID";
request.FulfillmentResult = "FULFILLED";
// 在有输入对象的情况下调用同步操作
RequestOutput response = iapService.NotifyFulfillment(request);
在Unity中处理事件
要处理事件,必须执行以下一般步骤:
- 构造用于与插件交互的对象。
- 定义事件处理程序。
- 使用事件侦听器注册您的事件处理程序。
GetUserDataResponse
GetUserDataResponse
返回来自GetUserData
调用的响应。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 定义事件处理程序
private void EventHandler(GetUserDataResponse args)
{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
string status = args.Status;
}
// 注册事件处理程序
iapService.AddGetUserDataResponseListener(EventHandler);
PurchaseResponse
PurchaseResponse
返回来自Purchase
调用的响应。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 定义事件处理程序
private void EventHandler(PurchaseResponse args)
{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
string receiptId = args.PurchaseReceipt.ReceiptId;
long cancelDate = args.PurchaseReceipt.CancelDate;
long purchaseDate = args.PurchaseReceipt.PurchaseDate;
string sku = args.PurchaseReceipt.Sku;
string productType = args.PurchaseReceipt.ProductType;
string status = args.Status;
}
// 注册事件处理程序
iapService.AddPurchaseResponseListener(EventHandler);
GetProductDataResponse
GetProductDataResponse
返回来自GetProductData
调用的响应。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 定义事件处理程序
private void EventHandler(GetProductDataResponse args)
{
string requestId = args.RequestId;
Dictionary<string, ProductData> productDataMap = args.ProductDataMap;
List<string> unavailableSkus = args.UnavailableSkus;
string status = args.Status;
// 对于productDataMap中的每件商品,您可以获得给定SKU的以下值
//(将“sku”替换为实际的SKU)
string sku = productDataMap["sku"].Sku;
string productType = productDataMap["sku"].ProductType;
string price = productDataMap["sku"].Price;
string title = productDataMap["sku"].Title;
string description = productDataMap["sku"].Description;
string smallIconUrl = productDataMap["sku"].SmallIconUrl;
}
// 注册事件处理程序
iapService.AddGetProductDataResponseListener(EventHandler);
GetPurchaseUpdatesResponse
GetPurchaseUpdatesResponse
返回来自GetProductData
调用的响应。
using com.amazon.device.iap.cpt;
// 获取用于与插件交互的对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
// 定义事件处理程序
private void EventHandler(GetPurchaseUpdatesResponse args)
{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
List<PurchaseReceipt> receipts = args.PurchaseReceipts;
string status = args.Status;
boolean hasMore = args.HasMore;
// 对于每个购买收据您可以获得以下值
string receiptId = receipts[0].ReceiptId;
long cancelDate = receipts[0].CancelDate;
long purchaseDate = receipts[0].PurchaseDate;
string sku = receipts[0].Sku;
string productType = receipts[0].ProductType;
}
// 注册事件处理程序
iapService.AddGetPurchaseUpdatesResponseListener(EventHandler);
示例
为Puchaser类创建一个文件。添加以下代码:
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using com.amazon.device.iap.cpt;
public class Purchaser : MonoBehaviour, IStoreListener
{
// 获取用于与插件交互的对象,该对象为IAP服务对象
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
}
添加一个方法来处理来自purchase函数的响应:
// 定义事件处理程序
private void EventHandler(GetPurchaseUpdatesResponse args)
{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
List<PurchaseReceipt> receipts = args.PurchaseReceipts;
string status = args.Status;
boolean hasMore = args.HasMore;
// 对于每个购买收据您可以获得以下值
string receiptId = receipts[0].ReceiptId;
long cancelDate = receipts[0].CancelDate;
long purchaseDate = receipts[0].PurchaseDate;
string sku = receipts[0].Sku;
string productType = receipts[0].ProductType;
}
// 注册事件处理程序
iapService.AddGetPurchaseUpdatesResponseListener(EventHandler);
现在我们已经准备好进行一些购买。将以下代码粘贴到实际用于购买先前定义的SKU“100_gold_stars”的任何函数中。
// 构造作为输入传递至操作的对象
SkuInput request = new SkuInput();
// 设置输入值
request.Sku = "100_gold_stars";
// 在有输入对象的情况下调用同步操作
RequestOutput response = iapService.Purchase(request);
//返回值
string requestIdString = response.RequestId;
当游戏收到来自purchase函数的响应时,方法EventHandler()将运行。
Last updated: 2022年1月15日