nativeScript-purchase
用于制作应用内购买的 NativeScript 插件
npm i --save nativescript-purchase

NativeScript 应用内购买插件

Build Status npm downloads npm downloads npm

用于制作应用内购买的 NativeScript 插件。

安装

从您的项目根目录运行以下命令

tns plugin add nativescript-purchase

此命令将自动安装必要的文件,并将 nativescript-purchase 作为依赖项存储在您的项目的 package.json 文件中。

为了获取智能感知并使 TypeScript 无错误地编译,请在您的 references.d.ts 中添加以下内容

/// <reference path="./node_modules/nativescript-purchase/nativescript-purchase.d.ts" />

配置

为了使插件能够识别您的应用内购买,您必须在 Google/iTunes 端进行配置。您可以通过查看页面底部的详细教程来了解如何分步进行。

API

静态属性

  • transactionUpdatedEvent - String
    用于连接到 transactionUpdated 事件的字符串值。

静态方法

  • init(string[]): Promise
    初始化插件以使用指定的应用内购买标识符。

  • getProducts(): Promise
    返回 init 中使用的应用内购买标识符的产品详情(见下文)。

  • canMakePayments(): boolean
    检查当前用户是否有权进行应用内购买。

  • buyProduct(Product, string?): void
    购买指定的产品。在 Android 上,您可以发送自定义字符串数据,该数据将出现在 Transaction 中。

  • consumePurchase(string): Promise
    消耗由给定的事务令牌表示的购买。如果承诺返回 0,则消耗成功。注意,这仅在 Android 上需要。对于 iOS,每次购买在 iTunes 中设置为可消耗产品时都会自动消耗。

  • restorePurchases(): Promise 恢复当前用户的先前购买项。在 Android 上,返回在购买已恢复时的承诺。在 iOS 上,返回完成的承诺(因为您可以使用 getStoreReceipt 立即获取收据)。

  • getStoreReceipt(): string
    获取当前登录商店用户的 Base64 编码的应用程序存储收据。这在检查 iOS 下的订阅状态时很有用。对于 Android,该函数始终返回 undefined

  • refreshStoreReceipt(): Promise 刷新当前登录商店用户的存储收据。这在交易无效或丢失时很有用。在 iOS 上,刷新完成后返回完成的承诺。

事件

  • transactionUpdated
    触发购买/恢复交易状态变化。您将收到一个 Transaction 对象,您可以在其中检查交易的状态和其他属性 (见下文)

Product 属性

  • nativeValue
    表示产品的本地对象。在 iOS 上这将是一个 SKProduct 实例,在 Android 上这将是一个 org.json.JSONObject

  • productIdentifier - string
    在 iTunes Connect 或 Google Store 上设置的应用内产品标识符。

  • localizedTitle - 字符串
    基于用户手机本地化的产品标题。

  • localizedDescription - 字符串
    基于用户手机本地化的产品描述。

  • priceAmount - 数字
    此应用内产品的价格数值,基于用户应用商店的货币。

  • priceFormatted - 字符串
    带有用户应用商店对应货币符号的格式化priceAmount

  • priceCurrencyCode - 字符串
    价格的ISO4217货币代码(BGN、EUR、USD等)

  • productType - "inapp" | "subs"
    产品的类型 - 应用内购买或订阅。

  • subscriptionPeriod - 字符串
    订阅的ISO8601持续时间。例如P1D表示每日订阅,P1M表示每月订阅,P3M表示三个月订阅。此属性仅对类型为"subs"的产品有效。

Transaction属性

  • nativeValue
    表示交易的本地值。在iOS上,这将是一个SKPaymentTransactio实例,在Android上则是一个org.json.JSONObject

  • transactionState - 字符串
    交易的状态。可以是以下之一

    • 已购买
    • 已恢复
    • 失败
    • 延迟(仅iOS)
    • 购买中(仅iOS)
    • 已退款(仅Android)
  • productIdentifier - string
    触发此交易的内部产品标识符。

  • transactionIdentifier - 字符串
    交易的唯一标识符。

  • transactionDate - 日期
    交易日期。

  • transactionReceipt - 字符串
    Base64编码的交易收据。您可以使用它在其后端进行额外的验证。

  • originalTransaction - Transaction
    当恢复购买时才会出现,并包含购买给定产品的原始交易。

  • developerPayload - 字符串
    buyProduct一起发送的自定义数据。

  • dataSignature - 字符串(仅Android)
    交易的签名。

用法

首先我们需要用将可购买的产品标识符列表初始化插件。最好在应用启动之前完成此操作。

请注意,插件的初始化可能需要的时间比应用启动的时间长。因此,如果您在着陆页加载产品,最好保存init()方法返回的Promise,然后在尝试获取产品之前检查它。

import *  as purchase from "nativescript-purchase";
(global as any).purchaseInitPromise = purchase.init(["com.sample.purchase.coolproduct1", "com.sample.purchase.coolproduct2"]);

要获取实际产品及其详细信息(如标题、价格、货币等),应使用

import { Product } from "nativescript-purchase/product";

(global as any).purchaseInitPromise.then(() => {
purchase.getProducts().then((products: Array<Product>) => {
products.forEach((product: Product) => {
console.log(product.productIdentifier);
console.log(product.localizedTitle);
console.log(product.priceFormatted);
});
});
});

在购买项目之前,您应该连接到transactionUpdated事件。这样,您将在执行过程中收到有关交易状态的信息,并在交易完成时采取必要的操作。

import { Transaction, TransactionState } from "nativescript-purchase/transaction";
import * as applicationSettings from "application-settings";

purchase.on(purchase.transactionUpdatedEvent, (transaction: Transaction) => {
if (transaction.transactionState === TransactionState.Purchased) {
alert(`Congratulations you just bought ${transaction.productIdentifier}!`);
console.log(transaction.transactionDate);
console.log(transaction.transactionIdentifier);
applicationSettings.setBoolean(transaction.productIdentifier, true);
}
else if (transaction.transactionState === TransactionState.Restored) {
console.log(`Purchase of ${transaction.originalTransaction.productIdentifier} restored.`);
console.log(transaction.originalTransaction);
console.log(transaction.originalTransaction.transactionDate);
applicationSettings.setBoolean(transaction.originalTransaction.productIdentifier, true);
}
else if (transaction.transactionState === TransactionState.Failed) {
alert(`Purchase of ${transaction.productIdentifier} failed!`);
}
});

现在让我们购买一个产品!

if (purchase.canMakePayments()) {
// NOTE: 'product' must be the same instance as the one returned from getProducts()
purchase.buyProduct(product);
}
else {
alert("Sorry, your account is not eligible to make payments!");
}

注意:由于iOS和Android在消费购买方面的差异 - 对于iOS,这由您在iTunes Connect中添加的产品定义,它将自动消耗,而对于Android,则需要手动进行 - 如果您将支持Android,您将需要通过调用consumePurchase方法手动消耗购买。该方法接受单个参数,即交易的收据

purchase.on(purchase.transactionUpdatedEvent, (transaction: Transaction) => {
if (transaction.transactionState === TransactionState.Purchased && transaction.productIdentifier.indexOf(".consume") >= 0) {
purchase.consumePurchase(transaction.transactionReceipt)
.then((responseCode) => console.log(responseCode)) // If responseCode === 0 the purchase has been successfully consumed
.catch((e) => console.log(e));
}
});

以及将以前的购买恢复到用户的设备上

purchase.restorePurchases();

演示

此存储库包含一个纯NativeScript演示。请注意,为了设置和运行演示,您需要全局安装Grunt CLI。如果您尚未安装它,您可以在shell中运行以下命令来安装它

$ npm install -g grunt-cli

一旦您已经设置了 Grunt CLI,为了设置演示,请在您的 shell 中运行以下命令

$ git clone https://github.com/peterstaev/nativescript-purchase
$ cd nativescript-purchase
$ npm install
$ grunt compile
$ cd demo

您将无法直接运行演示,因为您需要将您的购买添加到商店中。另外,由于我已经注册了应用程序 ID,您必须在位于 demo 文件夹中的 package.json 文件中更改它。因此,请确保您阅读并遵循以下 深入教程 以开始使用演示。

深入教程

  1. 将插件添加到您的应用程序并创建购买工作流程
  2. 配置 iTunes Connect 并在 iOS 上进行购买
  3. 配置 Google Play 商店并在 Android 上进行购买

捐赠

Donate

bitcoin:14fjysmpwLvSsAskvLASw6ek5XfhTzskHC

Donate