跳转至

应用内购买

准备工作

如果您尚未完成,您需要签署付费应用协议,并在 iTunes Connect 中设置您的银行和税务信息。

iTunes Connect 开发者帮助:协议、税务和银行信息概览

创建您的应用内购买项目

然后,您需要在 iTunes Connect 中配置您的应用内购买项目,并包含名称、价格以及突出显示您的应用内购买项目特性和功能的描述等详细信息。

iTunes Connect 开发者帮助:创建应用内购买项目

更改 CFBundleIdentifier

要在开发环境中使用 Electron 测试应用内购买,您必须更改 node_modules/electron/dist/Electron.app/Contents/Info.plist 中的 CFBundleIdentifier。您必须将 com.github.electron 替换为您在 iTunes Connect 中创建的应用程序的 bundle identifier。

<key>CFBundleIdentifier</key>
<string>com.example.app</string>

代码示例

下面是一个示例,展示了如何在 Electron 中使用应用内购买。您必须将产品 ID 替换为使用 iTunes Connect 创建的产品标识符(com.example.app.product1 的标识符是 product1)。请注意,您必须在应用中尽早监听 transactions-updated 事件。

// Main process
const { inAppPurchase } = require('electron')

const PRODUCT_IDS = ['id1', 'id2']

// Listen for transactions as soon as possible.
inAppPurchase.on('transactions-updated', (event, transactions) => {
  if (!Array.isArray(transactions)) {
    return
  }

  // Check each transaction.
  for (const transaction of transactions) {
    const payment = transaction.payment

    switch (transaction.transactionState) {
      case 'purchasing':
        console.log(`Purchasing ${payment.productIdentifier}...`)
        break

      case 'purchased': {
        console.log(`${payment.productIdentifier} purchased.`)

        // Get the receipt url.
        const receiptURL = inAppPurchase.getReceiptURL()

        console.log(`Receipt URL: ${receiptURL}`)

        // Submit the receipt file to the server and check if it is valid.
        // @see https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
        // ...
        // If the receipt is valid, the product is purchased
        // ...

        // Finish the transaction.
        inAppPurchase.finishTransactionByDate(transaction.transactionDate)

        break
      }

      case 'failed':

        console.log(`Failed to purchase ${payment.productIdentifier}.`)

        // Finish the transaction.
        inAppPurchase.finishTransactionByDate(transaction.transactionDate)

        break
      case 'restored':

        console.log(`The purchase of ${payment.productIdentifier} has been restored.`)

        break
      case 'deferred':

        console.log(`The purchase of ${payment.productIdentifier} has been deferred.`)

        break
      default:
        break
    }
  }
})

// Check if the user is allowed to make in-app purchase.
if (!inAppPurchase.canMakePayments()) {
  console.log('The user is not allowed to make in-app purchase.')
}

// Retrieve and display the product descriptions.
inAppPurchase.getProducts(PRODUCT_IDS).then(products => {
  // Check the parameters.
  if (!Array.isArray(products) || products.length <= 0) {
    console.log('Unable to retrieve the product information.')
    return
  }

  // Display the name and price of each product.
  for (const product of products) {
    console.log(`The price of ${product.localizedTitle} is ${product.formattedPrice}.`)
  }

  // Ask the user which product they want to purchase.
  const selectedProduct = products[0]
  const selectedQuantity = 1

  // Purchase the selected product.
  inAppPurchase.purchaseProduct(selectedProduct.productIdentifier, selectedQuantity).then(isProductValid => {
    if (!isProductValid) {
      console.log('The product is not valid.')
      return
    }

    console.log('The payment has been added to the payment queue.')
  })
})

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron