在郑州做本地服务小程序的时候,我最早是被线下割裂的问题刺痛到:用户在小程序下单、技师在店里接单、退款和核销却走两套流程,数据不同步、体验也崩了。于是我们把目标定成“线上下单——线下履约——闭环结算”,不是口号,而是要把每一步的数据链路都做死、做可追溯。
技术栈选得务实:小程序前端用原生框架配 TypeScript,后台用 Node.js + Koa,数据库主库 MySQL,缓存与分布式锁用 Redis。实时通道选 WebSocket(长连接)以降低心跳延迟,重要消息走双写:WebSocket 推送 + Redis 消息队列持久化,避免短暂断连丢单。地图能力用高德 SDK 获取逆地理,门店围栏基于经纬度矩形与点-in-polygon 校验,地理搜索加上 Redis geospatial 索引能把响应时间从几百毫秒压到几十毫秒。
线下工作人员常常处于弱网环境,经验告诉我:离线优先不能靠浏览器缓存幻想。实现方式是操作日志(append-only)+本地队列,用 wx.setStorageSync 存写前日志,生成客户端临时 UUID(例如 order_local_XXX),上行时服务端做幂等处理并返回全局 ID。冲突分两类:时间戳可解的常规冲突采用 last-write-wins,复杂冲突交由人工回溯任务触发补偿流程。断线重连用指数退避与抖动,心跳携带未确认序列号用于快速补传。
支付与核销环节不能有模糊地带:集成微信支付走统一下单接口,服务端生成签名、nonce_str,并在回调处做幂等性校验。线下核销常用动态小程序码(wxacode.getUnlimited),门店扫码时结合 POS 或蓝牙打印机,通过小程序蓝牙 API 与打印机交互。调试这类硬件联调时,我常用 WeChat DevTools 的真机调试加 Charles 报文抓包,定位证书链与回调 URL 的问题最有效。
工程化方面,CI 用 miniprogram-ci 在 GitLab/Actions 上自动构建并上传体验版;测试用 miniprogram-simulate 做单元,miniprogram-automator 做 e2e。异常上报引入 Bugly,关键路径埋点发到 Prometheus 或腾讯云监控,线上故障能迅速回溯到某次接口改动。我学到的一条硬经验是:先把可观测性做足,出问题时回放日志比凭感觉改代码要靠谱许多。
对郑州这样的城市场景,我的建议是:先把闭环里最容易出错的边界做简单而稳健的策略(离线队列、幂等接口、明确的补偿流程),再根据业务复杂度考虑更先进的同步算法(例如 CRDT)——那东西有用但容易引入更多调试成本。把监控、重试与人工干预路径设计好,才能在真实运行中逐步优化;这也是我在多个落地项目中反复验证的路径。
咨询在线QQ客服