Skip to main content

应用内购买

¥In-App Purchases

准备

¥Preparing

¥Paid Applications Agreement

如果你还没有签署付费应用协议,则需要在 iTunes Connect 中设置你的银行和税务信息。

¥If you haven't already, you’ll need to sign the Paid Applications Agreement and set up your banking and tax information in iTunes Connect.

iTunes Connect 开发者帮助:协议、税务和银行业务概述

¥iTunes Connect Developer Help: Agreements, tax, and banking overview

创建你的应用内购买

¥Create Your In-App Purchases

然后,你需要在 iTunes Connect 中配置应用内购买,并添加名称、定价和说明等详细信息,以高亮应用内购买的特性和功能。

¥Then, you'll need to configure your in-app purchases in iTunes Connect, and include details such as name, pricing, and description that highlights the features and functionality of your in-app purchase.

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

¥iTunes Connect Developer Help: Create an in-app purchase

更改 CFBundleIdentifier

¥Change the CFBundleIdentifier

要使用 Electron 测试开发中的应用内购买,你必须更改 node_modules/electron/dist/Electron.app/Contents/Info.plist 中的 CFBundleIdentifier。你必须将 com.github.electron 替换为你使用 iTunes Connect 创建的应用的打包包标识符。

¥To test In-App Purchase in development with Electron you'll have to change the CFBundleIdentifier in node_modules/electron/dist/Electron.app/Contents/Info.plist. You have to replace com.github.electron by the bundle identifier of the application you created with iTunes Connect.

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

代码示例

¥Code example

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

¥Here is an example that shows how to use In-App Purchases in Electron. You'll have to replace the product ids by the identifiers of the products created with iTunes Connect (the identifier of com.example.app.product1 is product1). Note that you have to listen to the transactions-updated event as soon as possible in your app.

// 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.')
})
})