| 档案 | |
|---|---|
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 那几段各二十分钟,但要等前面的条件满足。 控制台里按钮上的字是英文的,下面照原样写,方便你对着找。
三条绝对不能做
- 密钥文件绝不进聊天、绝不进 git。 Google 那个 JSON 文件只走
scp直接放到服务器上(第 12 步)。 - 第 3 步有答案之前,两个控制台都别按「Create」建商品。 商品 id 建了就永久占掉,删了也不能再用。
…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 → 左边栏 Monetization → In-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)→ Setup → Payments 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 Region 选 Malaysia。 然后给六档各挑一个价格点。苹果只能从它的价格点表里挑,规则是:选不高于目标价的最近那个。
| 档位(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 URL → Set 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 → Testing → Internal testing → Create new release → 上传那个 .aab → Save → Review release → Start rollout。
如果 Play 要求先填完「App content」里的问卷(隐私政策、内容分级等),照实填完再回来。
为什么要先传:Google 规定没传过包就不能建内购商品。
第 10 步 · 建六个商品
Play Console → HOOP → Monetize → Products → In-app products(新版界面叫 One-time products)→ Create product:
- Product ID:和苹果那边最后用的那一套一模一样(第 3 步定的,
green或spark) - 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 → Settings → License testing → 把 Android 测试员的 Gmail 加进一个名单。 名单里的人在内部测试版里买东西不扣钱。
回我:测试员的 Gmail。
四、Google 密钥(阶段 3a 开工之前)
第 12 步 · Google Cloud 项目、接口、服务账号、密钥文件
- 打开 https://console.cloud.google.com/,新建一个项目,名字例如
hoop-play(已有合适的就用已有的)。记下项目 id。 - APIs & Services → Library,打开这两个:Google Play Android Developer API、Cloud Pub/Sub API。
- IAM & Admin → Service Accounts → Create service account,名字
hoop-play-billing,角色什么都不用给 → 完成。记下它的邮箱(形如hoop-play-billing@<项目id>.iam.gserviceaccount.com)。 - 点进这个服务账号 → Keys → Add key → Create new key → JSON。会下载一个
.json文件。 - 把这个文件直接传到服务器(不要发给任何人、不要贴到任何地方):
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 permissions → Invite new users → 邮箱填第 12 步那个服务账号邮箱 → Account permissions 只勾这一个:
- View financial data, orders, and cancellation survey responses(后端查购买、查退款只要这一项)
别的都别勾 —— 消耗购买是 App 自己做的,服务器用不着更多权限,钥匙给得越少越好。→ Invite user。
五、我在房里说「Google 通知端点上线了」之后
第 14 步 · 实时通知(RTDN)
① 建主题。 Google Cloud → Pub/Sub → Topics → Create topic,名字 play-rtdn。
② 让 Google Play 能往里发。 打开这个主题的权限 → Add principal → 填
google-play-developer-notifications@system.gserviceaccount.com → 角色 Pub/Sub Publisher → Save。
③ 建推送订阅。 在这个主题下 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 → Monetize → Monetization setup →
Real-time developer notifications → 勾 Enable real-time notifications →
Topic name 填 projects/<项目id>/topics/play-rtdn → Save → 点 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 房,我对着改这份手册。