第5章 5.3 小程序发布流程

🎯 开场 3 分钟:为什么要学这个?

上一章我们学会了小程序分包加载,就像学会了「把大冰箱拆成若干块搬进家门」——内存占用降了,加载也快了。

但问题是:冰箱搬进去了,怎么让它正式住进用户手机里?

你有没有遇到过这种情况:本地开发好好的,微信开发者工具也能跑,但不知道怎么「发布」出去让别人用?或者辛辛苦苦做完,提交审核被拒了,一脸懵?

这一章,我们就来解决这个问题——把你的小程序从「本地玩具」变成「正式产品」的全流程

学完本文,你能独立完成:账号申请 → 开发配置 → 版本上传 → 提交审核 → 上线发布全套操作。


🧱 基础 25 分钟:核心概念

什么是小程序发布?

打个比方:小程序发布就像开店营业

开店步骤 小程序发布 说明
办理营业执照 注册微信公众平台 拿到合法身份
申请食品许可证 申请 AppID 微信官方认证
装修店铺 \n\nSimple tech illustration expla\n\nAI comic creation scene, creat\n\n 开发小程序 写代码做功能
提交卫生检查 提交代码审核 微信官方审查
领到许可证 发布上线 正式营业

什么是 AppID?

AppID 就是小程序的「身份证号」。每个小程序都独一无二,相当于你去办营业执照时的统一社会信用代码。

没有 AppID,你的小程序:
- 不能在真机上体验
- 不能提交审核
- 不能发布上线

怎么申请 AppID?

  1. 打开 微信公众平台
  2. 注册 → 选择「小程序」
  3. 填写信息 → 获得 AppID

申请完成后,你会拿到两个东西:
- AppID(小程序 ID)
- AppSecret(小程序密钥,保密!)

# 假设你申请到了这两个值
app_id = "wx1234567890abcdef"  # 你的小程序身份证号
app_secret = "abcd1234567890efghijk"  # 你的密钥(生产环境要保密)

print(f"我的小程序 ID 是:{app_id}")

什么是版本号?

小程序每次发布都要有个版本号,像软件版本一样,比如 1.0.01.2.3

版本号规范(语义化版本):
- 第 1 位:大版本更新,功能大变
- 第 2 位:新功能上线
- 第 3 位:bug 修复

# 小明的小程序版本管理
versions = [
"1.0.0",  # 第1个正式版本
"1.0.1",  # 修复了登录bug
"1.1.0",  # 新增了分享功能
"2.0.0",  # 大改版,全新UI
]

current_version = versions[-1]
print(f"当前线上版本:{current_version}")

什么是体验版?

体验版就像「试营业」,正式开业前先让内部员工或忠实用户测试一下。

特点:
- 不需要审核
- 只有管理员添加的成员能看
- 用来发现正式版的问题

# 小明的发布流程
publish_stages = [
"开发版",      # 本地自己玩
"体验版",      # 内部测试(试营业)
"审核中",      # 提交微信审核
"已发布"       # 正式上线(开业)
]

current = "体验版"
print(f"当前状态:{current} - 还没正式发布,只有测试人员能看")

什么是提交审核?

提交审核就像「食品安检」——你开店前得有人检查厨房卫不卫生。

微信官方会检查:
- 功能是否完整
- 是否有违规内容
- 用户体验是否合格

审核时间:通常 1-7 天

# 模拟提交审核流程
def submit_for_review(version, description):
if len(description) < 10:
    print("❌ 描述太短,请详细说明更新内容")
    return False
print(f"📤 提交版本 {version} 审核中...")
print(f"📝 更新说明:{description}")
print("⏳ 预计 1-7 天完成审核...")
return True

# 提交一个体验版
submit_for_review("1.0.0", "首次发布,包含首页和列表页")

🔥 实战 35 分钟:3 个递进小项目

项目 1(5 分钟):模拟完整的发布流程

跟着抄就能跑,理解核心步骤:

"""
小程序发布流程模拟器
作者:小明
功能:模拟从开发到上线全过程
"""

def print_section(title):
print(f"\n{'='*50}")
print(f"  {title}")
print('='*50)

def simulate_publish():
"""模拟完整发布流程"""
# 第1步:准备阶段
print_section("第1步:准备阶段")
app_id = "wx1234567890abcdef"
version = "1.0.0"
print(f"✅ AppID: {app_id}")
print(f"✅ 版本号: {version}")

# 第2步:上传代码
print_section("第2步:上传代码")
print("📤 正在压缩代码...")
print("📤 正在上传到微信服务器...")
print("✅ 代码上传成功!")

# 第3步:提交审核
print_section("第3步:提交审核")
print("📝 填写版本说明:首次发布")
print("⏳ 等待审核中(预计1-7天)...")
print("✅ 审核通过!")

# 第4步:发布上线
print_section("第4步:发布上线")
print("🎉 小程序已上线!")
print(f"🔗 访问地址:https://mp.weixin.qq.com/a/~{app_id}")

simulate_publish()

预期输出:

==================================================
第1步:准备阶段
==================================================
✅ AppID: wx1234567890abcdef
✅ 版本号: 1.0.0

==================================================
第2步:上传代码
==================================================
📤 正在压缩代码...
📤 正在上传到微信服务器...
✅ 代码上传成功!

==================================================
第3步:提交审核
==================================================
📝 填写版本说明:首次发布
⏳ 等待审核中(预计1-7天)...
✅ 审核通过!

==================================================
第4步:发布上线
==================================================
🎉 小程序已上线!
🔗 访问地址:https://mp.weixin.qq.com/a/~wx1234567890abcdef

项目 2(15 分钟):真实场景 - 自动生成版本记录

从 JSON 文件读取版本信息,生成发布报告:

"""
版本发布管理器
作者:小明
功能:管理多版本发布记录,生成发布报告
"""

import json
from datetime import datetime

def load_version_history():
"""从JSON文件加载版本历史(模拟从文件读取)"""
# 实际项目中这些数据会存在数据库或文件中
version_data = [
    {
        "version": "1.0.0",
        "date": "2024-01-15",
        "status": "已发布",
        "description": "首次发布,包含首页和商品列表",
        "review_days": 3
    },
    {
        "version": "1.0.1",
        "date": "2024-02-20",
        "status": "已发布",
        "description": "修复登录闪退bug",
        "review_days": 1
    },
    {
        "version": "1.1.0",
        "date": "2024-03-10",
        "status": "审核中",
        "description": "新增购物车功能",
        "review_days": None
    }
]
return version_data

def generate_publish_report():
"""生成发布报告"""
versions = load_version_history()

print("📊 小程序发布报告")
print(f"生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("-" * 50)

# 统计信息
total = len(versions)
released = len([v for v in versions if v["status"] == "已发布"])
pending = len([v for v in versions if v["status"] == "审核中"])
avg_review_days = sum(v["review_days"] for v in versions if v["review_days"]) / released if released else 0

print(f"📈 总版本数:{total}")
print(f"✅ 已发布:{released}")
print(f"⏳ 审核中:{pending}")
print(f"📅 平均审核时长:{avg_review_days:.1f} 天")
print("-" * 50)

# 列出所有版本
print("\n📋 版本详情:")
for v in versions:
    status_icon = "✅" if v["status"] == "已发布" else "⏳"
    print(f"{status_icon} v{v['version']} | {v['date']} | {v['description']}")

# 生成下一个版本建议
last_version = versions[-1]["version"]
parts = last_version.split(".")
parts[-1] = str(int(parts[-1]) + 1)  # 最后一个数字+1
next_version = ".".join(parts)
print(f"\n💡 建议下一个版本号:v{next_version}")

generate_publish_report()

预期输出:

📊 小程序发布报告
生成时间:2024-03-10 15:30:00
--------------------------------------------------
📈 总版本数:3
✅ 已发布:2
⏳ 审核中:1
📅 平均审核时长:2.0 天
--------------------------------------------------

📋 版本详情:
✅ v1.0.0 | 2024-01-15 | 首次发布,包含首页和商品列表
✅ v1.0.1 | 2024-02-20 | 修复登录闪退bug
⏳ v1.1.0 | 2024-03-10 | 新增购物车功能

💡 建议下一个版本号:v1.1.1

项目 3(15 分钟):组合项目 - 做一个「发布检查清单」工具

综合前面的能力,做一个有点真实用的小工具:

"""
小程序发布检查清单
作者:小明
功能:检查小程序是否满足发布条件,生成检查报告
"""

def check_item(name, condition, suggestion):
"""检查单个项目"""
result = "✅ 通过" if condition else "❌ 未通过"
if not condition:
    result += f" → {suggestion}"
return {"name": name, "result": result, "passed": condition}

def run_publish_checklist():
"""运行发布前检查"""
print("🔍 小程序发布前检查清单")
print("=" * 50)

# 定义检查项(模拟真实检查逻辑)
checks = [
    check_item(
        "AppID 已配置",
        True,
        "请在 project.config.json 中配置 appid"
    ),
    check_item(
        "版本号已更新",
        True,
        "修改 project.config.json 中的 version"
    ),
    check_item(
        "小程序已绑定微信开放平台",
        False,
        "前往 https://open.weixin.qq.com 绑定"
    ),
    check_item(
        "隐私协议已配置",
        True,
        "在 app.json 中配置 privacy"
    ),
    check_item(
        "代码无 console.log 调试语句",
        False,
        "全局搜索 console.log 并删除"
    ),
    check_item(
        "所有页面有标题",
        True,
        "检查每个页面的 json 配置"
    ),
]

# 显示检查结果
passed = 0
for i, check in enumerate(checks, 1):
    status = "✅" if check["passed"] else "❌"
    print(f"{i}. {status} {check['name']}")
    if not check["passed"]:
        print(f"   提示:{check['result'].split('→')[1].strip()}")

# 统计
print("-" * 50)
passed = sum(1 for c in checks if c["passed"])
total = len(checks)
print(f"检查结果:{passed}/{total} 通过")

if passed == total:
    print("🎉 所有检查项通过,可以提交审核!")
    return True
else:
    print("⚠️  还有问题需要修复,请先处理以上 ❌ 项")
    return False

def generate_release_note(version, features, fixes):
"""生成发布说明"""
print("\n📝 发布说明(可复制到微信后台):")
print("-" * 40)
print(f"版本:v{version}")
print("\n新增功能:")
for f in features:
    print(f"  • {f}")
print("\n问题修复:")
for fix in fixes:
    print(f"  • {fix}")

# 运行检查
can_release = run_publish_checklist()

# 如果通过,生成发布说明
if can_release:
generate_release_note(
    version="1.0.0",
    features=[
        "首页轮播图展示",
        "商品列表瀑布流布局",
        "下拉刷新和上拉加载更多"
    ],
    fixes=[
        "修复了iOS系统下布局错位的问题",
        "修复了某些Android机型白屏的问题"
    ]
)

预期输出:

🔍 小程序发布前检查清单
==================================================
1. ✅ AppID 已配置
2. ✅ 版本号已更新
3. ❌ 小程序已绑定微信开放平台
示:请前往 https://open.weixin.qq.com 绑定
4. ✅ 隐私协议已配置
5. ❌ 代码无 console.log 调试语句
示:全局搜索 console.log 并删除
6. ✅ 所有页面有标题
--------------------------------------------------
检查结果:4/6 通过
⚠️  还有问题需要修复,请先处理以上 ❌ 项

💪 进阶 20 分钟:常见坑 + 性能小贴士

坑 1:AppID 填写错误 ❌ → ✅

# ❌ 错误示例:AppID 包含空格或引号
app_id = " wx1234567890abcdef "  # 两边有空格

# ✅ 正确示例:AppID 纯净无杂质
app_id = "wx1234567890abcdef"  # 干干净净

注意:AppID 填错会直接导致「invalid appid」错误,上传不了代码。


坑 2:版本号格式不对 ❌ → ✅

# ❌ 错误示例:版本号有小数点问题
version = "1.0"  # 少一位,不符合语义化版本

# ✅ 正确示例:三段式版本号
version = "1.0.0"  # 完美
version = "2.1.15"  # 也可以

坑 3:隐私协议没配置就被驳回 ❌ → ✅

# ❌ 错误示例:没配置隐私协议
# 小程序直接被微信拒绝上架

# ✅ 正确示例:在 app.json 中配置
"""
app.json 中添加:
{
"privacy": {
"notice": "为了给您提供更好的服务,我们需要使用您的以下信息..."
}
}
"""
print("✅ 隐私协议已配置")

坑 4:体验版能看,正式版打不开 ❌ → ✅

这种情况通常是缓存问题

# 解决方案1:清理微信开发者工具的缓存
# 菜单 → 工具 → 清除缓存 → 清除全部

# 解决方案2:检查 app.json 配置
print("""
常见原因:
1. 域名没配置(检查 mp.weixin.qq.com 开发者工具 → 详情 → 域名信息)
2. TLS 版本不对(服务器需要支持 TLS 1.2)
3. HTTPS 证书问题(用正式证书,别用自签名)
""")

坑 5:审核被拒,不知道原因 ❌ → ✅

# 微信审核被拒的TOP3原因及解决方案
rejection_reasons = {
"1. 功能不完整": "确保每个按钮都有实际功能,不要放空链接",
"2. 诱导分享": "不要在页面中出现'分享到朋友圈'等诱导文案",
"3. 虚拟支付": "不要在小程序内直接显示价格购买虚拟商品"
}

for reason, solution in rejection_reasons.items():
print(f"❌ {reason}")
print(f"   ✅ 解决方案:{solution}\n")

调试技巧:如何快速定位问题?

# 技巧1:使用 console.log 查看变量
# 在 uniapp 中这样用:
# console.log("当前版本:", version)

# 技巧2:利用网络请求查看接口调用
print("""
调试技巧:
1. 打开微信开发者工具 → 详情 → 域名信息 → 查看合法域名
2. 切换到 Network 面板,查看接口请求和响应
3. 使用 console.log 打印关键变量值
4. 用 try-except 包裹可能出错的代码
""")

# 技巧3:使用条件断点
def debug_version(version):
if version == "debug":  # 特殊版本号触发调试
    print("🔍 调试模式已开启")
    import pdb; pdb.set_trace()
return version

✏️ 练习题 + 作业题

练习题(10 分钟)

练习 1(2 分钟):版本号判断
- 输入:版本号 "1.2.3"
- 预期输出:"合法版本号"
- 提示:用 len() 判断有几个点

练习 2(2 分钟):添加审核状态
- 输入:在项目 1 基础上添加「审核中」「已拒绝」两种状态
- 预期输出:能显示不同状态
- 提示:用一个变量 status 存储状态

练习 3(2 分钟):处理新版本数据
- 输入:[{"version": "1.0.0", "status": "已发布"}, {"version": "1.1.0", "status": "已发布"}]
- 预期输出:打印「所有版本都已发布」
- 提示:用 all() 函数判断

练习 4(3 分钟):版本号比较
- 输入:两个版本号 "1.2.0""1.10.0"
- 预期输出:"1.10.0 更新"
- 提示:把版本号拆成列表比较

练习 5(1 分钟):找错
- 下面代码有什么问题?

app_id = "wx1234567890abcdef"
print(f'我的AppID是: {app_id}")
  • 提示:引号不匹配

作业题(30 分钟 - 2 小时)

作业:做一个「小程序版本发布助手」

  • 需求描述:开发一个命令行工具,帮助开发者管理小程序的版本发布流程

  • 功能点
    1. 查看当前版本信息
    2. 添加新版本记录(版本号、描述、状态)
    3. 生成发布检查报告
    4. 导出发布说明(markdown 格式)

  • 加分项
    1. 数据保存到 JSON 文件(重启后不丢失)
    2. 支持版本号自动递增

  • 验收标准

  • 能正常运行不报错
  • 版本记录能正确添加和显示
  • 生成的发布说明格式正确

  • 提交方式:评论区贴代码或 GitHub 链接


📚 总结 + 资源

本文学到的 3 个核心点:
1. 小程序发布就像「开店营业」,需要营业执照(AppID)、检查(审核)、领证(上线)
2. 发布前一定要做检查清单,避免审核被拒
3. 版本号管理要规范,用语义化版本号(主版本.次版本.修订号)

延伸学习资源:
- 微信小程序官方文档 - 发布流程
- 《uniapp 跨平台开发实战》(进阶读物)
- B 站搜索「小程序发布流程」视频教程(视觉化学习)

互动钩子:
你在发布小程序时遇到过审核被拒吗?是因为什么原因?评论区聊聊,老粉优先回复!


下一章我们要解决一个让无数新手头疼的问题:自定义基座与真机调试——本地模拟器再好,也不如真机来得真实,但真机调试一堆坑怎么办?下一章教你优雅地「驾驭真机」!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。