如何获取包含 VAT 的 Google Play Subscription 完整价格?
结论
Google Play IAB v3 的 getSkuDetails() 无法提供适用于所有用户和地区的“最终含 VAT 价格”,客户端也不应按固定税率自行计算。
购买前,应用应直接展示 Google Play 返回的本地化 price。Google Play 会根据用户的付款资料、所在地区和当地税务规则,在结账界面确定最终支付金额。交易完成后,如需核对实际收取的商品金额和税费,应查看 Google Play Console 的财务报表或订单数据,不能根据 SKU 价格反推。
为什么不能直接计算完整价格
VAT 或销售税不只取决于商品使用的币种,还可能受以下因素影响:
- 用户付款资料对应的国家或地区;
- 当地采用含税定价,还是在结账时另行加税;
- 商品类型和适用税率;
- 用户或商家的税务身份;
- 税率调整、四舍五入和 Google Play 的地区定价规则。
即使接口返回以下字段:
price
price_amount_micros
price_currency_code
仅凭它们也无法可靠计算最终扣款金额。例如,不能假设所有 EUR 价格都适用以下公式:
finalPrice = price_amount_micros * 1.20
用户适用的税率未必是 20%。在采用含税展示的市场中,面向用户显示的价格可能已经包含税费,再次加税会导致计算错误。
购买前应如何展示价格
使用旧版 IAB v3 时,应优先展示 getSkuDetails() 返回的 price。这个字段已经根据用户的 Google Play 地区完成币种和格式本地化。
String formattedPrice = skuDetails.getString("price");
String currencyCode = skuDetails.getString("price_currency_code");
long priceAmountMicros = skuDetails.getLong("price_amount_micros");
priceTextView.setText(formattedPrice);
不要通过 price_amount_micros 自行拼接货币符号。不同地区的小数位数、符号位置和数字格式可能不同。
使用较新的 Google Play Billing Library 时,可以从 ProductDetails 获取格式化价格。订阅商品的价格位于相应 offer 的 pricing phases 中:
val productDetails: ProductDetails = /* queryProductDetailsAsync 返回的结果 */
val pricingPhase = productDetails
.subscriptionOfferDetails
?.firstOrNull()
?.pricingPhases
?.pricingPhaseList
?.firstOrNull()
val formattedPrice = pricingPhase?.formattedPrice
priceTextView.text = formattedPrice ?: ""
订阅可能包含免费试用、首期优惠价和后续续订价,不能默认第一个 pricing phase 就是长期续订价格。应根据用户实际选择的 offerToken,展示完整的价格阶段。
获取实际成交金额
如果需要对账、开票或统计收入,应在购买完成后通过服务端处理:
- 客户端取得
purchaseToken和productId。 - 将购买凭证提交到自己的服务器。
- 服务器调用 Google Play Developer API 验证购买状态。
- 使用 Google Play Console 提供的订单或财务报表,核对实际销售额、税费、退款和平台费用。
购买验证接口主要用于确认购买状态、有效期和确认状态等信息。不能把其中的商品价格字段直接视为税务报表中的最终实收金额。具体有哪些字段,取决于商品类型和使用的 Google Play Developer API 版本。
注意事项
- 不要根据币种判断用户所在国家,例如 EUR 覆盖多个采用不同 VAT 税率的地区。
- 不要在客户端维护 VAT 税率表,税率和适用规则可能发生变化。
- 不要把
price_amount_micros直接视为最终扣款金额。 - 购买按钮附近可以展示 Google Play 返回的本地化价格,最终金额以 Google Play 结账界面为准。
- 订阅价格需要区分试用期、优惠期、基础方案和续订价格。
- 如需向用户提供税务凭证,应使用 Google Play 提供的收据或订单信息,不要由应用自行生成税额。
备注:内容仅供参考。
