进阶 electronjs.org 2026-10-07 23:51:43 · 8 阅读
第27章 Electron应用内购买指南:配置与代码实现
应用内购买
准备工作
付费应用协议(Paid Applications Agreement)
如果还没有签署付费应用协议,你需要先在 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。
CFBundleIdentifier
com.example.app
代码示例 下面的示例演示了如何在 Electron 中使用应用内购买。你需要把其中的产品 id 替换为在 iTunes Connect 中创建的产品标识符(com.example.app.product1 的标识符是 product1)。注意,应用要尽早监听 transactions-updated 事件。 // 主进程
const { inAppPurchase } = require('electron')
const PRODUCT_IDS = ['id1', 'id2']
// 尽早开始监听交易。
inAppPurchase.on('transactions-updated', (event, transactions) => {
if (!Array.isArray(transactions)) {
return
}
// 逐个检查交易。
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.`)
// 获取收据 URL。
const receiptURL = inAppPurchase.getReceiptURL()
console.log(`Receipt URL: ${receiptURL}`)
// 将收据文件提交到服务器并验证其有效性。
// @see https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
// ...
// 如果收据有效,说明产品已购买
// ...
// 结束该交易。
```html inAppPurchase.finishTransactionByDate(transaction.transactionDate)
break
}
case 'failed':
console.log(`购买 ${payment.productIdentifier} 失败。`)
// 结束该交易。
inAppPurchase.finishTransactionByDate(transaction.transactionDate)
break
case 'restored':
console.log(`已恢复 ${payment.productIdentifier} 的购买。`)
break
case 'deferred':
console.log(`已推迟 ${payment.productIdentifier} 的购买。`)
break
default:
break
}
}
})
// 检查用户是否有权限进行应用内购买。
if (!inAppPurchase.canMakePayments()) {
console.log('用户无权进行应用内购买。')
}
// 获取并展示商品描述。
inAppPurchase.getProducts(PRODUCT_IDS).then((products) => {
// 校验参数。
if (!Array.isArray(products) || products.length <= 0) {
console.log('无法获取商品信息。')
return
}
// 展示每个商品的名称和价格。
for (const product of products) {
console.log(`${product.localizedTitle} 的价格为 ${product.formattedPrice}。`)
}
// 让用户选择要购买的。
const selectedProduct = products[0]
const selectedQuantity = 1
// 购买所选商品。
inAppPurchase.purchaseProduct(selectedProduct.productIdentifier, selectedQuantity).then((isProductValid) => {
if (!isProductValid) {
console.log('商品无效。')
return
}
console.log('已将该支付加入支付队列。')
})
})
```
代码示例 下面的示例演示了如何在 Electron 中使用应用内购买。你需要把其中的产品 id 替换为在 iTunes Connect 中创建的产品标识符(com.example.app.product1 的标识符是 product1)。注意,应用要尽早监听 transactions-updated 事件。 // 主进程
const { inAppPurchase } = require('electron')
const PRODUCT_IDS = ['id1', 'id2']
// 尽早开始监听交易。
inAppPurchase.on('transactions-updated', (event, transactions) => {
if (!Array.isArray(transactions)) {
return
}
// 逐个检查交易。
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.`)
// 获取收据 URL。
const receiptURL = inAppPurchase.getReceiptURL()
console.log(`Receipt URL: ${receiptURL}`)
// 将收据文件提交到服务器并验证其有效性。
// @see https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
// ...
// 如果收据有效,说明产品已购买
// ...
// 结束该交易。
```html inAppPurchase.finishTransactionByDate(transaction.transactionDate)
break
}
case 'failed':
console.log(`购买 ${payment.productIdentifier} 失败。`)
// 结束该交易。
inAppPurchase.finishTransactionByDate(transaction.transactionDate)
break
case 'restored':
console.log(`已恢复 ${payment.productIdentifier} 的购买。`)
break
case 'deferred':
console.log(`已推迟 ${payment.productIdentifier} 的购买。`)
break
default:
break
}
}
})
// 检查用户是否有权限进行应用内购买。
if (!inAppPurchase.canMakePayments()) {
console.log('用户无权进行应用内购买。')
}
// 获取并展示商品描述。
inAppPurchase.getProducts(PRODUCT_IDS).then((products) => {
// 校验参数。
if (!Array.isArray(products) || products.length <= 0) {
console.log('无法获取商品信息。')
return
}
// 展示每个商品的名称和价格。
for (const product of products) {
console.log(`${product.localizedTitle} 的价格为 ${product.formattedPrice}。`)
}
// 让用户选择要购买的。
const selectedProduct = products[0]
const selectedQuantity = 1
// 购买所选商品。
inAppPurchase.purchaseProduct(selectedProduct.productIdentifier, selectedQuantity).then((isProductValid) => {
if (!isProductValid) {
console.log('商品无效。')
return
}
console.log('已将该支付加入支付队列。')
})
})
```