208 lines
8.8 KiB
C#
208 lines
8.8 KiB
C#
|
|
/*******************************************************************************
|
|||
|
|
Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
|
|||
|
|
|
|||
|
|
NOTICE:All information contained herein is, and remains the property of
|
|||
|
|
PICO Technology Co., Ltd. The intellectual and technical concepts
|
|||
|
|
contained herein are proprietary to PICO Technology Co., Ltd. and may be
|
|||
|
|
covered by patents, patents in process, and are protected by trade secret or
|
|||
|
|
copyright law. Dissemination of this information or reproduction of this
|
|||
|
|
material is strictly forbidden unless prior written permission is obtained from
|
|||
|
|
PICO Technology Co., Ltd.
|
|||
|
|
*******************************************************************************/
|
|||
|
|
|
|||
|
|
using System;
|
|||
|
|
using Pico.Platform.Models;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace Pico.Platform
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* \ingroup Platform
|
|||
|
|
*
|
|||
|
|
* You can diversify user experience and grow your revenue by selling
|
|||
|
|
* products such as cosmetics, props, and coins/diamonds within your
|
|||
|
|
* app. The PICO Unity Integration SDK provides In-App Purchase (IAP)
|
|||
|
|
* service which enables users to purchase products within your app.
|
|||
|
|
* The IAP service packages a series of payments systems such as Alipay,
|
|||
|
|
* bank card, and Paypal, thereby providing you with a one-stop
|
|||
|
|
* multi-payment-method solution.
|
|||
|
|
*/
|
|||
|
|
public static class IAPService
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Records the order fulfillment result for a consumable.
|
|||
|
|
/// @note Users are unable to repurchase the same comsumable until the previous order is fulfilled.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sku">The SKU of the add-on to fulfill.</param>
|
|||
|
|
public static Task ConsumePurchase(string sku)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task(CLIB.ppf_IAP_ConsumePurchase(sku));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>Gets a list of purchasable add-ons in the current app.</summary>
|
|||
|
|
/// <param name="skus">The SKUs of the add-ons to retrieve. If this parameter is empty, all purchasable add-ons will be returned.</param>
|
|||
|
|
/// <returns>A list of purchasable add-ons with their information, including the description, price, SKU, and more.</returns>
|
|||
|
|
public static Task<ProductList> GetProductsBySKU(string[] skus)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (skus == null)
|
|||
|
|
{
|
|||
|
|
skus = Array.Empty<string>();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<ProductList>(CLIB.ppf_IAP_GetProductsBySKU(skus));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>Gets a list of purchased add-ons for a user, including durables and unfilfilled consumables.</summary>
|
|||
|
|
/// <returns>A list of the user's purchased add-ons.</returns>
|
|||
|
|
public static Task<PurchaseList> GetViewerPurchases()
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<PurchaseList>(CLIB.ppf_IAP_GetViewerPurchases());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// @deprecated LaunchCheckoutFlow(string sku,string price,string currency) can be replaced by \ref LaunchCheckoutFlow2(Product product)
|
|||
|
|
/// <summary>
|
|||
|
|
/// Launches the checkout flow for a user to make a payment.
|
|||
|
|
/// \note This method doesn't support subscription add-ons, you need to
|
|||
|
|
/// use \ref LaunchCheckoutFlow2 instead.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sku">The SKU of the product the user wants to purchase.</param>
|
|||
|
|
/// <param name="price">The price for the product.</param>
|
|||
|
|
/// <param name="currency">The currency of the payment.</param>
|
|||
|
|
/// <returns>Returns the purchased product if the user successfully pays the money.
|
|||
|
|
/// Otherwise the purchase will be null. You can get the failure reason from the returned error code and error message.</returns>
|
|||
|
|
[Obsolete("Please use LaunchCheckoutFlow2(Product product)", false)]
|
|||
|
|
public static Task<Purchase> LaunchCheckoutFlow(string sku, string price, string currency)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<Purchase>(CLIB.ppf_IAP_LaunchCheckoutFlow(sku, price, currency));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Launches the checkout flow for a user to make a payment.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="product">The add-on's information which can be acquired by \ref GetProductsBySKU.
|
|||
|
|
/// </param>
|
|||
|
|
/// <returns>Returns the purchased add-on if the user successfully makes the payment.
|
|||
|
|
/// Otherwise the purchase will be null. You can get the failure reason from the returned error code and error message.
|
|||
|
|
/// </returns>
|
|||
|
|
public static Task<Purchase> LaunchCheckoutFlow2(Product product)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<Purchase>(CLIB.ppf_IAP_LaunchCheckoutFlowV2(product.SKU, product.Price, product.Currency, product.OuterId));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Launches the checkout flow for a user to make a payment.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="product">The add-on's information which can be acquired by \ref GetProductsBySKU.
|
|||
|
|
/// </param>
|
|||
|
|
/// <param name="orderComment">The comment for the order. If the user successfully purchases this add-on,
|
|||
|
|
/// The order's comment can be accessed in \ref Purchase. The length of this field cannot exceed 1024 bytes in UTF-8 encoding.
|
|||
|
|
/// </param>
|
|||
|
|
/// <returns>Returns the purchased add-on if the user successfully makes the payment.
|
|||
|
|
/// Otherwise the purchase will be null. You can get the failure reason from the returned error code and error message.
|
|||
|
|
/// </returns>
|
|||
|
|
public static Task<Purchase> LaunchCheckoutFlow3(Product product, string orderComment)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<Purchase>(CLIB.ppf_IAP_LaunchCheckoutFlowV3(product.SKU, product.Price, product.Currency, product.OuterId, orderComment));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Gets the subscription status of a subscription add-on.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sku">The SKU of the add-on.</param>
|
|||
|
|
/// <returns>
|
|||
|
|
/// The subscription status of the add-on. If the user is not entitled to access the add-on, the result will be an empty struct.
|
|||
|
|
/// </returns>
|
|||
|
|
public static Task<SubscriptionStatus> GetSubscriptionStatus(string sku)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<SubscriptionStatus>(CLIB.ppf_IAP_GetSubscriptionStatus(sku));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Gets the next page of purchasable add-ons.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="list">The current page of purchasable add-ons.</param>
|
|||
|
|
/// <returns>The next page of purchasable add-ons.</returns>
|
|||
|
|
public static Task<ProductList> GetNextProductListPage(ProductList list)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!list.HasNextPage)
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning("Pico.Platform.GetNextProductListPage: List has no next page");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<ProductList>(
|
|||
|
|
CLIB.ppf_IAP_GetNextProductArrayPage(list.NextPageParam)
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Gets the next page of purchased add-ons.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="list">The current page of purchased add-ons.</param>
|
|||
|
|
/// <returns>The next page of purchased add-ons.</returns>
|
|||
|
|
public static Task<PurchaseList> GetNextPurchaseListPage(PurchaseList list)
|
|||
|
|
{
|
|||
|
|
if (!CoreService.Initialized)
|
|||
|
|
{
|
|||
|
|
Debug.LogError(CoreService.NotInitializedError);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!list.HasNextPage)
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning("Pico.Platform.GetNextPurchaseListPage: List has no next page");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return new Task<PurchaseList>(CLIB.ppf_IAP_GetNextPurchaseArrayPage(list.NextPageParam));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|