1项目概述
1.1 项目背景
随着健身行业数字化转型加速,传统健身房需要一套完整的会员管理移动端应用,实现会员卡管理、课程预约、教练匹配等核心业务的线上化。本项目旨在为健身俱乐部打造一款面向会员的移动端产品,提升会员体验和运营效率。
1.2 目标用户
- 健身俱乐部现有会员:需要管理会员卡、预约课程、查看训练记录
- 潜在新会员:了解场馆信息、教练资源,促进转化
1.3 产品目标
- 实现会员卡电子化,支持扫码签到和人脸签到
- 提供在线课程购买、会员卡购买和私教预约功能
- 搭建会员与教练的线上沟通桥梁
- 支持美团/抖音团购券在线核销
- 提升会员留存率和复购率
2功能架构
↓ 核心功能模块 ↓
扫码签到
课程预约
场馆浏览
教练选择
会员管理
训练记录
↓ v2.0 新增模块 ↓
课程购买
会员卡购买
人脸录入
团购核销
订单管理
3页面需求详细说明
3.1 首页
| 模块 | 需求描述 |
| 门店切换 | 顶部显示当前门店名称,点击可切换至其他门店 |
| 搜索 | 支持搜索课程名称和教练姓名 |
| 轮播Banner | 展示运营活动和促销信息,自动轮播(3秒间隔),支持手动滑动 |
| 快捷入口 | 4个快捷功能:扫码签到、预约课程、场馆介绍、私教服务 |
| 会员卡展示 | 展示当前用户的会员卡信息(卡号、姓名、等级、有效期),支持查看全部卡片 |
| 热门课程 | 横向滚动展示热门课程卡片(课程图片、名称、教练、时长),点击进入课程详情 |
| 底部Tab栏 | 4个Tab:首页、场馆、教练、我的,支持Tab切换 |
3.2 会员中心
| 模块 | 需求描述 |
| 用户信息区 | 橙色渐变背景,展示用户头像、姓名、手机号、会员等级标签 |
| 数据统计 | 3列展示:账户余额(元)、我的积分、剩余课程(节) |
| 功能菜单 | 8个菜单项:我的会员卡、预约记录、私教记录、我的教练、会员二维码、会员信息、意见反馈、关于我们 |
3.3 会员二维码弹窗
| 模块 | 需求描述 |
| 弹窗展示 | 从会员中心点击"会员二维码"弹出,半透明遮罩背景 |
| 二维码 | 展示动态生成的会员专属二维码,包含会员唯一标识 |
| 会员信息 | 头像、姓名、会员类型、卡号(脱敏显示) |
| 关闭操作 | 点击关闭按钮或遮罩区域关闭弹窗 |
3.4 会员信息
| 模块 | 需求描述 |
| 头像编辑 | 展示用户头像,支持点击更换头像(调用系统相机/相册) |
| 基本信息 | 只读展示:姓名、手机号、性别、生日、会员类型、开卡日期、到期日期 |
| 编辑模式 | 点击右上角"编辑"进入编辑模式,可修改姓名、性别、生日 |
| 退出登录 | 底部退出登录按钮,点击后弹出确认弹窗 |
3.5 切换门店
| 模块 | 需求描述 |
| 定位信息 | 获取用户当前位置,显示省市区信息 |
| 搜索门店 | 支持按门店名称搜索 |
| 当前门店 | 橙色边框高亮显示当前门店,右上角"当前门店"标签 |
| 门店列表 | 展示所有门店的名称、详细地址、距离信息 |
| 切换操作 | 点击门店卡片切换至对应门店,切换后首页数据更新 |
3.6 场馆详情
| 模块 | 需求描述 |
| 场馆图片 | 顶部展示场馆主图,支持多图轮播 |
| 基本信息 | 名称、评分(五星制)、地址、营业时间、联系电话 |
| 设施标签 | 展示场馆配套设施数据:有氧区、力量区、游泳池、瑜伽室、桑拿房等 |
| 场馆介绍 | 富文本展示场馆详细描述 |
| 导航功能 | 底部"导航到这里"按钮,调用第三方地图导航 |
3.7 教练列表
| 模块 | 需求描述 |
| 分类筛选 | 横向Tab筛选:全部、增肌、减脂、体能、康复、瑜伽 |
| 教练卡片 | 展示:头像、姓名、性别、专长标签、评分、已授课数 |
| 预约按钮 | 每张卡片右侧"预约"按钮,点击跳转预约页面 |
| 筛选功能 | 右上角筛选图标,支持按评分、价格、距离等条件筛选 |
3.8 教练详情
| 模块 | 需求描述 |
| 教练头部 | 橙色渐变背景,展示头像、姓名、专长标签 |
| 数据统计 | 3列展示:评分、已授课节数、教龄 |
| 个人简介 | 展示教练的详细个人介绍 |
| 资质认证 | 列表展示教练持有的专业认证 |
| 学员评价 | 展示最新评价(头像、昵称、星级、内容、日期),支持"查看全部" |
| 预约按钮 | 底部固定"立即预约"按钮 |
3.9 预约课程
| 模块 | 需求描述 |
| 选择教练 | 横向滚动教练头像列表,选中状态橙色边框+勾选 |
| 选择日期 | 横向滚动日期选择器,展示一周7天(星期+日期),已过日期不可选 |
| 选择时段 | 9宫格时段选择:08:00-20:00共9个时段,已被预约的时段灰色不可选 |
| 课程类型 | 单选列表:私教一对一(¥300/节)、私教一对二(¥200/节)、小团课(¥150/节) |
| 确认预约 | 底部显示合计金额+"确认预约"按钮,提交后生成预约记录 |
3.10 私教记录
| 模块 | 需求描述 |
| 状态筛选 | 4个Tab:全部、已完成、待上课、已取消,选中态橙色下划线 |
| 记录卡片 | 展示:课程类型、状态标签、教练信息、上课时间 |
| 已完成 | 显示课程评分,支持查看训练详情 |
| 待上课 | 显示"取消预约"按钮,点击后二次确认取消 |
| 已取消 | 灰色显示,不提供操作按钮 |
↓ v2.0 新增需求 ↓
3.11 一键登录 / 手机号登录
| 模块 | 需求描述 |
| 一键登录 | 读取本机手机号(运营商授权),显示脱敏号码(138****8888),点击即可登录。支持关闭页面返回 |
| 手机号登录 | 输入手机号 + 短信验证码登录。未注册手机号自动创建新账号。60秒倒计时重发验证码 |
| 第三方登录 | 支持微信、支付宝、Apple ID 三种第三方登录方式 |
| 协议确认 | 登录页底部展示用户协议和隐私政策链接,登录即视为同意 |
3.12 首页(升级版)
| 模块 | 需求描述 |
| 快捷入口升级 | 由4个扩展为8个:扫码签到、预约课程、场馆、私教服务、买会员卡、课程商城、我的订单、人脸录入 |
| 团购核销入口 | 新增美团/抖音团购核销推广入口卡片,点击进入团购核销页面 |
| 会员卡人脸标识 | 会员卡右上角显示"已录入人脸"徽章,未录入时不显示 |
| 课程价格 | 热门课程卡片增加价格展示(如¥300/节) |
3.13 课程商城(课程列表)
| 模块 | 需求描述 |
| 分类筛选 | 横向Tab:全部、私教课、团课、瑜伽、搏击、康复 |
| 搜索 | 支持按课程名称搜索 |
| 课程卡片 | 展示课程图片、名称、专长标签、教练信息、时长、价格,右侧"立即购买"按钮 |
| 购买跳转 | 点击"立即购买"进入课程购买页面 |
3.14 课程购买
| 模块 | 需求描述 |
| 课程信息 | 顶部展示课程名称、专长标签、教练、评分、销量 |
| 套餐选择 | 单节体验/10节套餐(推荐)/20节套餐,显示原价和优惠价,选中态橙色边框 |
| 教练选择 | 横向滚动教练头像列表,支持切换教练 |
| 优惠券 | 展示可用优惠券数量,点击展开优惠券选择 |
| 支付 | 底部固定合计金额 + "立即支付"按钮 |
3.15 会员卡列表/购买
| 模块 | 需求描述 |
| 当前会员卡 | 顶部橙色渐变卡片展示当前使用中的会员卡信息(名称、等级、卡号、有效期) |
| 购卡列表 | 展示可选会员卡:月卡(¥199)、季卡(¥499,推荐)、年卡(¥1,688),含原价/优惠价对比 |
| 权益对比 | 每张卡下方标签展示包含权益(入场次数、团课、私教、设施等) |
| 购买按钮 | 底部固定"立即购买"按钮,价格跟随选中卡类型动态变化 |
3.16 会员卡购买(确认订单)
| 模块 | 需求描述 |
| 商品信息 | 展示购买的会员卡类型、描述、价格 |
| 订单信息 | 适用门店、有效期、开始日期(可选) |
| 优惠券 | 展示已选优惠券优惠金额 |
| 支付方式 | 微信支付/支付宝/余额支付,单选切换 |
| 协议确认 | 需勾选同意《会员卡购买协议》和《人脸识别隐私协议》 |
| 确认支付 | 底部显示实付金额(原价-优惠券)+ "确认支付"按钮 |
3.17 我的订单
| 模块 | 需求描述 |
| 订单Tab | 4个Tab:全部/待使用/已完成/退款,选中态橙色下划线 |
| 订单卡片 | 展示订单号、状态标签、商品图、名称、描述、规格、金额、下单时间 |
| 待使用 | 操作按钮:"立即使用"(会员卡)/"去预约"(课程)/"申请退款" |
| 已完成 | 操作按钮:"再次购买"/"评价" |
| 已退款 | 显示原价删除线 + "已退款"标签,操作:"再次购买" |
| 订单类型 | 区分三种订单图标:会员卡(橙色)、课程(紫色)、团购(青色) |
3.18 团购核销(美团/抖音)
| 模块 | 需求描述 |
| 平台入口 | 顶部展示美团、抖音两个平台图标,直观区分核销来源 |
| 输入券码 | 手动输入团购券码,点击"立即核销"完成核销 |
| 扫码核销 | 调用摄像头扫描团购二维码/条形码自动核销 |
| 核销记录 | 列表展示历史核销记录:来源平台标签、券名、券码、状态(待核销/已核销/已过期)、购买/核销时间 |
| 多次核销 | 支持多次使用的团购券(如3次卡),显示已用/总次数 |
3.19 人脸录入
| 模块 | 需求描述 |
| 隐私协议 | 强制展示人脸识别隐私协议弹窗,用户必须阅读并勾选同意后才能继续。协议内容涵盖信息收集、存储安全、用户权利、保留期限 |
| 人脸预览 | 圆形人脸框预览区域,未录入时显示虚线框+人脸图标,录入成功后变绿色实线+勾选 |
| 录入提示 | 展示录入注意事项:光线充足、正面、无遮挡、耗时5-10秒、加密存储 |
| 开始录入 | 点击"开始录入"调用摄像头进行人脸采集,采集过程约2秒动画反馈 |
| 录入成功 | 成功后展示绿色勾选图标、录入时间,按钮变为"重新录入" |
| 跳过 | 支持"稍后再说"跳过,后续可从会员中心菜单再次进入 |
3.20 会员卡激活
| 模块 | 需求描述 |
| 前置条件 | 用户已注册(手机号授权),已完成会员卡购买且订单状态为"待使用"。点击订单列表中的"立即激活"按钮进入激活流程 |
| 步骤条引导 | 顶部3步骤引导条:完善资料 → 确认协议 → 激活成功,已完成步骤变绿色勾选,当前步骤橙色高亮 |
| 订单信息展示 | 展示购买的会员卡信息卡片:卡类型、描述、价格、适用门店(橙色渐变卡片) |
| 完善个人资料 | 必填项:姓名(文本输入,最大20字)、性别(男/女单选按钮)。注册时仅授权了手机号,激活时需补充真实身份信息 |
| 有效期预览 | 实时计算并展示激活时间和到期时间。激活时间为当天日期,到期时间根据卡类型自动计算(月卡+30天,季卡+90天,年卡+365天) |
| 开卡须知协议 | 展示《会员开卡须知》完整内容,包含:会员卡类型及权益、激活与有效期规则、使用规则、退卡退款政策、安全隐私条款、其他说明。用户必须勾选同意后才能激活 |
| 确认激活信息 | 在协议下方汇总展示所有激活信息:会员姓名、性别、手机号、卡类型、门店、激活时间、到期时间,供用户最终确认 |
| 激活成功 | 激活后弹出成功弹窗,展示:会员姓名、卡类型、卡号(系统自动生成)、激活时间、到期时间。底部"查看我的会员卡"按钮跳转会员卡页面 |
| 数据更新 | 激活成功后:① 订单状态变更为"已完成" ② 创建会员卡记录(含卡号、有效期) ③ 用户会员等级更新 ④ 会员信息中补全姓名和性别 |
3.21 私教课激活
| 模块 | 需求描述 |
| 前置条件 | 用户已购买私教课且订单状态为"待使用"。点击订单列表中的"立即激活"按钮进入。用户必须已持有有效的会员卡,否则提示先激活会员卡 |
| 会员信息展示 | 顶部展示已绑定的会员信息(橙色渐变卡片):头像、姓名、会员等级标签、手机号(脱敏)、会员卡号、有效期。状态标签显示已验证 |
| 课程信息展示 | 展示购买的课程信息(紫色渐变卡片):课程名称、教练姓名及专长、订单号 |
| 激活确认详情 | 展示激活明细:课程套餐(如10节套餐)、订单金额、教练及评分、适用门店 |
| 课程数展示 | 大字号突出显示激活的课程数量(如"10节课"),附带有效期天数、单节时长、课程类型等详细信息 |
| 时间展示 | 并排展示激活时间和到期时间。激活时间为当天,到期时间根据课程套餐有效期自动计算(如10节套餐有效期90天) |
| 温馨提示 | 展示课程使用注意事项:①有效期内完成预约 ②提前预约及取消规则 ③教练绑定规则 ④过期作废说明 |
| 激活成功 | 激活后弹出成功弹窗(紫色主题),展示:会员姓名、课程名、教练、课程数(紫色高亮)、有效期范围。底部"立即预约课程"按钮跳转预约页面 |
| 数据更新 | 激活成功后:① 订单状态变更为"已完成" ② 创建私教课记录(含剩余课时、有效期) ③ 课程绑定到指定教练 ④ 用户"剩余课程"数据更新 |
4非功能性需求
| 维度 | 要求 |
| 性能 | 页面首屏加载 < 2秒,接口响应 < 500ms |
| 兼容性 | iOS 13+、Android 8+,主流屏幕适配(375px - 428px) |
| 安全 | 用户数据加密存储,API接口HTTPS传输,敏感信息脱敏显示 |
| 可用性 | 99.9% 系统可用性,支持灰度发布和快速回滚 |
| 设计规范 | 主色 #FF6B00,卡片圆角 12px,底部Tab栏固定,遵循iOS/Android设计规范 |
5核心数据模型
| 实体 | 关键字段 |
| 会员 | 姓名、手机号、性别、生日、会员类型、余额、积分、开卡日期、到期日期、所属门店、人脸特征ID |
| 会员卡 | 卡号、卡类型(月卡/季卡/年卡)、状态、有效期、余额、权益列表 |
| 教练 | 姓名、性别、专长标签、评分、教龄、已授课数、资质认证、个人简介、所属门店 |
| 课程 | 课程名称、课程类型、教练、时长、价格、容纳人数、套餐选项 |
| 预约记录 | 会员、教练、课程类型、预约日期、时段、状态(待上课/已完成/已取消)、评分 |
| 门店 | 名称、地址、经纬度、营业时间、联系电话、设施列表、评分 |
| 订单 | 订单号、用户、商品类型(会员卡/课程/团购)、商品ID、金额、优惠券、支付方式、状态(待使用/已完成/退款)、创建时间 |
| 团购券 | 券码、来源平台(美团/抖音)、商品名、总次数/已用次数、状态(待核销/已核销/已过期)、购买时间、有效期 |
| 人脸特征 | 会员ID、特征向量(加密)、录入时间、状态 |
6核心交互流程
6.1 课程预约流程
选择教练
→
选择日期
→
选择时段
→
选择课程类型
→
确认预约
6.2 签到流程
点击扫码签到
→
调用摄像头扫码
→
验证会员身份
→
签到成功
6.3 会员二维码签到流程
进入会员中心
→
点击会员二维码
→
出示二维码
→
前台扫码核销
→
签到成功
6.4 课程购买流程(新增)
浏览课程商城
→
选择课程
→
选择套餐
→
选择教练
→
使用优惠券
→
支付完成
6.5 会员卡购买流程(新增)
选择卡类型
→
确认订单
→
选择支付方式
→
同意协议
→
支付完成
6.6 人脸录入流程(新增)
进入人脸录入
→
展示隐私协议
→
用户同意协议
→
调用摄像头
→
采集人脸
→
录入成功
6.7 团购核销流程(新增)
进入团购核销
→
输入券码/扫码
→
验证券码有效性
→
核销成功
6.8 会员卡激活流程(新增)
订单列表点击"立即激活"
→
填写姓名+选择性别
→
确认开卡须知协议
→
确认激活信息
→
激活成功
| 关键规则 | 说明 |
| 注册信息补全 | 用户注册时仅授权手机号,激活会员卡时强制要求补全姓名和性别 |
| 有效期计算 | 激活当天为起始日,到期日 = 激活日 + 卡类型天数(月卡30/季卡90/年卡365) |
| 协议确认 | 必须勾选同意《会员开卡须知》后才能激活,协议包含退卡退款等关键条款 |
| 激活后状态 | 订单变为"已完成",同时生成会员卡记录和会员卡号 |
| 退卡规则 | 激活后7天内可退款(扣除已使用天数费用),超过7天不可退款 |
6.9 私教课激活流程(新增)
订单列表点击"立即激活"
→
验证会员卡有效性
→
展示会员+课程信息
→
确认激活时间和课程数
→
激活成功
| 关键规则 | 说明 |
| 会员卡校验 | 激活私教课前必须先拥有有效的会员卡,无会员卡时引导先激活会员卡 |
| 信息展示 | 自动读取并展示已绑定的会员信息(姓名、卡号、有效期),供用户确认 |
| 课程数确认 | 大字号突出显示购买的课程数量,明确有效期范围 |
| 教练绑定 | 激活时绑定购买时选择的教练,后续更换需联系前台 |
| 过期规则 | 有效期内未上完的课程自动作废,不予退款 |
7版本规划
| 版本 | 功能范围 | 优先级 |
| v1.0 | 首页、会员中心、场馆浏览、教练列表、课程预约、私教记录 | P0 |
| v2.0 | 一键登录、课程商城与购买、会员卡购买、人脸录入、团购核销(美团/抖音)、订单管理 | P0 |
| v2.1 | 扫码签到、消息推送、意见反馈、社交分享 | P1 |
| v3.0 | 训练数据分析、AI教练推荐、社区功能、积分商城 | P2 |
8多场馆微信支付架构
8.1 方案选型:微信支付服务商模式
本项目采用微信支付服务商模式(API v3),实现"一套小程序 + 多场馆独立收款"的核心需求。该方案的优势:
| 对比维度 | 服务商模式(已选) | 普通商户模式 |
| 小程序数量 | 仅需 1个小程序,通过 sub_mchid 区分收款方 | 每个场馆需单独注册小程序,维护成本高 |
| 资金流向 | 用户付款 → 直达子商户账户(场馆),不经平台 | 收款到单一商户号,需手动分账或转账 |
| 商户入驻 | 平台代入驻,场馆无需自行对接微信支付 | 每个场馆自行申请商户号,审核周期长 |
| 手续费 | 平台可自定义抽佣比例,微信按子商户分别计费 | 统一费率,无法差异化 |
| 结算周期 | T+1 自动结算到各场馆对公账户 | T+1 结算到单一账户 |
8.2 核心架构
┌─────────────────────┐
│ 微信小程序 (1个) │ ← 服务商的 AppID(sp_appid)
│ FITCARD 健身卡 │
└──────────┬──────────┘
│ 下单请求(携带 store_id)
┌──────────▼──────────┐
│ 后端服务 (1套) │ ← 根据 store_id 查询对应的 sub_mchid
│ payment-service │
└──────────┬──────────┘
│ 调用微信支付 API(JSAPI)
┌──────────▼──────────┐
│ 服务商商户号 │ ← sp_mchid(仅发起支付,不收款)
│ (父商户号) │
└──────────┬──────────┘
│
┌──────┴──────┬───────────┬───────────┐
▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│子商户A │ │子商户B │ │子商户C │ │子商户D │
│北京旗舰店│ │上海国贸店│ │深圳南山店│ │杭州西湖店│
│sub_mchid│ │sub_mchid│ │sub_mchid│ │sub_mchid│
└────────┘ └────────┘ └────────┘ └────────┘
▲ ▲ ▲ ▲
└─────────────┴───────────┴───────────┘
资金直达各场馆账户,不经平台
8.3 关键配置参数
| 参数 | 说明 | 示例 |
| sp_appid | 服务商关联的小程序 AppID(全局唯一) | wx1234567890abcdef |
| sp_mchid | 服务商商户号(父商户号,仅发起支付) | 1234567890 |
| sub_appid | 子商户关联的小程序 AppID(与服务商相同,因共用 1 个小程序) | wx1234567890abcdef |
| sub_mchid | 子商户号(每个场馆一个,实际收款账户) | 门店A: 100001 / 门店B: 100002 |
| sp_api_key | 服务商 API v3 密钥,用于签名和验签 | 服务端安全存储 |
| serial_no | 服务商 API 证书序列号 | 用于请求头签名 |
8.4 数据库设计
| 表 | 字段 | 说明 |
| stores(场馆表) | store_id | 场馆唯一标识(主键) |
| store_name | 场馆名称,如"北京旗舰店" |
| sub_mchid | 该场馆对应的微信支付子商户号 |
| sub_mchid_status | 子商户状态:PENDING(审核中)/ ACTIVE(已激活)/ FROZEN(冻结) |
| commission_rate | 平台抽佣比例(万分之几),如 50 = 0.5% |
| orders(订单表) | order_id | 订单号(唯一) |
| store_id | 订单归属场馆 |
| sub_mchid | 实际收款的子商户号(冗余存储,防止场馆变更) |
| transaction_id | 微信支付流水号(支付成功后回填) |
| pay_status | 支付状态:UNPAID / PAID / REFUNDED / CLOSED |
8.5 支付流程
8.5.1 统一下单流程
用户选择商品
→
携带 store_id 请求后端
→
查询 sub_mchid
→
创建订单记录
→
调用 JSAPI 下单
| 步骤 | 操作 | 说明 |
| 1 | 用户在小程序选择商品并下单 | 前端将 store_id(当前场馆)+ 商品信息 + 金额发送至后端 |
| 2 | 后端查询场馆对应的子商户号 | SELECT sub_mchid FROM stores WHERE store_id = ? AND sub_mchid_status = 'ACTIVE' |
| 3 | 后端创建本地订单 | 生成 order_id,记录 store_id、sub_mchid、金额、商品信息,状态设为 UNPAID |
| 4 | 调用微信 JSAPI 统一下单 | POST /v3/pay/partner/transactions/native 请求参数中携带 sp_appid、sp_mchid、sub_appid、sub_mchid |
| 5 | 返回 prepay_id 给前端 | 后端签名后返回支付参数,前端调用 wx.requestPayment 唤起支付 |
| 6 | 用户完成支付 | 资金从用户账户 → 直达 sub_mchid(场馆账户),不经过服务商 |
| 7 | 接收支付结果通知 | 微信回调后端 notify_url,后端验签后更新订单状态为 PAID |
| 8 | 前端查询支付结果 | 轮询后端接口确认支付状态,展示支付成功页面 |
8.5.2 关键 API 调用(JSAPI 统一下单)
POST https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi
Content-Type: application/json
Authorization: WECHATPAY2-SHA256-RSA2048 ...
{
"sp_appid": "wx1234567890abcdef", // 服务商小程序 AppID
"sp_mchid": "1234567890", // 服务商商户号
"sub_appid": "wx1234567890abcdef", // 子商户 AppID(共用小程序)
"sub_mchid": "100001", // ← 核心:根据 store_id 动态切换
"description": "季卡会员 - 北京旗舰店",
"out_trade_no": "ORDER20260415001",
"notify_url": "https://api.fitcard.com/pay/notify",
"amount": {
"total": 49900, // 单位:分(¥499.00)
"currency": "CNY"
},
"payer": {
"sp_openid": "oXXXX..." // 用户在服务商小程序下的 openid
}
}
8.6 回调通知处理
| 步骤 | 操作 | 说明 |
| 1 | 接收微信回调 | POST 请求到 notify_url,请求体为 AES-256-GCM 加密的 JSON |
| 2 | 解密并验签 | 使用 API v3 密钥解密,验证签名防止伪造通知 |
| 3 | 幂等校验 | 通过 out_trade_no 查询订单,若已处理则直接返回成功(防止重复通知) |
| 4 | 更新订单状态 | 更新为 PAID,记录 transaction_id、支付时间 |
| 5 | 触发业务逻辑 | 激活会员卡 / 发放课程 / 发送支付成功消息 |
| 6 | 返回成功响应 | HTTP 200 + {"code":"SUCCESS","message":"成功"},否则微信会重试 |
8.7 退款流程
用户申请退款
→
后端校验退款条件
→
调用退款 API
→
资金原路退回
| 项目 | 说明 |
| 退款 API | POST /v3/refund/domestic/refunds,需携带 sp_mchid + sub_mchid |
| 资金来源 | 从子商户(场馆)账户扣除,退回用户微信账户 |
| 部分退款 | 支持,通过 amount.refund 指定退款金额(≤ 订单金额) |
| 退款通知 | 退款成功后微信异步通知,后端更新订单状态为 REFUNDED |
| 退款时效 | 1-3 个工作日到账,微信会发送退款到账消息给用户 |
8.8 场馆(子商户)入驻流程
场馆提交资料
→
平台代为申请入驻
→
微信审核(1-5天)
→
审核通过
→
生成 sub_mchid
| 入驻资料 | 说明 |
| 营业执照 | 场馆运营主体的营业执照照片 |
| 法人身份证 | 正反面照片 |
| 对公账户 | 场馆名称一致的对公银行账户信息(开户行、账号) |
| 联系人信息 | 超级管理员的姓名、手机号、邮箱 |
| 商户简称 | 用户支付时看到的商户名,如"FITCARD·北京旗舰店" |
8.9 安全与风控
| 安全项 | 实现方案 |
| 通信安全 | 全部使用 HTTPS,API v3 基于 SHA256-RSA2048 签名验签 |
| 密钥管理 | API v3 密钥、商户私钥均存储在服务端环境变量或 KMS 中,禁止硬编码 |
| 回调验签 | 必须验证回调签名(Wechatpay-Timestamp + Wechatpay-Nonce + Body),防止伪造通知 |
| 幂等处理 | 所有支付/退款回调必须做幂等校验,通过 out_trade_no 去重 |
| 金额校验 | 回调中的金额必须与本地订单金额一致,防止金额篡改 |
| 订单超时 | 下单时设置 time_expire(建议 30 分钟),超时未支付自动关闭订单 |
| 防重复支付 | 同一 order_id 只允许一次成功支付,支付前检查订单状态 |
8.10 对账与结算
| 项目 | 说明 |
| 自动结算 | 微信 T+1 自动将子商户交易款结算到场馆对公账户,平台无需干预 |
| 平台抽佣 | 通过微信支付的"分账"功能实现:支付成功后按 commission_rate 将佣金分到服务商账户 |
| 对账方式 | 每日调用 /v3/bill/tradebill 下载当日交易账单,与本地订单数据核对 |
| 对账字段 | out_trade_no(订单号)+ transaction_id(微信流水号)+ total_fee(金额)+ trade_state(状态) |
| 差异处理 | 自动对账发现差异时生成告警,运营人工核实 |
8.11 后端接口设计
| 接口 | 方法 | 说明 |
| /api/pay/create | POST | 创建支付订单。入参:store_id, goods_type, goods_id, amount;返回:prepay_id 签名参数 |
| /api/pay/notify | POST | 微信支付回调。验签 → 解密 → 幂等校验 → 更新订单 → 返回 SUCCESS |
| /api/pay/query/{order_id} | GET | 前端主动查询支付状态,兜底回调未到的场景 |
| /api/refund/create | POST | 申请退款。入参:order_id, refund_amount, refund_reason |
| /api/refund/notify | POST | 退款回调通知。验签后更新订单状态为 REFUNDED |
| /api/store/bind-sub-mchid | POST | 场馆入驻审核通过后,绑定 sub_mchid 到 store_id(运营后台调用) |
8.12 异常场景处理
| 异常场景 | 处理方案 |
| 子商户未激活(sub_mchid_status ≠ ACTIVE) | 前端提示"该场馆暂不支持在线支付",引导到店办理 |
| 支付超时(30分钟未支付) | 后端定时任务扫描超时订单,调用关单接口关闭后标记 CLOSED |
| 回调未收到 | 前端轮询 /api/pay/query 兜底查询,后端在 T+1 对账时补单 |
| 用户切换场馆后支付 | 每次下单时从当前 store_id 动态获取 sub_mchid,不缓存 |
| 同一用户多场馆有会员卡 | 会员卡绑定 store_id,购买时使用对应场馆的 sub_mchid 收款 |
| 网络异常导致重复下单 | 前端做防重复提交(按钮 loading 态 + 请求去重),后端做幂等校验 |
9美团/抖音团购核销接入
9.1 美团团购核销 — 开通申请流程
美团团购核销接入需通过美团技术服务合作中心完成,分为服务商和自研品牌商两种身份。
| 身份类型 | 适用对象 | 特点 |
| 三方服务商 | SaaS公司、软件开发商 | 需缴纳保证金,可服务多品牌 |
| 自研品牌商 | 连锁品牌自有研发团队 | 仅限自有品牌门店使用 |
第一步:官网注册
- 访问 美团技术服务合作中心(developer.meituan.com)
- 点击「注册」,选择对应身份类型(服务商 / 自研品牌商)
第二步:提交资质材料
| 材料类型 | 具体要求 |
| 基本资质 | 营业执照、法人身份证、申请人手持身份证照片 |
| 安全资质(上线必需) | 二级等保备案证明 或 网络信息安全险 + Web应用防火墙 |
| 软件著作权 | 自研品牌商必须提供,服务商可选 |
| 承诺书 | 《服务商数据交互合规化承诺书》 |
第三步:审核与签约
- 运营审核(通常 1-2 个工作日)
- 法人/授权人短信实名认证
- 签订电子合同
- 缴纳保证金(服务商需缴纳,金额根据业务评估自动生成)
第四步:获取开发者凭证
审核通过后,在控制台获取 developerId 和 SignKey,用于后续 API 调用签名。
9.2 美团团购核销 — 技术对接流程
商户授权绑定
→
查询可用团购
→
用户出示券码
→
调用核销接口
→
核销完成
| 接口功能 | 接口路径 | 说明 |
| 获取授权链接 | /api/groupBuy/getScopeUrl | 引导商户授权门店绑定 |
| 查询团购券 | 适用门店查询接口 | 获取门店可用团购套餐 |
| 核销验券 | /partner/tuangou/receipt/consume | 传入券码完成核销 |
| 撤销核销 | 对应撤销接口 | 核销后 1 小时内可撤销 |
| 重要提示 | 说明 |
| 接口版本 | 原北极星开放平台已下架,新对接需使用美团技术服务合作中心新接口 |
| 券码安全 | 券码已加密,建议不要展示给用户,直接调用接口核销 |
| 批量核销 | 最多支持单次 50 张券 |
| 撤销时效 | 核销后 1 小时内可撤销,超时不可撤销 |
9.3 抖音团购核销 — 开通申请流程
抖音团购核销接入需通过抖音开放平台完成,创建生活服务商家应用。
第一步:前置准备
- 入驻 抖音来客(life.douyin.com),获取来客账户 ID
第二步:创建应用
- 访问抖音开放平台(open.douyin.com)
- 注册并认证「生活服务商家应用代开发」能力
- 平台审核周期约 10 个工作日
第三步:对公认证
第四步:申请接口权限
| 权限名称 | permission_key | 用途 |
| 门店管理 | - | 同步门店信息 |
| 商品查询 | - | 查询团购商品 |
| 团购核销 | 12 | 核心核销验券能力 |
| 团购核销对账 | - | 财务对账 |
9.4 抖音团购核销 — 技术对接流程
获取 Client Token
→
商家授权
→
验券准备接口
→
确认核销接口
→
核销完成
关键接口调用
1. 获取 Access Token
GET https://open.douyin.com/oauth/client_token/
?grant_type=client_credential
&client_key={APPID}
&client_secret={APP_SECRET}
2. 验券准备(查询券状态)
- 从用户出示的二维码 URL 中提取 encrypted_data 参数
- URL 格式:
https://developer.toutiao.com/api/apps/trade/v2/share?encrypted_data=xxx
3. 确认核销
- 调用核销接口完成验券,接口需确保幂等性设计,避免重复核销
| 重要提示 | 说明 |
| 权限要求 | 必须获得商家授权 permission_key=12(团购核销权限) |
| 二维码数据 | encrypted_data 是加密字符串,只需提取参数值,不要感知 URL 其他部分 |
| 常见错误码 | 参数错误(10000)、系统错误(13000)、二维码失效 |
9.5 集成方案对比
| 维度 | 美团团购核销 | 抖音团购核销 |
| 入驻门槛 | 高(需等保/防火墙) | 中等(需对公认证) |
| 审核周期 | 1-2 个工作日 | 约 10 个工作日 |
| 保证金 | 服务商需缴纳 | 无 |
| 接口权限 | 需申请开通 | 需单独申请 permission_key=12 |
| 核销方式 | 输入券码 / 扫码 | 扫码提取加密数据 |
| 撤销机制 | 支持 1 小时内撤销 | 需查看具体接口文档 |
| 数据同步 | 支持查询团购套餐映射 | 支持门店/商品同步 |
9.6 小程序统一核销架构
建议采用统一核销网关设计,将美团和抖音的核销差异封装在后端,前端保持统一体验:
┌─────────────────────┐
│ 微信小程序 │
│ (核销入口页面) │ ← 统一 UI,用户无需感知平台差异
└──────────┬──────────┘
│ 券码/扫码数据
┌──────────▼──────────┐
│ 核销网关服务 │ ← 自动识别券码类型,路由到对应平台
│ (统一后端服务) │
└──────────┬──────────┘
│
┌──────┴──────┬──────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│美团API │ │抖音API │ │其他平台│ ← 可扩展接入更多团购平台
└───────┘ └───────┘ └───────┘
核心功能模块
| 模块 | 功能说明 |
| 券码识别 | 自动识别美团券码(纯数字)vs 抖音二维码(加密 URL) |
| 渠道路由 | 根据券码格式自动路由到对应平台 API |
| 状态管理 | 查询券状态:未使用 / 已使用 / 已过期 / 已退款 |
| 核销确认 | 展示券详情后二次确认,避免误操作 |
| 撤销功能 | 支持异常时撤销核销(美团 1 小时内) |
| 对账同步 | 每日同步核销记录用于财务对账 |
9.7 注意事项
美团侧
- 必须完成二级等保和防火墙采购才能上线(硬性要求)
- 建议通过第三方服务商接口降低接入成本(如已有服务商资质)
- 批量核销注意单次上限 50 张
抖音侧
- 需先入驻抖音来客,再创建开放平台应用(顺序不可颠倒)
- 苹果开发者账号必须注册,否则 iOS 用户无法看到核销入口
- 小程序内不允许上线外卖/配送能力,仅限到店核销
通用建议
- 两个平台核销流程差异较大,建议抽象统一核销模型(输入 → 查询 → 确认 → 结果)
- 务必做好幂等性控制,防止网络重试导致重复核销
- 建议先接入沙箱环境测试,再申请正式权限
- 核销记录需持久化存储,支持后续对账和争议处理
参考文档
- 美团技术服务合作中心:developer.meituan.com
- 抖音开放平台:open.douyin.com/platform/doc
- 抖音来客:life.douyin.com