架构 · 小程序

小程序 + 管理后台 + API 的典型架构怎么设计?

一个可运营的小程序项目,通常不只是小程序前端,还需要管理后台、统一 API、数据库、消息通知、支付和权限体系。

很多人以为做小程序就是做几个页面。真实项目里,小程序只是客户使用入口,背后还需要运营人员管理商品、订单、预约、客户、内容和数据。更稳的架构是小程序、后台和 API 分层设计。

典型架构链路

  1. 微信小程序端
  2. 管理后台 Web
  3. 统一 REST / JSON API
  4. 认证授权与业务服务
  5. MySQL / PostgreSQL / SQLite
  6. 微信支付 / 订阅消息 / 短信

小程序端:只做用户触点和轻交互

小程序负责登录、浏览、提交、支付、预约、查看进度等动作。它应该调用后端 API 获取数据,而不是把业务规则写在前端。

管理后台:决定项目能不能持续运营

后台用于管理内容、订单、库存、预约、客户、员工和统计数据。没有后台的小程序,后期每次改内容都要找开发,运营成本会很高。

API 设计:前端和后台共用业务能力

小程序和后台可以共用用户、订单、商品、预约等核心 API,只是在权限和数据范围上不同。接口要有稳定的错误码、分页、筛选和幂等处理。

登录与权限:微信身份不等于业务身份

微信 openid 只是用户身份的一部分。系统还需要区分普通用户、会员、员工、管理员、门店、渠道等业务角色。

支付和消息:要处理异步回调

微信支付、订阅消息、退款、订单关闭都涉及异步回调。后端要校验签名、处理重复通知,并记录状态变更日志。

数据和报表:从第一版就要设计可统计字段

预约来源、订单状态、客户转化、退款原因、员工处理时长等字段,会直接影响后续运营分析。

脱敏项目复盘:预约小程序、运营后台与统一接口

预约业务看起来只是选时间、填信息、付款,真实项目却涉及门店容量、服务人员排班、优惠、支付回调、取消退款和消息通知。若小程序和后台各自实现一套规则,很快会出现前端显示可约、后台却已满,或付款成功但订单仍未确认。

业务与产品形态

我们把预约定义为待确认、待支付、已确认、已完成、已取消等状态,并明确每一步的超时和退款规则。用户端完成查询、占位、支付和改期;门店端处理到店与异常;总部后台配置服务、容量和门店权限;移动工作台提供当天任务,不要求员工在手机上操作完整后台。

技术解决方案

所有端共用一套业务 API,容量计算和订单状态只在服务端实现。用户选择时间后创建有过期时间的容量锁,支付成功在事务内确认预约并释放临时占位;支付回调按平台单号和内部单号幂等,超时任务由队列扫描补偿。用户身份、员工身份和门店数据域分开建模,消息通知订阅订单事件而不是散落在接口代码中。

难点设计

高峰期并发抢同一时段、支付回调延迟或重复、用户在多个版本小程序中操作,都会破坏状态一致性。容量扣减使用原子条件更新,回调先验证签名与金额,再判断当前状态;接口保持向后兼容,废弃字段经过版本窗口后再清理。取消与退款拆成两个状态,退款失败可以重试,不把业务订单错误地回退。

用户体验

用户只看到真实可约时间,锁定后显示剩余支付时间;支付失败保留已选项目和联系人,改期先确认新时段再释放旧时段。后台列表围绕待确认、即将到店和异常退款组织,批量操作显示影响数量。每个状态都用用户能理解的语言解释下一步。

产品效果与验收

验收要模拟并发占位、重复支付回调、锁过期、退款失败和门店停业。运营指标包括预约转化率、支付成功率、容量锁过期率、到店率、改期率、退款处理时间和人工改单量。技术指标与业务指标一起看,才能判断统一接口是否真正减少了冲突和运营成本。

工程现场:一条预约或订单链路怎么守住

小程序只是入口,真正复杂的是后端同时面对用户点击、员工操作、支付回调、订阅消息和后台任务。我们会把预约或订单建成明确状态机,例如待确认、已确认、服务中、已完成、已取消,并限制每个角色能执行的转换。页面按钮只是状态机的表现,最终判断必须在后端。

微信身份不能直接等同于业务账号

openid 用于识别微信用户,但同一客户可能有多个联系方式,员工也可能同时属于不同门店。系统需要自己的用户、会员、员工、门店和角色模型,再把微信身份作为登录凭证绑定。敏感接口使用短期会话或令牌,后台管理员采用独立登录和更严格的权限策略,不能因为拿到 openid 就拥有业务权限。

支付回调必须幂等并以服务端结果为准

客户端显示支付成功不代表系统已确认收款。后端需要校验回调签名、商户号、金额和订单号,以支付流水号或订单号建立唯一约束。重复回调只返回成功,不重复改状态、发券或通知。退款同样记录申请、渠道流水和最终状态,并通过对账任务发现长时间未确认的异常交易。

消息通知是可失败的副作用

订单落库和消息发送不要放在一个长事务中。核心状态提交后写入待发送事件,由后台任务调用订阅消息、短信或企业微信;失败按规则重试并保留原因。模板缺失、用户未授权、第三方限流都不应该让订单创建失败,但后台必须能看到哪些通知没有送达。

发布要考虑多版本客户端并存

小程序审核和用户更新并非同时发生,接口需要兼容一段时间内的新旧客户端。新增字段尽量保持可选,状态枚举不要随意复用旧值,破坏性变更通过新接口版本过渡。上线前除了功能测试,还要验证弱网、重复点击、返回重进、支付中断和后台改状态等场景。

一笔预约从小程序到后台的完整技术链路

微信身份与业务账号要分开建模

登录接口用临时 code 换取平台标识,但 openid 不是业务主键。系统建立 user、external_identity 和 customer_profile 的映射,记录 appid、openid、unionid 与绑定时间;手机号变更或多个渠道合并时,订单仍归属同一个业务用户。服务端签发自己的短期会话,前端不保存平台密钥,也不把 openid 当成可随意传入的可信参数。

预约名额要在数据库里防止超卖

时间段表保存容量与版本,用户提交后先创建短时 reservation,再确认订单。扣减容量与写预约单放在同一事务,使用行锁、乐观锁或唯一约束保证并发下只成功一次。前端显示“还有一个名额”只是提示,最终判断必须在服务端完成;重复点击通过 client_request_id 返回第一次结果。

支付回调必须幂等并校验业务金额

回调入口先验签,再以渠道交易号和事件类型做唯一约束,核对商户号、订单号、币种与金额后才推进订单状态。状态迁移只能从待支付进入已支付,已取消订单收到迟到回调则进入人工或自动退款流程。接口先快速应答,通知、积分和报表通过 outbox 异步处理,避免渠道因超时反复推送。

后台操作和用户通知都要可追溯

改期、取消、核销和退款分别定义权限动作,并记录操作前后状态、操作人和原因。订阅消息写入通知任务表,按业务事件发送,失败可重试但不重复触达。API 变更采用兼容字段或版本策略,监控按订单号串联小程序请求、后台操作、支付回调和消息发送,客服才能快速解释一笔订单发生了什么。

落地前建议确认

  • 是否需要运营后台
  • 是否涉及支付、退款或消息通知
  • 是否有员工和管理员角色
  • 是否需要统计客户来源和订单状态
需要把架构落到你的业务里?

先描述你的业务场景、现有工具和数据流,我们帮你判断该从哪一层开始做。

快速描述您的需求