💳 内购上线 —— 控制台设置手册(给 Jeff)

HOOP 系统设计图纸 · 正文唯一真相是 docs/iap-setup.md;改 md 再跑 ./tools/deploy_docs.sh,这页是生成的

版本 a32cdf47a
2026-09-24 09:16
档案
name iap-setup
summary 内购上线的控制台设置手册,给 Jeff 照着点:App Store Connect + Play Console + Google Cloud,按「什么时候能做」排好,每一步写明做完要回报什么。配套图纸 /iap。

💳 内购上线 —— 控制台设置手册(给 Jeff)

这份是什么:Leong 2026-09-24 定了「控制台由 Jeff 来做,给他一份清楚的手册」。 这里是内购计划 /iap 阶段 0 和 §4 里只有账户持有人能做的每一步, 按什么时候能做排好。每一步最后都写了「做完回我什么」。

🇬🇧 English version: /iap-setup-en —— 同样的内容。

总共大约:今天那一段半小时;苹果商品一小时;Google 那几段各二十分钟,但要等前面的条件满足。 控制台里按钮上的字是英文的,下面照原样写,方便你对着找。

三条绝对不能做

  1. 密钥文件绝不进聊天、绝不进 git。 Google 那个 JSON 文件只走 scp 直接放到服务器上(第 12 步)。
  2. 第 3 步有答案之前,两个控制台都别按「Create」建商品。 商品 id 建了就永久占掉,删了也不能再用。
  3. …34000(MYR 250 那一档)先不送审、不开卖。 按 30% 抽成它是亏的,要等小企业计划的 15% 真正生效(第 2 步)。

做完之后回我什么(贴到 ACodes 房,@Tora Master)

  • [ ] 第 1 步:苹果付费 App 协议是不是已生效(是 / 还缺什么)
  • [ ] 第 2 步:小企业计划提交的日期
  • [ ] 第 3 步:com.hooptech.hoop.green. 开头的商品有没有(有 / 没有;有的话几个)
  • [ ] 第 5 步:Google 15% 服务费报名成功没有
  • [ ] 第 6 步:六个价格点实际选的价格 + 苹果显示的到手额(截图就行)
  • [ ] 第 11 步:Android 测试员的 Gmail
  • [ ] 第 12 步:Google Cloud 项目 id、服务账号邮箱、密钥文件在服务器上的路径(只要路径,不要内容)
  • [ ] 测试员:拿 iPhone 测的人、拿 Android 测的人,各自的 HOOP 账号

一、今天就能做(什么都不用等)

第 1 步 · 苹果付费 App 协议

App Store Connect → Business(以前叫 Agreements, Tax, and Banking)。 Paid Apps 那一行要是 Active。不是的话,把税务表和银行账户填完。

为什么先做这个:协议不生效,App 里一个商品都查不到,充值页只会显示「商店暂时不可用」。

回我:Active,或者还缺哪一项。

第 2 步 · 报名苹果小企业计划(抽成 30% → 15%)

账户持有人的账号打开 https://developer.apple.com/app-store/small-business-program/,按页面上的 Enroll 进去填表。 表里会问有没有「关联开发者账号」(Associated Developer Accounts)—— 就是你控股或者控制的其他苹果开发者账号;没有就填没有。

⚠️ 批下来不等于马上生效。 苹果的原文是:批准那个财务月结束后 15 天才开始按 15% 算 (例:2 月 10 日批准 → 3 月 14 日起生效)。所以越早提交越好,这一步是整条线回报最高的一步。

回我:提交日期;批下来之后再回一次批准日期。

第 3 步 · 查苹果那边的商品存不存在(这一步决定用哪套商品 id)

App Store Connect → Apps → HOOP → 左边栏 MonetizationIn-App Purchases。 看列表里有没有 Product ID 以 com.hooptech.hoop.green. 开头的商品。

你看到的 意思 后面怎么做
有(应该是 6 个:…green.500…green.34000) 以前建过 第 7 步只改价格,不新建
一个都没有 从没建过 第 7 步用 com.hooptech.hoop.spark.<数量> 新建 6 个

回我:有 / 没有(有的话几个、各是什么状态)。回完之前别建任何商品。

第 4 步 · Google 开发者账号 + 收款账号

Play Console(https://play.google.com/console)→ SetupPayments profile:要有一个已验证的收款资料。 如果 HOOP 的 Google Play 开发者账号还没注册,先注册(一次性 25 美元)。

回我:账号在不在、收款资料是否已验证。

第 5 步 · 报名 Google 的 15% 服务费

Google 对每年前 100 万美元收入只抽 15%,但必须报名才算: Play Console → 账号设置里的 Account group(账户组)→ 建一个账户组,把 HOOP 这个账号设为主账号 → 声明有没有关联账号(没有就填没有)→ 同意 15% 服务费条款 → 在 Associated developer accounts 页面报名。

官方说明:https://support.google.com/googleplay/android-developer/answer/10627869

回我:报名成功没有。


二、苹果商品(第 3 步有答案之后,当天就能做)

第 6 步 · 把马来西亚设成基准商店,挑价格点

每个内购商品的 Price Schedule(价格)里,Base Country or RegionMalaysia。 然后给六档各挑一个价格点。苹果只能从它的价格点表里挑,规则是:选不高于目标价的最近那个

档位(Spark) 目标价 挑哪个
500 MYR 5.00 ≤ 5.00 里最近的
1,600 MYR 14.90 ≤ 14.90 里最近的
3,400 MYR 30.00 ≤ 30.00 里最近的
6,500 MYR 55.00 ≤ 55.00 里最近的
14,000 MYR 110.00 ≤ 110.00 里最近的
34,000 MYR 250.00 ≤ 250.00 里最近的

选价格点时,苹果会在旁边显示 Proceeds(你到手多少)。把六个到手额都截图给我 —— 我用它核实计划里假设的 8% 税, 再把毛利表按真数重算。

回我:六档实际选的价格 + 到手额截图。

第 7 步 · 建商品(或只改价格)

如果第 3 步是「有」:逐个打开那六个 …green.* 商品,只做第 6 步的改价,再把 Availability 改成只有 Malaysia。其他不动。

如果第 3 步是「没有」:点 In-App Purchases 旁边的 +,建六个:

  • Type:Consumable
  • Reference Name:随便写,自己看的,例如 Spark 500
  • Product ID:com.hooptech.hoop.spark.500…spark.1600…spark.3400…spark.6500…spark.14000…spark.34000(一个字都不能错,建了就改不了)
  • Price:第 6 步挑的那个
  • Availability:只勾 Malaysia
  • App Store Localization:英文和简体中文各一份。显示名称写 500 Hoop Sparks / 500 Hoop Sparks;描述写 Spend Sparks inside HOOP. / 在 HOOP 里使用的 Spark。
  • Review Information:放一张充值页截图(找 NOVA 要最新的)

每个商品的状态要变成 Ready to Submit 才算填完。⚠️ 缺资料的商品(Missing Metadata)连 TestFlight 里都查不到。

…34000 特别处理:照样建好、照样填完(这样 id 就定下来了,也能看到它的到手额),但先不要送审。等第 2 步的 15% 真正生效,我会在房里说。

回我:六个都到了 Ready to Submit。

第 8 步 · 退款通知地址

App Store Connect → Apps → HOOP → App Information → 往下拉到 App Store Server Notifications:

  • Production Server URLSet Up URL → 填 https://api.hoopcomm.com/v1/iap/apple/notify → 版本选 Version 2
  • Sandbox Server URL留空(留空时苹果会把测试环境的通知也发到上面那个地址,我们后端分得开)

这个地址后端已经在跑,今天填了就生效。

回我:填好了。


三、Google 商品(NOVA 出了 Android 包之后)

第 9 步 · 把 Android 包传到内部测试

NOVA 用 tools/tf-build/cut_android.sh 出一个 .aab 文件给你(这个工具只出包,不上传)。 Play Console → HOOP → TestingInternal testingCreate new release → 上传那个 .aabSaveReview releaseStart rollout。 如果 Play 要求先填完「App content」里的问卷(隐私政策、内容分级等),照实填完再回来。

为什么要先传:Google 规定没传过包就不能建内购商品

第 10 步 · 建六个商品

Play Console → HOOP → MonetizeProductsIn-app products(新版界面叫 One-time products)→ Create product:

  • Product ID:和苹果那边最后用的那一套一模一样(第 3 步定的,greenspark)
  • Name / Description:同第 7 步
  • Price:Google 可以直接输入,不用挑价格点 —— 马来西亚那一栏直接填 5.00 / 14.90 / 30.00 / 55.00 / 110.00 / 250.00
  • Countries / regions:只有 Malaysia
  • 最后 Activate

…34000:如果第 5 步的 15% 已经报名成功,可以直接 Activate;没有的话先别激活。

第 11 步 · 许可测试员

Play Console → SettingsLicense testing → 把 Android 测试员的 Gmail 加进一个名单。 名单里的人在内部测试版里买东西不扣钱

回我:测试员的 Gmail。


四、Google 密钥(阶段 3a 开工之前)

第 12 步 · Google Cloud 项目、接口、服务账号、密钥文件

  1. 打开 https://console.cloud.google.com/,新建一个项目,名字例如 hoop-play(已有合适的就用已有的)。记下项目 id
  2. APIs & ServicesLibrary,打开这两个:Google Play Android Developer APICloud Pub/Sub API
  3. IAM & AdminService AccountsCreate service account,名字 hoop-play-billing,角色什么都不用给 → 完成。记下它的邮箱(形如 hoop-play-billing@<项目id>.iam.gserviceaccount.com)。
  4. 点进这个服务账号 → KeysAdd keyCreate new keyJSON。会下载一个 .json 文件。
  5. 把这个文件直接传到服务器(不要发给任何人、不要贴到任何地方):
scp ~/Downloads/<下载的文件名>.json root@139.180.208.52:/root/hoop/deploy/google-play-sa.json
ssh root@139.180.208.52 chmod 600 /root/hoop/deploy/google-play-sa.json

传完之后,把电脑上那份下载的文件删掉

回我:项目 id、服务账号邮箱、/root/hoop/deploy/google-play-sa.json 已经放好。不要回文件内容。

第 13 步 · 在 Play Console 里给这个服务账号权限

Play Console → Users and permissionsInvite new users → 邮箱填第 12 步那个服务账号邮箱 → Account permissions 只勾这一个:

  • View financial data, orders, and cancellation survey responses(后端查购买、查退款只要这一项)

别的都别勾 —— 消耗购买是 App 自己做的,服务器用不着更多权限,钥匙给得越少越好。→ Invite user


五、我在房里说「Google 通知端点上线了」之后

第 14 步 · 实时通知(RTDN)

① 建主题。 Google Cloud → Pub/SubTopicsCreate topic,名字 play-rtdn

② 让 Google Play 能往里发。 打开这个主题的权限 → Add principal → 填 google-play-developer-notifications@system.gserviceaccount.com → 角色 Pub/Sub PublisherSave

③ 建推送订阅。 在这个主题下 Create subscription,按这张表填:

填什么
Delivery type Push
Endpoint URL https://api.hoopcomm.com/v1/iap/google/notify
Enable authentication 勾上
Service account 第 12 步的 hoop-play-billing
Audience 和 Endpoint URL 一模一样的那串

④ 在 Play Console 里填主题名。 Play Console → HOOP → MonetizeMonetization setupReal-time developer notifications → 勾 Enable real-time notificationsTopic nameprojects/<项目id>/topics/play-rtdnSave → 点 Send test notification

为什么要等我说:这个端点(阶段 3a 的 G4)还没写。现在就配,Google 会一直往一个不存在的地址推。

回我:点了测试通知。我这边看到收到了就算通了。


六、测试员(阶段 6)

  • iPhone:装 TestFlight 版就行,在 TestFlight 里买东西不扣钱。不需要另建沙盒账号。
  • Android:第 11 步名单里的 Gmail,在手机上用那个 Google 账号装内部测试版。

⚠️ 今天服务器拒收一切测试购买,而唯一的开关是全开 —— 全开的话谁装了测试版都能白拿真的 Spark。 所以计划里加了一张测试员名单:只有名单上的 HOOP 账号能用测试购买。把两位测试员的 HOOP 账号告诉我,我来加。


七、以后上线那一步(现在不用做,先知道)

  • 苹果第一次上内购,必须和一个新的 App 版本一起送审。到时候 NOVA 出的那一版送审时,在版本页的 In-App Purchases 那一栏把五个商品(不含 …34000)勾上一起送。
  • …34000:15% 真正生效之后才送审、才开卖(我会在房里说)。
  • 两边的销售范围一直只有 Malaysia,直到计划里说可以开放。

有任何一步界面和这里写的对不上,截个图丢到 ACodes 房,我对着改这份手册。