游戏渠道发行运营实战记录:从初审到上线的完整流程

去年负责一个海外游戏发行项目,渠道上线是个复杂的过程。这篇记录一下从初审到上线的完整流程和踩过的坑。

渠道发行整体流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────────────────┐
│ 游戏渠道发行流程图 │
├─────────────────────────────────────────────────────────────────────┤

│ Phase 1 Phase 2 Phase 3 Phase 4
│ 初审阶段 技术对接 测试验证 上线运营
│ │ │ │ │
│ ▼ ▼ ▼ ▼
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ │提交 │ │登录 │ │功能 │ │运营 │
│ │资料 │───────►│接口 │───────►│测试 │───────►│配置 │
│ │ │ │ │ │ │ │ │
│ │审核 │ │计费 │ │压力 │ │活动 │
│ │通过 │ │接口 │ │测试 │ │上线 │
│ │ │ │ │ │ │ │ │
│ │确定 │ │环境 │ │兼容 │ │数据 │
│ │对接人│ │部署 │ │测试 │ │监控 │
│ └──────┘ └──────┘ └──────┘ └──────┘
│ │ │ │ │
│ └────────────────┴────────────────┴────────────────┘
│ 时间计划排期

Phase 1:游戏初审

提交资料清单

资料类型 具体内容 格式要求
游戏 APK/IPA 签名版本,对应渠道包名 .apk/.ipa
游戏图标 512x512 高清图标 .png
游戏截图 5-10 张游戏截图 .jpg/.png
游戏视频 30秒宣传视频 .mp4
游戏简介 200-500字游戏介绍 .doc/.txt
开发者资质 营业执照、软著等 .pdf/.jpg
计费点说明 道具列表及定价 .xlsx

审核周期

渠道类型 初审时间 特殊要求
主流应用商店 3-7 工作日 需提供完整资质
运营商渠道 7-14 工作日 需额外安全审核
海外 Google Play 1-3 工作日 需隐私政策链接
海外 App Store 1-7 工作日 严格内容审核

常见问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
┌─────────────────────────────────────────────────────────────┐
│ 初审常见问题 │
├─────────────────────────────────────────────────────────────┤

│ ❌ 被拒原因 ✅ 解决方案
│ ─────────────────────────────────────────────────────────

│ 1. 游戏内容违规
│ • 暴力血腥内容 • 调整美术风格
│ • 政治敏感内容 • 替换相关素材
│ • 版权侵权 • 获取正版授权

│ 2. 技术问题
│ • 闪退/卡顿 • 修复崩溃 Bug
│ • 适配问题 • 增加机型适配
│ • 内存占用过高 • 优化内存使用

│ 3. 资质问题
│ • 缺少软著 • 提交软著申请
│ • 资质过期 • 更新资质文件
│ • 信息不一致 • 核对并修正信息

│ 4. 计费问题
│ • 定价不合理 • 调整定价策略
│ • 计费点描述不清 • 完善道具说明
│ • 缺少计费测试 • 提供测试账号

Phase 2:技术对接

运营对接(接口人)

对接团队结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
┌─────────────────────────────────────────────────────────────┐
│ 渠道对接团队 │
├─────────────────────────────────────────────────────────────┤

│ ┌──────────┐
│ │ 渠道方 │
│ │ 项目经理 │
│ └────┬─────┘
│ │
│ ┌──────────────┼──────────────┐
│ │ │ │
│ ▼ ▼ ▼
│ ┌────────┐ ┌────────┐ ┌────────┐
│ │技术对接│ │运营对接│ │商务对接│
│ │ 人 │ │ 人 │ │ 人 │
│ └────┬───┘ └────┬───┘ └────────┘
│ │ │
│ └──────────────┘
│ │
│ ▼
│ ┌──────────┐
│ │ 发行方 │
│ │ 项目经理 │
│ └─────┬────┘
│ │
│ ┌──────────┼──────────┐
│ │ │ │
│ ▼ ▼ ▼
│ ┌────────┐ ┌────────┐ ┌────────┐
│ │技术团队│ │运营团队│ │QA团队 │
│ └────────┘ └────────┘ └────────┘

沟通方式

方式 频率 用途
邮件 每日 正式文档、进度汇报
即时通讯 实时 快速沟通、问题协调
电话会议 每周 进度同步、问题解决
面对面会议 需要时 重大问题讨论

时间计划排期

1
2
3
4
5
6
7
8
9
10
11
12
13
Week 1    Week 2    Week 3    Week 4    Week 5    Week 6
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│初审 │ │登录 │ │计费 │ │测试 │ │测试 │ │上线 │
│ │ │对接 │ │对接 │ │准备 │ │执行 │ │准备 │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │功能 │ │压力 │ │运营 │
│ │ │ │ │ │ │测试 │ │测试 │ │配置 │
└─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘
│ │ │ │ │ │
└────────┴────────┴────────┴────────┴────────┘
关键里程碑

CAS 登录接口对接

CAS 流程概览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌─────────────────────────────────────────────────────────────────────┐
│ CAS 登录流程 │
├─────────────────────────────────────────────────────────────────────┤

│ 用户 游戏 游戏服务器 CAS服务器
│ │ │ │ │
│ │ 打开游戏 │ │ │
│ │────────────────►│ │ │
│ │ │ │ │
│ │ │ 检查登录状态 │ │
│ │ │──────────────────►│ │
│ │ │ │ │
│ │ 未登录, │◄─ 返回未登录 │ │
│ │ 跳转登录页 │ │ │
│ │◄────────────────│ │ │
│ │ │ │ │
│ │──────────────────────────────────────────────────────►
│ │ 在 CAS 页面完成认证 │
│ │──────────────────────────────────────────────────────►
│ │ │ │ │
│ │◄─────────────────────────────────────────────────────
│ │ 返回 Authorization Code │
│ │ │ │ │
│ │ │ 提交 Code 换取 Token │
│ │ │──────────────────────────────────────►
│ │ │ │ │
│ │ │◄─────────────────────────────────────
│ │ │ 返回 Access Token + User Info │
│ │ │ │ │
│ │ │ 登录成功,创建会话 │
│ │ │──────────────────►│ │
│ │ │ │ │
│ │ 进入游戏 │◄─ 返回游戏数据 │ │
│ │◄────────────────│ │ │
│ │ │ │ │

对接文档要求

文档 内容 提供者
CAS 接入文档 OAuth2.0 流程说明 渠道方
测试账号 各环境测试账号 渠道方
浏览器调试指南 如何本地调试 渠道方
接口联调手册 联调步骤和检查点 双方

浏览器调试配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 本地开发时模拟 CAS 登录
// config/cas.local.js
module.exports = {
cas: {
// CAS 服务器地址
serverUrl: 'https://cas-staging.example.com',

// 回调地址(本地开发使用代理)
callbackUrl: 'http://localhost:3000/auth/cas/callback',

// 代理配置(解决跨域)
proxy: {
enabled: true,
target: 'https://cas-staging.example.com',
changeOrigin: true
},

// 测试账号
testAccounts: [
{ username: 'test_user_001', password: 'Test123!' },
{ username: 'test_user_002', password: 'Test123!' }
]
}
};

SPS 计费接口对接

计费流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌─────────────────────────────────────────────────────────────────────┐
│ SPS 计费流程 │
├─────────────────────────────────────────────────────────────────────┤

│ 用户 游戏 游戏服务器 SPS服务器
│ │ │ │ │
│ │ 点击购买 │ │ │
│ │────────────────►│ │ │
│ │ │ │ │
│ │ │ 创建订单 │ │
│ │ │──────────────────►│ │
│ │ │ │ │
│ │ │ 返回订单信息 │ │
│ │ │◄─────────────────│ │
│ │ │ │ │
│ │ 调起支付 │ │ │
│ │◄────────────────│ │ │
│ │ │ │ │
│ │──────────────────────────────────────────────────────►
│ │ │ │ │
│ │ │ │ │
│ │ 支付成功 │ │ │
│ │◄─────────────────────────────────────────────────────
│ │ │ │ │
│ │ │ │ │
│ │ │ │ 支付回调 │
│ │ │ │◄──────────────│
│ │ │ │ │
│ │ │ │ 验证并发货 │
│ │ │ │ │
│ │ │◄─ 发放道具 │ │
│ │ │ │ │
│ │ 购买成功 │◄──────────────────│ │
│ │◄────────────────│ │ │
│ │ │ │ │

订单安全验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// SPS 回调验证
const crypto = require('crypto');

function verifySPSCallback(callbackData, secretKey) {
const { orderId, userId, productId, amount, timestamp, sign } = callbackData;

// 1. 时间戳验证(防止重放攻击)
const now = Date.now();
const callbackTime = parseInt(timestamp);
if (Math.abs(now - callbackTime) > 300000) { // 5分钟窗口
throw new Error('Request expired');
}

// 2. 签名验证
const signData = `orderId=${orderId}&userId=${userId}&productId=${productId}&amount=${amount}&timestamp=${timestamp}`;
const calculatedSign = crypto
.createHmac('sha256', secretKey)
.update(signData)
.digest('hex');

if (sign !== calculatedSign) {
throw new Error('Invalid signature');
}

// 3. 金额验证
const expectedAmount = getProductPrice(productId);
if (parseFloat(amount) !== expectedAmount) {
throw new Error('Amount mismatch');
}

return true;
}

Phase 3:测试验证

Staging 测试环境

环境配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌─────────────────────────────────────────────────────────────┐
│ Staging 环境配置 │
├─────────────────────────────────────────────────────────────┤

│ □ 服务器配置
│ ├── 跳板机(Jump Server)已配置
│ ├── 应用服务器(2台,c4.xlarge)
│ ├── 数据库服务器(1台,r4.large)
│ ├── Redis 服务器(1台,cache.r3.large)
│ └── 负载均衡(ELB)已配置

│ □ 域名配置
│ ├── staging.game.com 指向应用服务器
│ ├── staging-api.game.com 指向 API 服务器
│ └── SSL 证书已配置

│ □ 访问权限
│ ├── SSH 密钥已分发
│ ├── VPN 配置(如有需要)
│ └── 防火墙规则已配置

│ □ 验证文件
│ ├── robots.txt(禁止搜索引擎)
│ └── 渠道验证文件(如需要)

服务器申请流程

步骤 任务 负责方 时间
1 填写机器配置申请表 技术团队 Day 1
2 IT 审批 渠道方 IT Day 2-3
3 创建服务器 渠道方运维 Day 4-5
4 配置安全组 渠道方运维 Day 5
5 申请域名 技术团队 Day 1-2
6 域名解析配置 渠道方 IT Day 3-4
7 SSL 证书申请 技术团队 Day 2-3
8 证书部署 渠道方运维 Day 5

压力测试(TPS)

测试指标

指标 目标值 测试工具
TPS ≥ 3000 JMeter
并发连接 ≥ 5000 JMeter
响应时间 < 100ms JMeter
错误率 < 0.1% JMeter
CPU 使用率 < 80% CloudWatch
内存使用率 < 85% CloudWatch

测试报告模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
┌─────────────────────────────────────────────────────────────┐
│ 压力测试报告 │
├─────────────────────────────────────────────────────────────┤

│ 测试日期:2018-12-20
│ 测试环境:Staging
│ 测试工具:JMeter 5.0

│ ─────────────────────────────────────────────────────────
│ 服务器配置:
│ • CPU:16 核
│ • 内存:32 GB
│ • 磁盘:100 GB SSD
│ • 服务实例:12 个(PM2 cluster)
│ ─────────────────────────────────────────────────────────

│ 测试结果:
│ ┌────────────────┬───────────┬───────────┬────────┐
│ │ 指标 │ 目标值 │ 实际值 │ 状态 │
│ ├────────────────┼───────────┼───────────┼────────┤
│ │ TPS │ 3000 │ 5000 │ ✅ 通过 │
│ │ 并发连接 │ 5000 │ 5000+ │ ✅ 通过 │
│ │ 平均响应时间 │ <100ms │ 15ms │ ✅ 通过 │
│ │ 错误率 │ <0.1% │ 0.01% │ ✅ 通过 │
│ │ CPU 使用率 │ <80% │ 65% │ ✅ 通过 │
│ │ 内存使用率 │ <85% │ 56% │ ✅ 通过 │
│ └────────────────┴───────────┴───────────┴────────┘

│ 结论:测试通过,满足上线要求。

兼容测试

测试机型清单(印度市场示例)

品牌 型号 系统版本 分辨率 状态
Xiaomi Redmi Note 7 Android 9 2340x1080 ✅ 通过
Xiaomi Redmi 8A Android 9 1520x720 ✅ 通过
Samsung Galaxy M30 Android 10 2340x1080 ✅ 通过
Samsung Galaxy A10 Android 9 1520x720 ✅ 通过
Vivo Y91 Android 8.1 1520x720 ✅ 通过
Oppo A5s Android 8.1 1520x720 ✅ 通过
Realme C2 Android 9 1560x720 ✅ 通过
Motorola One Power Android 9 2246x1080 ✅ 通过

注意: 部分印度市场主流机型国内无法获取,可通过浏览器模拟对应分辨率进行测试。

功能测试用例

核心功能清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
┌─────────────────────────────────────────────────────────────┐
│ 功能测试用例 │
├─────────────────────────────────────────────────────────────┤

│ 模块:登录系统 优先级:P0
│ ─────────────────────────────────────────────────────────
│ TC-001: CAS 登录成功
│ TC-002: CAS 登录失败处理
│ TC-003: Token 过期自动刷新
│ TC-004: 多设备登录处理
│ TC-005: 游客模式(如支持)

│ 模块:计费系统 优先级:P0
│ ─────────────────────────────────────────────────────────
│ TC-101: 道具购买成功
│ TC-102: 重复支付处理
│ TC-103: 支付失败退款
│ TC-104: 网络中断恢复后补单
│ TC-105: 订单查询

│ 模块:游戏核心 优先级:P0
│ ─────────────────────────────────────────────────────────
│ TC-201: 创建房间
│ TC-202: 加入房间
│ TC-203: 匹配系统
│ TC-204: 实时对战
│ TC-205: 断线重连
│ TC-206: 游戏结算

│ 模块:社交系统 优先级:P1
│ ─────────────────────────────────────────────────────────
│ TC-301: 好友系统
│ TC-302: 聊天功能
│ TC-303: 排行榜

│ 模块:系统功能 优先级:P1
│ ─────────────────────────────────────────────────────────
│ TC-401: 消息推送
│ TC-402: 版本更新
│ TC-403: 设置选项
│ TC-404: 帮助与反馈

Phase 4:上线运营

服务器监控需求

监控项配置

监控项 告警阈值 通知方式 响应时间
CPU 使用率 > 80% 邮件+短信 5分钟
内存使用率 > 85% 邮件+短信 5分钟
磁盘使用率 > 90% 邮件 30分钟
服务可用性 = 0 电话+邮件+短信 立即
响应时间 > 500ms 邮件 10分钟
错误率 > 1% 邮件 10分钟
在线用户数 < 基准值 50% 邮件 30分钟

数据库表说明文档

计费相关表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 订单表
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id VARCHAR(64) UNIQUE NOT NULL COMMENT '订单号',
user_id VARCHAR(64) NOT NULL COMMENT '用户ID',
product_id VARCHAR(64) NOT NULL COMMENT '商品ID',
product_name VARCHAR(255) COMMENT '商品名称',
amount DECIMAL(10,2) NOT NULL COMMENT '金额',
currency VARCHAR(3) DEFAULT 'INR' COMMENT '货币',
status TINYINT NOT NULL COMMENT '状态:0待支付 1已支付 2已发货 3已完成 4已退款',
channel VARCHAR(32) COMMENT '渠道',
pay_time TIMESTAMP NULL COMMENT '支付时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

-- 道具发放记录
CREATE TABLE item_delivery (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64) NOT NULL,
item_id VARCHAR(64) NOT NULL,
quantity INT NOT NULL,
status TINYINT DEFAULT 0 COMMENT '0待发放 1已发放 2发放失败',
error_msg TEXT,
delivered_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_order_id (order_id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='道具发放记录';

管理后台翻译

多语言配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"en": {
"menu": {
"dashboard": "Dashboard",
"players": "Player Management",
"orders": "Order Management",
"items": "Item Management",
"statistics": "Statistics",
"settings": "Settings"
},
"order": {
"title": "Order List",
"search": "Search orders...",
"status": {
"pending": "Pending",
"paid": "Paid",
"delivered": "Delivered",
"completed": "Completed",
"refunded": "Refunded"
}
}
},
"hi": {
"menu": {
"dashboard": "डैशबोर्ड",
"players": "खिलाड़ी प्रबंधन",
"orders": "ऑर्डर प्रबंधन",
"items": "आइटम प्रबंधन",
"statistics": "आंकड़े",
"settings": "सेटिंग्स"
}
}
}

运营活动配置

活动类型

活动类型 说明 配置项
新手礼包 新用户专属奖励 奖励内容、领取条件、有效期
首充双倍 首次充值额外奖励 适用档位、倍数、有效期
限时折扣 特定道具打折 折扣商品、折扣比例、时间
排行榜活动 根据排名发放奖励 榜单类型、奖励设置、周期
登录奖励 累计登录送奖励 奖励内容、天数要求

统计数据接入

第三方平台配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// TalkingData 配置
const talkingDataConfig = {
appId: 'YOUR_APP_ID',
channelId: 'google_play',

// 自定义事件
events: {
// 用户行为
USER_LOGIN: 'user_login',
USER_REGISTER: 'user_register',

// 游戏行为
GAME_START: 'game_start',
GAME_END: 'game_end',
GAME_WIN: 'game_win',
GAME_LOSE: 'game_lose',

// 付费行为
PAY_START: 'pay_start',
PAY_SUCCESS: 'pay_success',
PAY_FAIL: 'pay_fail',

// 道具行为
ITEM_BUY: 'item_buy',
ITEM_USE: 'item_use'
}
};

数据指标

指标类型 具体指标 计算方式
用户指标 DAU/MAU 日/月活跃用户数
用户指标 留存率 N日留存用户数/新增用户数
用户指标 新增用户 每日新注册用户数
付费指标 ARPU 总收入/活跃用户数
付费指标 ARPPU 总收入/付费用户数
付费指标 付费率 付费用户数/活跃用户数
游戏指标 平均游戏时长 总游戏时长/游戏次数
游戏指标 平均对局数 总对局数/活跃用户数

定期报告模板

周报模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
┌─────────────────────────────────────────────────────────────┐
│ 运营周报 │
│ 2018.12.10 - 2018.12.16 │
├─────────────────────────────────────────────────────────────┤

│ 一、核心数据
│ ─────────────────────────────────────────────────────────
│ • DAU:125,000 (+8% WoW)
│ • 新增用户:15,000 (-5% WoW)
│ • 次日留存:42% (+2% WoW)
│ • 7日留存:25% (持平)
│ • 收入:$45,000 (+12% WoW)
│ • ARPU:$0.36
│ • 付费率:3.2%

│ 二、问题跟踪
│ ─────────────────────────────────────────────────────────
│ 问题#1: 部分用户登录失败
│ • 状态:已修复
│ • 原因:CAS Token 过期处理异常
│ • 影响:约 500 用户

│ 问题#2: 计费回调延迟
│ • 状态:跟进中
│ • 原因:渠道方 SPS 服务器响应慢
│ • 影响:平均延迟 5 秒

│ 三、下周计划
│ ─────────────────────────────────────────────────────────
│ • 上线新年活动
│ • 优化匹配算法
│ • 处理遗留 Bug

写在最后

游戏渠道发行是个系统工程,需要技术、运营、QA 多个团队的密切配合。这篇记录涵盖了从初审到上线的全过程:

  1. 初审阶段:准备完整资料,预留充足审核时间
  2. 技术对接:明确接口人,规范沟通方式,及时解决阻塞问题
  3. 测试验证:严格的环境配置,完整的测试覆盖
  4. 上线运营:持续的数据监控,及时的运营响应

关键成功要素:

  • 文档先行:所有配置、流程必须有文档记录
  • 提前沟通:与渠道方保持密切沟通,提前暴露风险
  • 充分测试:Staging 环境务必与 Production 环境一致
  • 数据驱动:建立完善的监控和报表体系
  • 快速响应:建立应急机制,及时处理线上问题

通过标准化的发行流程,可以大幅降低上线风险,确保游戏顺利触达目标用户。