Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

管理应用内购买结算

利用应用内购买结算,您不用处理财务交易,不过仍需要执行一些管理任务。 这些任务包括:

  • 在 Google Play Developer Console 上设置和维护商品列表。
  • 注册测试帐户。
  • 根据需要处理退款。

要注册测试帐户,您必须拥有 Google Play 发布商帐户。如果您已经拥有 Google Play 发布商帐户,则可以使用现有帐户。 您不需要注册新帐户即可支持应用内购买结算。 如果您没有发布商帐户,则可以注册为 Google Play 发布商并通过 Google Play Developer Console 设置发布商帐户。

如果您希望创建商品列表以及向用户发放退款,则必须拥有 Google Payments 商家帐号。 如果没有商家帐号,可以通过 Developer Console 注册一个。

创建商品列表

Google Play Developer Console 可以为您发布的每款应用创建一个商品列表。 只有商品列在应用的商品列表上,您才可以使用 Google Play 的应用内购买结算功能出售它们。 每款应用都有自己的商品列表;您无法出售另一款应用的商品列表上显示的商品。

您可以打开开发者帐户中所列应用的 In-app Products 页面,访问应用的商品列表。 只有您拥有 Google Payments 商家帐号并且应用的清单包含 com.android.vending.BILLING 权限,才会显示 In-app Products 页面的链接。 如需了解有关此权限的详细信息,请参阅更新您的应用清单

商品列表指定您在应用中出售的商品:应用内商品、订阅或者两者组合。 对于每种商品,商品列表都包含商品 ID、商品说明和价格等信息。 您可以为发布的任何应用创建商品列表,包括发布到 Alpha 和 Beta 渠道的应用。

商品列表仅存储您在应用中出售的商品的元数据,不会存储任何数字内容。 您需要自行负责在应用中出售的数字内容的存储与交付。

:以前,您可以通过上传未发布的草稿版本对应用进行测试。 此功能已不受支持;您必须将应用发布到 Alpha 或 Beta 分发渠道。 如需了解详细信息,请参阅草稿应用不再受支持

此外,一个应用软件包只能有一个商品列表。如果您为应用创建一个商品列表并使用多 APK 功能为该应用分发多个 APK,商品列表将适用于与应用商品详情关联的所有 APK 版本。 如果使用多 APK 功能,则无法为每个 APK 创建单独的商品列表。

您可以通过两种方式将商品添加到商品列表中:在 In-app Products 页面上逐一添加,也可以从逗号分隔值 (CSV) 文件导入商品,批量添加商品。 如果您的应用只有几种应用内商品,或者仅为测试目的而向商品列表添加几种商品,则逐一添加商品的方式非常实用。 如果您的应用拥有大量应用内商品,使用 CSV 文件方法则较为实用。

:不支持批量上传包含订阅的商品列表。 另外,以批量上传形式更新现有商品时,无法对已经关联到定价模板的应用内商品进行更改。

向商品列表逐一添加商品

要使用 Developer Console UI 将商品添加到商品列表,请按以下步骤操作:

  1. 登录您的发布商帐户。
  2. All applications 面板中,点击应用名称,然后打开 In-app Products 页面。
  3. 点击 Add new product。为您要出售的商品提供商品类型和 ID 后,点击 Continue

    商品类型

    商品类型可以是 Managed productSubscription。创建商品后,您无法更改商品的商品类型。 如需了解详细信息,请参阅选择商品类型

    注:对于订阅商品,一经发布,您就无法再更改商品的价格。

    商品 ID

    商品 ID 在应用的命名空间内是唯一的。商品 ID 必须以小写字母或数字开头,并且只能由小写字母 (a-z)、数字 (0-9)、下划线 (_) 和句点 (.) 组成。 商品 ID android.test 为预留 ID,所有以 android.test 开头的商品 ID 都是如此。

    注:务必仔细规划您的商品 ID 命名空间。商品的商品 ID 在商品创建后就无法再修改,并且您不能在应用内重复使用任何商品 ID。

  4. 输入商品的其他信息,然后点击 Save

    发布状态

    商品的发布状态可以是 Active 或者 Inactive。 要在结账期间对用户可见,商品的发布状态必须为 Active,并且商品所属的应用必须已发布到 Google Play 上。

    :如果使用的是测试帐户,用户还可以查看未发布应用内的活动商品。 如需了解详细信息,请参阅测试应用内购买结算

    语言与翻译

    默认情况下,应用内商品将继承父级应用的默认语言。

    您可以选择 Add Translations,为应用内商品提供本地化的标题和说明。 如果您希望 Google Play 基于默认语言的标题和说明为您翻译标题和说明,只需选择您想要提供的语言。 您还可以提供特定语言的自定义翻译。

    标题
    标题是商品的简短说明。标题的示例为:“沉睡药水。” 每种商品都必须有一个标题。标题将在结账期间对用户可见。为了获得最佳外观,标题不应长于 25 个字符,不过,标题最长可达 55 个字符。
    说明
    说明是对商品的详细描述。说明的示例为: “立即让服用者陷入沉睡,但对愤怒的精灵无效。”每种商品都必须有一段说明, 说明最长可达 80 个字符。
    价格

    以您本地货币为单位提供一个价格,或者将价格关联到现有的定价模板。 基于您输入或从定价模板获得的价格,系统将为不同币种自动填充国家/地区特定的价格。 这些生成的价格使用当前汇率和本地相关的定价模式(参见图 1)。

    您还可以为其他币种手动更改价格,不过,前提是该币种在您应用定位的目标国家/地区使用。 您可以在 Google Play Developer Console 的 Pricing & Distribution 页面上为您的应用指定目标国家/地区。

以美元表示时为 1.99 美元的商品在用澳元、欧元或玻利维亚币表示时价格通常不同。
某些国家/地区还会在价格中加入税费。
图 1. 为应用内商品指定其他币种。

向商品列表批量添加商品

要使用 CSV 文件向商品列表批量添加商品,首先需要创建 CSV 文件。 您在 CSV 文件中指定的数据值与您通过 In-app Products UI 手动指定的数据值相同(请参阅向商品列表逐一添加商品)。

如果您通过 CSV 文件导入和导出应用内商品,请记得提供国家/地区特定的价格。 如果您使用自动填充,则可以提供不含税的默认价格,含税价格将自动填充。 如果您不使用自动填充,您提供的价格必须含税。

:不支持批量上传包含订阅的商品列表。 另外,以批量上传形式更新现有商品时,无法对已经关联到定价模板的应用内商品进行更改。

要导入在 CSV 文件中指定的商品,请执行以下操作:

  1. 登录您的发布商帐户。
  2. All applications 面板中,选择应用名称,然后打开 In-app Products 页面。
  3. 在 In-app Products List 页面上,点击 Import/Export > Import in-app products from CSV file,然后选择您的 CSV 文件。

    CSV 文件必须位于您的本地计算机或者已连接到您计算机的本地磁盘上。

  4. 如果您希望替换商品列表中的现有商品,请选中 Overwrite 复选框。

    只有 CSV 文件中 product_id 的值与商品列表中现有商品的 In-app Product ID 匹配时,此选项才会替换现有商品的值。 替换不会删除存在于商品列表但不存在于 CSV 文件中的商品。

您也可以点击 In-app Product List 页面上的 Export to CSV,将现有商品列表导出到 CSV 文件中。 如果您将商品手动添加到商品列表中并且希望开始通过 CSV 文件管理商品列表,这样做非常有用。

批量格式化商品

CSV 文件使用逗号 (,) 和分号 (;) 分隔数据值。逗号用来分隔主要数据值,分号用来分隔次要数据值。 例如,CSV 文件的语法如下所示:

"product_id","publish_state","purchase_type","autotranslate ","locale; title; description","autofill","country; price"

下面是相关说明和使用详情。

product_id
等同于 In-app Products UI 中的“In-app Product ID”设置。如果您指定一个商品列表中已经存在的 product_id,并且希望在导入 CSV 文件时替换商品列表,现有商品的数据将替换为在 CSV 文件中指定的值。 替换功能不会删除存在于商品列表但不存在于 CSV 文件中的商品。
publish_state
等同于 In-app Products UI 中的“发布状态”设置。可以是 publishedunpublished
purchase_type
等同于 In-app Products UI 中的“商品类型”设置。可以是 managed_by_android(等同于 In-app Products UI 中的 Managed per user account)或managed_by_publisher(等同于 In-app Products UI 中的 Unmanaged)。
autotranslate
等同于在 In-app Products UI 中选中 Fill fields with auto translation 复选框。 可以是 truefalse
语言区域

等同于 In-app Products UI 中的“语言”设置。您必须有一个默认语言区域。 默认语言区域必须是语言区域列表中的第一条,并且必须包含 titledescription。 如果除了默认值以外您还希望提供翻译版本的 titledescription,则必须使用下面的语法规则:

  • 如果 autotranslatetrue,则必须使用下面的格式指定默认语言区域、默认标题、默认说明和其他语言区域:

    "true,"default_locale; default_locale_title; default_locale_description; locale_2; locale_3, ..."

  • 如果 autotranslatefalse,则必须使用下面的格式指定默认语言区域、默认标题和默认说明,以及翻译的标题和说明:

    "false,"default_locale; default_locale_title; default_locale_description; locale_2; locale_2_title; local_2_description; locale_3; locale_3_title; locale_3_description; ..."

请参见表 1,了解可以在 locale 字段中使用的语言代码列表。

title
等同于 In-app Products UI 中的“标题”设置。如果 title 包含分号,则必须使用反斜杠进行转义(例如 \;)。 反斜杠本身也必须使用反斜杠进行转义(例如 \\)。
description
等同于 In-app Products UI 中的“说明”。如果 description 包含分号,则必须使用反斜杠进行转义(例如 \;)。 反斜杠本身也必须使用反斜杠进行转义(例如 \\)。
autofill

等同于点击 In-app Products UI 中的 Auto Fill。可以是 truefalse。 用于指定 countryprice 的语法因您使用的 autofill 设置的不同而有所差异:

  • 如果 autofill 设置为 true,您只需指定采用本地货币的默认价格且必须使用以下语法:

    "true","default_price_in_home_currency"

  • 如果 autofill 设置为 false,您需要为每个币种指定 countryprice 且必须使用以下语法:

    "false", "home_country; default_price_in_home_currency; country_2; country_2_price; country_3; country_3_price; ..."

注:如果您使用 false 这一 autofill 值,并手动设置国家/地区价格,则必须在您提供的价格中体现国家/地区特定的定价模式,包括税率。

country
您为之指定价格的国家/地区。您只能列出您应用定位的国家/地区。 国家/地区代码是按照 ISO 3166-2 定义,由两个大写字母组成的 ISO 国家/地区代码(例如“US”)。
price
等同于 In-app Products UI 中的“价格”。价格必须使用微单位指定。 要将货币值换算成微单位,请用实际值乘以 1,000,000。 例如,如果您要以 1.99 美元销售某种应用内商品,则需要在 price 字段中指定 1990000

表 1. 您可以在 locale 字段中使用的语言代码。

语言 代码 语言 代码
中文 zh_TW 意大利语 it_IT
捷克语 cs_CZ 日语 ja_JP
丹麦语 da_DK 韩语 ko_KR
荷兰语 nl_NL 挪威语 no_NO
英语 en_US 波兰语 pl_PL
法语 fr_FR 葡萄牙语 pt_PT
芬兰语 fi_FI 俄语 ru_RU
德语 de_DE 西班牙语 es_ES
希伯来语 iw_IL 瑞典语 sv_SE
印地语 hi_IN -- --

定价模板

如果您以相同价格出售多款应用,或者在一款或多款应用中以相同价格出售多种应用内商品,则可以添加定价模板。 这些模板让共享价格的管理变得更加轻松。

添加定价模板

创建定价模板时,请提供可以应用到付费应用和应用内商品的新定价信息。 要添加定价模板,请执行以下操作:

  1. 登录您的发布商帐户。
  2. Settings 面板中,打开 Pricing template 页面。
  3. 如果您是首次添加定价模板,将出现 Add a Pricing Template 横幅。 选择 Add template 以创建新模板。 将出现新模板的 Pricing 标签。

    否则,您会看到定价模板的列表。选择 New pricing template。 将出现新模板的 Pricing 标签。

  4. 提供模板的详细信息。这些详细信息包括名称、价格,以及国家/地区特定的价格中是否含税。

    基于您提供的税和价格选项,Developer Console 将使用当前汇率和国家/地区特定的定价模式为国际币种生成价格。

  5. 选择 Create template,完成模板的添加操作。

您可以在定价模板与共享相同价格的大量付费应用和应用内商品之间创建关联。 完成此关联流程后,您对定价模板进行的任何更改都会应用到已关联至此模板的商品的价格。 要完成关联流程,请使用定价模板的 Linked Items 标签、付费应用的 Price 部分或者应用内商品的定价页面。

:由于应用内的订阅具有固定价格,您无法将订阅与定价模板关联。 不过,您可以从定价模板导入价格并将其应用到新订阅。

将定价模板关联到应用内商品和付费应用

要将定价模板关联到应用内商品,请执行以下操作:

  1. 登录您的发布商帐户。
  2. Settings 面板中,打开 Pricing template 页面。 此页面显示了您为帐户创建的定价模板列表。
  3. 选择一个您想要关联到应用内商品的现有定价模板,然后选择模板的 Linked Items 标签。 此标签显示了用于将定价模板关联到应用内商品和付费应用的选项(参见图 2)。
  4. 在标签的 Link In-App Products 部分,输入或选择应用的名称。 此应用应包含您希望关联到定价模板的应用内商品。
  5. 基于选择的应用,您会看到一个包含活动且尚未关联到任何定价模板的应用内商品的列表。 通过选择应用内商品所在行中的 Link 按钮,选择想要关联到定价模板的应用内商品。
  6. 应用内商品的价格现在已关联到您的定价模板。 您对定价模板中的价格进行的任何更改都会影响已关联应用内商品的价格。

要将定价模板关联到付费应用的价格,请遵循类似的流程。 在定价模板的 Linked Items 标签上,从 Link Paid Apps 部分中选择一款付费应用。

“沉睡药水”应用内商品已关联到“基本库存”商品,而“隐身药水”则没有。
图 2. 在定价模板的 Linked Items 标签上,您可以更改将哪些应用内商品和付费应用关联到定价模板。

将应用内商品或付费应用关联到定价模板

要将应用内商品关联到定价模板,请执行以下操作:

  1. 登录您的发布商帐户。
  2. All applications 面板中,选择应用名称,然后打开 In-app Products 页面。
  3. 选择您想要关联到定价模板的应用内商品。 将显示商品的详情页。
  4. 在 Pricing 部分,选择您希望关联到此应用内商品的价格的定价模板。
  5. 应用内商品的价格现在已关联到您选择的定价模板。 您对定价模板中的价格进行的任何更改都会影响此应用内商品的价格。

要将付费应用的价格关联到定价模板,请在应用的 Pricing & Distribution 页面上遵循类似的流程。

删除已关联到定价模板的商品

随着应用的演化,您可能发现移除旧版本的应用内商品或取消发布付费应用非常有用,而其中的一些可能已关联到定价模板。 要删除已关联到定价模板的应用内商品或取消发布已关联的付费应用,请按以下步骤操作。 您不需要提前从定价模板取消关联应用内商品或付费应用。

删除已关联到模板的应用内商品

要删除已关联到模板的应用内商品,请执行以下操作:

  1. 登录您的发布商帐户。
  2. 选择包含您想要删除的应用内商品的应用。
  3. 打开应用的 In-app Products 页面。
  4. 选择您希望删除的应用内商品。
  5. 选择指示应用内商品为活动或非活动的按钮(图 3 中的方框区域内)。 下拉菜单包含 Delete 选项。
  6. 选择 Delete,然后在出现的确认对话框中选择 Yes
图 3. 删除已关联到定价模板的应用内商品。

取消发布已关联到模板的付费应用

图 4. 取消发布已经发布且已关联到定价模板的应用。

要取消发布已经发布且已关联到模板的付费应用,请执行以下操作:

  1. 登录您的发布商帐户。
  2. 选择您想要取消发布的应用。
  3. 选择 Unpublish app(图 4 中的方框区域内),然后在出现的确认对话框中选择 Unpublish

删除定价模板

如果您不再需要某个定价模板,则可以按照以下步骤操作来将其删除:

  1. 登录您的发布商帐户。
  2. Settings 面板中,打开 Pricing template 页面,此页面显示了您为帐户创建的定价模板列表。
  3. 选择您希望删除的定价模板。
  4. 在定价模板的 Linked Items 标签上,取消关联已关联到该模板的所有应用内商品。
  5. 选择 Delete template

选择商品类型

商品的商品类型控制着 Google Play 如何管理该商品的购买流程。支持的商品类型包括“受管理的商品”和“订阅”。 由于对不同商品类型的支持在不同版本的 In-app Billing API 之间不同,请确保根据您的应用使用的 In-app Billing API 版本,选择有效的商品类型。

有关详情,请参阅 In-app Billing API 文档。

处理退款

应用内购买结算不允许用户向 Google Play 发送退款请求。应用内购买的退款必须定向到您(应用开发者)。 随后,您可以通过自己的 Google Payments 商家帐号处理退款。 在您处理后,Google Play 将收到 Google Payments 的退款通知,并向您的应用发送退款消息。 如需了解详细信息,请参阅处理 IN_APP_NOTIFY 消息应用内购买结算定价

重要说明:您无法使用 API 发放退款或者取消应用内购买结算交易。 您必须通过 Google Payments 商家帐号手动完成这两种操作。 不过,您可以使用 API 检索订单信息。

使用订单号

在用户购买应用内商品时,Google 将为交易分配一个唯一的永久订单号。 Google Play 将在购买流结束时向您提供该订单号,作为 PURCHASE_STATE_CHANGED intent 中 orderId 字段的值。

:测试购买没有 orderId 字段。 要跟踪测试交易,请改用 purchaseToken 字段。 如需了解有关使用测试购买的详细信息,请参阅测试应用内购买结算

在应用中,您可以将订单号作为应用内购买交易的通用标识符。 购买后,您可以使用订单号跟踪调节报告中的交易,以及将其用于客户支持。

订单号是一个完全由数字构成的字符串,格式由 Google 分配和管理。

对于发生在 2012 年 12 月 5 日及以后的交易,Google Payments 会分配一个商家订单号(而不是 Google 订单号)并将该编号报告为 orderId 的值。 示例如下:

"orderId" : "GPA.1234-5678-9012-34567"

对于发生在 2012 年 12 月 5 日之前的交易,Google Checkout 分配的是 Google 订单号并将该编号报告为 orderId 的值。 下面是使用 Google 订单号的 orderId 示例:

"orderId" : "556515565155651"

设置测试帐户

利用 Google Play Developer Console,您可以设置一个或多个测试帐户。测试帐户是您在 Developer Console 上注册为测试帐户的常规 Google 帐户。 测试帐户已获得授权,可以从您已上传到 Google Play Developer Console 但尚未发布的应用中进行应用内购买。

您可以将任何 Google 帐户用作测试帐户。如果您想让多位用户在应用上测试应用内购买结算但又不想让他们获得您的发布商帐户的登录凭据,测试帐户就非常有用。 如果您想拥有并控制测试帐户,可以自行创建帐户,然后将凭据分发给您的开发者或测试者。

测试帐户有三条限制:

  • 测试帐户用户只能在已上传到您的发布商帐户的应用(该应用可以是尚未发布的应用)中提出购买请求。
  • 测试帐户只能用来购买应用的商品列表中已列出(且已发布)的商品。
  • 测试帐户用户无法访问您的发布商帐户,也不能向您的发布商帐户上传应用。

要向您的发布商帐户添加测试帐户,请按以下步骤操作:

  1. 登录您的发布商帐户。
  2. 点击 Settings 图标。
  3. 找到 License Testing 面板。
  4. 添加您想要注册为测试帐户的电子邮件地址,各帐户之间用逗号分隔。
  5. 点击 Save,保存您的个人资料更改。

获取应用的许可密钥

Google Play Developer Console 为每款应用提供了一个公用的许可密钥。

要获取应用的密钥,请按以下步骤操作:

  1. 打开 All applications 面板。
  2. 点击应用名称,然后打开 Services & APIs 页面。
  3. 向下滚动到页面的 Your License Key for This Application 部分,如图 5 所示。

以前,Developer Console 会为每个开发者帐户提供一个公钥。 为了将应用迁移到按应用分配的新公钥,Developer Console 会将应用专用密钥设置为之前的开发者密钥。 这样做可确保依赖于(之前的)开发者密钥的应用能与新公钥兼容。

图 5. 您可以在 Services & APIs 页面中找到各个应用的许可密钥。

如何获取支持

如果您在实现应用内购买结算时有疑问或遇到问题,请与下表列出的支持资源联系(参见表 2)。 将您的问题发布到正确的论坛上,可以更快获得所需支持。

表 2. Google Play 应用内购买结算的开发者支持资源。

支持类型 资源 主题范围
开发与测试问题 Google 网上论坛:android-developers 应用内购买结算集成问题、有关用户体验的提示、对响应的处理、混淆代码、进程间通信 (IPC)、测试环境设置。
Stack Overflow:http://stackoverflow.com/questions/tagged/ android
结算问题跟踪器 结算项目问题跟踪器 与应用内购买结算示例代码直接相关的错误和问题报告。

要了解如何向上述所列论坛发帖的一般信息,请参阅 Developer Forums 文档中的 Resources 标签。