尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

社区服务小程序开发全攻略:跑腿、团购、家政一站式技术链路

社区服务小程序开发全攻略:跑腿、团购、家政一站式技术链路 社区服务类小程序是最近一段时间需求增长很快的方向。不管是跑腿代办、社区团购还是家政预约底层逻辑很相似用户下单、服务者接单、在线支付、上门履约。这篇文章就直接把一个社区服务小程序的完整技术链路拆开讲从功能规划到数据库设计从微信支付到地图选点从登录授权到上线审核每个环节都给可落地的方案和代码模板。如果你正准备开发一个“跑腿团购家政”方向的社区服务小程序或者已经开始了但卡在某个技术点上这篇可以直接对照着排查。先给结论社区服务小程序没有想象中复杂但也不是模板套一套就能上线的。最核心的部分是订单状态机和支付回调其次是地图选点和配送计价。只要能把这几个地方做明白小程序端反而相对简单。下面进入正题。1. 社区服务小程序核心能力速览在动手写代码之前先看清楚社区服务小程序到底需要哪些基础能力。下面的表格列出的每一项都会在正文中展开。能力项说明开发方式原生微信小程序或 uni-app两者选一个即可用户端微信小程序承担登录、浏览、下单、支付、订单跟踪服务端Java / Python / Node.js 任选提供 RESTful API管理后台Web 端用于商家/平台处理订单、商品、服务人员核心模块跑腿代办、社区团购、家政服务预约支付能力微信支付含下单、回调、退款、对账地图能力微信小程序地图组件 腾讯位置服务逆地址解析消息通知订阅消息用于订单状态变更通知用户定位能力wx.getLocationwx.chooseLocation获取用户位置数据存储MySQL / PostgreSQL订单和商品用关系型数据库比较稳妥上线资质企业主体 微信支付商户号 对应服务类目从技术角度来说社区服务小程序可以拆成“用户端小程序 服务端 API 管理后台”三部分。用户端负责体验和交互服务端负责业务逻辑和订单流转管理后台负责处理异常单、退款和财务对账。三部分缺一不可。2. 社区服务小程序功能模块规划很多人拿到需求第一反应是“我要先做首页”。这个顺序容易出问题。社区服务小程序本质上是交易系统正确做法是先梳理订单类型和状态流转再决定页面怎么设计。2.1 三类业务的公共模块跑腿、团购、家政虽然业务不同但有两个东西完全相同订单和支付。公共模块可以复用这也是社区服务小程序能做成一体的核心原因。公共模块包含用户注册与登录基于微信用户身份绑定手机号地址管理用户维护常用地址订单中心订单列表、订单详情、评价入口微信支付统一下单、支付回调、退款处理优惠券系统新用户券、满减券、配送费抵扣券售后服务用户发起退款、平台审核2.2 跑腿代办模块跑腿模块的特殊之处在于“抢单或派单”机制。用户发布跑腿需求后系统需要把订单推送给附近的服务者服务者接单后开始履约。跑腿订单的状态流转建议这样设计待支付 - 已支付待接单 - 已接单 - 取件中 - 配送中 - 已完成 - 已取消 - 退款中 - 已退款跑腿模块还需要额外功能发布需求时填写物品类型、重量、取件地址、送达地址配送费用估算按基础价里程价计算地图选点和距离计算服务者端接单大厅只显示附近的订单订单轨迹用户能看到服务者实时位置2.3 社区团购模块社区团购可以理解为“拼团自提/配送”。用户在小程序里下单平台汇总订单后统一采购再通过自提点或配送的方式履约。团购订单的状态建议待支付 - 已支付 - 成团中 - 已成团 - 已发货 - 待自提/配送中 - 已完成团购模块需要额外功能商品分类与商品详情购物车支持多商品合并下单自提点管理用户选择最近的自提点团长功能如果业务允许可以为团长配置佣金限购和库存管理避免超卖2.4 家政服务预约模块家政服务和前两个模块差别较大核心是“预约制”。用户选择服务类型后需要选择上门时间和服务人员然后支付预约单。家政订单的状态待支付 - 已支付待服务 - 服务中 - 已完成 - 用户取消 - 已取消 - 服务者取消 - 已取消家政模块需要额外功能服务项目如日常保洁、家电清洗、月嫂服务人员列表展示资历、评价和可预约时段日历选时可选的时间段由后台配置改期和取消规则需要后台配置提前多少小时可免费取消3. 社区服务小程序技术选型社区服务小程序不用追求特别花哨的技术栈重点是稳定、好维护、能快速上线。下面给一套比较稳妥的方案。3.1 小程序端选型小程序端有两个方向原生微信小程序和 uni-app。原生微信小程序的优点是调试方便、组件配合度最高遇到地图、支付、订阅消息这类能力时踩坑最少。缺点是代码只能在微信里运行以后如果想发支付宝小程序、抖音小程序需要重写。uni-app 的优点是跨端一套代码可以同时编译到微信小程序、支付宝小程序、H5。缺点是部分原生功能需要条件编译比如地图、定位在不同平台的实现不一样需要额外适配。如果业务重点就是微信生态建议直接用原生小程序开发效率反而更高。如果公司有跨端规划再考虑 uni-app。3.2 服务端选型服务端语言不限制Java、Python、Node.js 都能做。这里推荐基于以下两点来选团队哪个语言最熟就用哪个不要为了“新”而引入新的语言微信官方 SDK 是否完善比如 Go 语言的微信支付 SDK 就没有 Java 生态那么省心以 Python FastAPI 为例服务端代码结构可以参考community-service/ ├── app/ │ ├── api/ # 路由层处理 HTTP 请求 │ ├── models/ # 数据库模型 │ ├── schemas/ # 请求和响应数据结构 │ ├── services/ # 业务逻辑层 │ ├── core/ # 配置、依赖、工具函数 │ └── main.py # 服务入口 ├── tests/ # 单元测试和接口测试 ├── requirements.txt └── README.md4. 开发环境准备与小程序账号配置开发社区服务小程序之前需要先把环境、账号、工具准备齐全这一部分不做好后面会遇到很多莫名其妙的报错。4.1 前期准备清单微信小程序账号建议使用企业主体注册否则无法开通微信支付微信支付商户号需要企业资质与小程序账号关联微信开发者工具可以在微信公众平台官网下载稳定版一个公网可访问的 HTTPS 服务器用于部署后端 API已备案的域名用于配置 request 合法域名数据库本地开发可以用 MySQL线上建议使用云数据库4.2 小程序基本配置拿到小程序 AppID 后打开微信开发者工具创建项目然后在app.json中配置基础信息和页面路由。{ pages: [ pages/home/index, pages/order/list/index, pages/publish/index, pages/goods/list/index, pages/goods/detail/index, pages/user/index ], window: { navigationBarTitleText: 社区服务, navigationBarBackgroundColor: #ffffff, navigationBarTextStyle: black }, permission: { scope.userLocation: { desc: 您的位置信息将用于匹配附近的服务者与自提点 } }, requiredPrivateInfos: [ getLocation, chooseLocation ] }注意requiredPrivateInfos是微信较新版本的要求如果不配置真机上wx.getLocation和wx.chooseLocation可能调用失败。同时在小程序公众平台后台需要配置“隐私保护指引”否则也会影响接口调用。4.3 配置合法域名小程序不比普通网页request 请求的域名必须在公众平台后台配置且必须是 HTTPS。开发阶段可以勾选“不校验合法域名”但上线前必须配置完整。配置入口在小程序公众平台 - 开发管理 - 开发设置 - 服务器域名。需要配置以下两个request 合法域名https://api.your-domain.comuploadFile 合法域名https://api.your-domain.com5. 小程序端用户登录与手机号绑定社区服务小程序的核心交易流程依赖用户身份登录功能必须在一开始就解决。微信小程序登录现在的推荐方式是基于wx.login获取 code然后由后端调用微信接口换取 openid。用户手机号的获取需要使用企业主体小程序通过微信提供的手机号快速验证组件实现不再建议使用旧的getPhoneNumber按钮方式具体以当前微信官方文档为准。5.1 前端登录流程示例// utils/auth.js function login() { return new Promise((resolve, reject) { wx.login({ success(res) { if (res.code) { wx.request({ url: https://api.your-domain.com/api/auth/login, method: POST, data: { code: res.code }, success(response) { const { token } response.data.data wx.setStorageSync(token, token) resolve(response.data.data) }, fail: reject }) } else { reject(new Error(wx.login failed)) } }, fail: reject }) }) } module.exports { login }5.2 服务端登录接口示例后端拿到 code 后需要调用微信接口获取 openid。这里以 Python FastAPI 为例。import httpx from fastapi import APIRouter, HTTPException router APIRouter() router.post(/api/auth/login) async def login(data: dict): code data.get(code) appid your_appid secret your_appsecret url https://api.weixin.qq.com/sns/jscode2session params { appid: appid, secret: secret, js_code: code, grant_type: authorization_code } async with httpx.AsyncClient() as client: resp await client.get(url, paramsparams) result resp.json() if openid not in result: raise HTTPException(status_code401, detail登录失败) openid result[openid] # 检查用户是否存在不存在则创建 # 生成自己的 token 并返回 token generated_token_for_user return {code: 0, data: {token: token}}这个流程属于基础登录实际项目中还需要加 token 过期机制、用户信息缓存、手机号绑定判断等。手机号绑定尽量放到用户第一次下单前避免用户还没体验就打退堂鼓。6. 跑腿模块开发要点跑腿模块是社区服务小程序里最容易出效果的模块同时也是逻辑最复杂的模块之一。下面从发布需求、费用估算、订单推送三个环节来讲。6.1 用户发布跑腿需求前端需要收集的信息取件地址、送达地址、物品类型、物品重量、期望送达时间、备注。取件和送达地址建议都使用地图选点让用户不用手动输入文字。页面关键代码示意// pages/publish/index.js Page({ data: { startAddress: null, endAddress: null, goodsType: , weight: 1, remark: }, chooseStartAddress() { wx.chooseLocation({ success: (res) { this.setData({ startAddress: { name: res.name, address: res.address, latitude: res.latitude, longitude: res.longitude } }) this.calcFee() } }) }, chooseEndAddress() { wx.chooseLocation({ success: (res) { this.setData({ endAddress: { name: res.name, address: res.address, latitude: res.latitude, longitude: res.longitude } }) this.calcFee() } }) }, calcFee() { // 需要调用后端接口计算配送费 // 参数startAddress、endAddress、weight、goodsType } })注意wx.chooseLocation需要在用户授权位置权限后才能使用并且需要在app.json的requiredPrivateInfos中声明。如果用户拒绝授权需要在页面中引导用户去设置页开启位置权限。6.2 配送费用估算配送费用不能写死在前端一定要由后端计算。原因有两个一是避免用户篡改参数二是平台可以随时调整计价规则。后端计价接口可以设计成{ start_latitude: 30.123, start_longitude: 120.456, end_latitude: 30.456, end_longitude: 120.789, weight: 2.5, goods_type: food }服务端计算距离后按照计价规则得出费用。建议计价规则简化一点比如基础价 5 元超过 3 公里每公里加 2 元重量超过 5 公斤加收 3 元。规则越简单用户越好理解客服压力也越小。6.3 订单推送与接单大厅跑腿订单推送有两个方案。方案一是使用微信订阅消息推送给附近的服务者方案二是服务者在小程序内维护“接单大厅”主动刷新查看新订单。从实际效果看方案二更稳定因为订阅消息有一次性限制没办法频繁推送。接单大厅的列表接口核心逻辑是查出附近 3 公里内未接单的订单按距离和发布时间排序。这里可以用数据库里的经纬度字段做距离筛选也可以接入地图服务。数据量小的时候用数据库查询即可。7. 社区团购模块开发要点团购模块比跑腿多出两个关键内容商品管理和库存扣减。如果库存扣减处理不好就会出现超卖这是社区团购开发中需要重点避免的问题。7.1 商品列表与购物车商品列表从后端获取商品支持图片、价格、原价、销量、库存等字段。// pages/goods/list/index.js Page({ data: { goodsList: [] }, onLoad() { this.loadGoods() }, loadGoods() { wx.request({ url: https://api.your-domain.com/api/goods, method: GET, header: { Authorization: wx.getStorageSync(token) }, success: (res) { this.setData({ goodsList: res.data.data.list }) } }) } })购物车模块在普通电商里可以放本地缓存但社区团购建议直接交给服务端管理。原因是团购商品存在限购本地缓存容易和真实库存脱节。下单时直接传商品列表由后端统一校验库存和价格。7.2 库存扣减方案库存扣减最常见的场景是用户提交订单时。需要保证在并发情况下不会把库存扣成负数。推荐使用数据库乐观锁或悲观锁。先给出一段参考 SQL-- 扣减库存前先校验库存是否充足 UPDATE goods SET stock stock - 1 WHERE id ${goodsId} AND stock 0;如果影响行数为 1说明扣减成功如果影响行数为 0说明库存不足直接返回“库存不足”。这个方案在商品数量小、并发量中等的情况下完全够用。如果要进一步保障可以将库存扣减放到 Redis 中预扣库存支付成功后正式扣减支付超时后回滚。但这套方案复杂度高建议业务跑通后再升级。7.3 团购订单的成团逻辑成团逻辑是社区团购和普通电商最大的区别。用户支付成功后订单不会立刻变成待发货而是等待成团。成团条件由后台配置比如满 5 组成团成团后拼团订单才会进入发货流程。如果没有成团需要在规定时间内自动退款。实现上可以定时任务扫描超时未成团的订单也可以使用延迟队列。前期定时任务更简单例如每分钟扫描一次。# 伪代码定时释放未成团订单 import asyncio from datetime import datetime, timedelta async def release_expired_groupons(): while True: expire_time datetime.now() - timedelta(hours24) orders await get_unpaid_groupon_orders(expire_time) for order in orders: # 关闭订单释放库存触发退款 await cancel_order(order.id) await asyncio.sleep(60)8. 家政服务预约模块开发要点家政预约模块的难点不在支付而在于“时间”、“人员”和“订单”三者之间的约束关系。下面重点讲这两个约束。8.1 服务人员的排班与可约时段服务人员需要配置可服务时段可选时段的粒度建议以 30 分钟或 1 小时为间隔。前端展示日历和时段后端根据服务人员的排班和已有订单来判断某个时段是否可约。一个简单的时段数据结构{ service_id: cleaning_01, worker_id: worker_001, date: 2025-06-01, slots: [ {start: 09:00, end: 10:00, booked: false}, {start: 10:00, end: 11:00, booked: true}, {start: 14:00, end: 15:00, booked: false} ] }用户选完时段后前端把worker_id、start_time、end_time传给后端后端在创建订单时对时段做唯一校验防止两个用户约同一个时间。8.2 时段唯一性校验时段冲突是预约类小程序最容易出现的 bug。建议在数据库层面加约束保证同一个服务人员在同一时间段内只有一单。例如订单表中加上worker_id和start_time联合唯一索引即可从底层兜底避免并发导致重复预约。9. 微信支付与订单流程微信支付是社区服务小程序的核心能力也是开发和排查中问题最多的部分。这里重点讲统一下单、支付回调、退款三个环节。9.1 服务端统一下单用户点击支付后前端调用后端创建订单接口后端调用微信支付接口生成支付参数前端拿到参数后调起支付。支付请求的完整流程以 Python 官方 SDK 的调用思路为例# 伪代码需要安装 wechatpayv3 SDK # 此处仅演示调用流程 def create_payment(order): params { description: 社区跑腿订单, out_trade_no: order.order_no, notify_url: https://api.your-domain.com/api/pay/notify, amount: { total: order.total_fee, currency: CNY }, payer: { openid: order.openid } } response wechatpay.pay(params) return response9.2 支付回调处理微信支付成功后微信服务器会请求我们配置的notify_url。回调处理有个关键原则先验签再处理业务最后返回应答。router.post(/api/pay/notify) async def pay_notify(request: Request): body await request.body() # 1. 使用微信平台证书验证签名 result verify_wechat_signature(body, request.headers) if not result: return {code: FAIL, message: 签名验证失败} # 2. 解密资源数据 resource result[resource] data decrypt_resource(resource) # 3. 校验订单号和金额 order_no data[out_trade_no] paid_fee data[amount][total] order await update_order_paid(order_no, paid_fee) # 4. 返回成功给微信 return {code: SUCCESS, message: 成功}回调处理尤其要注意幂等性。同一笔订单微信会多次发送回调后端必须保证重复处理不会出问题。判断订单状态变成“已支付”后直接返回成功不再重复处理。9.3 退款处理退款接口由管理后台触发退款前需要校验订单状态和退款金额。退款是异步流程申请后需要监听退款结果更新订单状态。退款要注意以下两点退款金额不能大于实际支付金额退款后要及时释放库存10. 地图、定位与消息通知社区服务离不开地图。用户定位、骑行配送距离计算、自提点距离排序都需要地图能力。以下三点比较值得关注。10.1 用户定位与地图选点获取用户当前位置使用wx.getLocation地图选点使用wx.chooseLocation。在开发阶段会遇到一个问题模拟器默认定位不准真机测试时位置信息才是准确的。所以地图和定位功能一定要在真机上验证。10.2 逆地址解析地图选点返回latitude和longitude但在订单展示和距离计算中往往需要具体的地址文本和行政区划。建议后端调用腾讯位置服务或高德地图的逆地址解析接口根据经纬度得到结构化地址。10.3 订阅消息通知订单状态变更时可以用微信订阅消息通知用户。订阅消息的特点是用户必须主动授权一次才能给用户发送一条消息。一次授权对应一条消息。因此建议在小程序的关键路径上引导用户订阅例如下单成功后弹出订阅授权。不要试图通过订阅消息频繁打扰用户微信审核和用户体验都不允许。11. 服务端 API 与数据库设计这里给出一套适合社区服务小程序的数据库设计思路。注意不是唯一的方案但基本覆盖了核心业务。11.1 核心数据表表名用途user用户表存 openid、手机号、昵称、头像、状态address地址表存用户常用地址order订单主表存订单号、用户ID、订单类型、金额、状态order_item订单明细表存商品或服务明细goods商品表存团购商品信息goods_category商品分类表service_worker家政服务人员表worker_schedule服务人员排班表coupon优惠券模板表user_coupon用户领取的优惠券表refund_record退款记录表payment_log支付日志表用于对账11.2 订单主表字段参考CREATE TABLE order ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(64) NOT NULL COMMENT 业务订单号, user_id bigint NOT NULL COMMENT 用户ID, order_type tinyint NOT NULL COMMENT 1跑腿 2团购 3家政, status tinyint NOT NULL COMMENT 订单状态, total_amount decimal(10,2) NOT NULL DEFAULT 0.00, pay_amount decimal(10,2) NOT NULL DEFAULT 0.00, pay_status tinyint NOT NULL DEFAULT 0 COMMENT 支付状态, address_snapshot text COMMENT 地址快照, pay_time datetime DEFAULT NULL, finish_time datetime DEFAULT NULL, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_order_no (order_no), KEY idx_user_id (user_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单主表;订单表建议保留地址快照不要通过外键关联地址表去查询历史订单因为用户地址可能修改快照能保留下单时的原始信息。11.3 API 接口通用调用示例下面是一个标准的接口调用示例前端使用wx.request请求后端下单接口。// 用户提交跑腿订单 wx.request({ url: https://api.your-domain.com/api/order/create, method: POST, header: { Content-Type: application/json, Authorization: wx.getStorageSync(token) }, data: { order_type: 1, start_address: { latitude: 30.123, longitude: 120.456, name: xx小区东门 }, end_address: { latitude: 30.789, longitude: 120.987, name: xx写字楼A座 }, goods_type: food, weight: 1.5, remark: 不要面汤 }, success(res) { if (res.data.code 0) { // 跳转到支付页 const orderId res.data.data.order_id wx.navigateTo({ url: /pages/pay/index?orderId${orderId} }) } } })12. 测试、上线与常见问题排查上线不是代码写完就结束。小程序审核和支付功能都要提前测试。下面把最常见的坑和排查方法列出来这是社区服务小程序开发中最容易消耗时间的部分。问题现象可能原因排查方式解决方案真机测试访问后端提示失败类似net::ERR_CONNECTION_RESETrequest 合法域名未配置、或证书问题打开调试模式看具体报错确认域名已备案且 HTTPS 证书有效并在后台配置合法域名获取登录后的微信用户失败openid 获取异常、token 无效查看服务端日志检查 code 是否过期确保wx.login的 code 只使用一次后端缓存用户会话支付后订单状态不变支付回调通知失败或回调处理异常查看支付回调日志检查 notify_url 是否可公网访问使用微信支付商户平台手动查单补偿订单状态定位功能在模拟器失效模拟器定位为模拟数据使用真机测试真机调试检查requiredPrivateInfos配置地图选点返回空白腾讯位置服务 Key 未配置或额度不足查看小程序控制台报错申请并配置腾讯位置服务 Key检查配额用户打开小程序后白屏页面路径错误或基础库版本过低查看 console 报错升级基础库检查页面路径团购下单提示超卖库存校验和扣减不是原子操作查看库存日志使用UPDATE ... WHERE stock 0原子扣减家政时间段重复预约时段唯一性校验缺失数据库查重为worker_id start_time建立联合唯一索引12.1 上线前必须验证的清单上线前至少跑一遍以下流程新用户首次进入能否正常登录用户未授权位置时首页是否友好提示发布跑腿订单后费用计算是否正确微信支付能否正常调起支付回调后订单状态是否更新团购商品下单后库存是否正确扣减退款流程是否正常退款金额是否正确家政预约选时是否会与已有订单冲突管理后台是否能处理退款、取消订单等操作服务端 API 在弱网环境下是否超时报错13. 最佳实践与合规建议社区服务小程序涉及支付、定位、用户隐私上线前建议认真做一轮合规检查这也是防止后期被下架或处罚的重要工作。13.1 代码层面的工程建议第一次开发先小范围验证跑通跑腿一个模块再复制到团购和家政保留一套最小可运行配置方便后续快速排查问题模型文件、订单日志、数据库 SQL 分环境管理不要混用批量任务要加日志和失败重试比如定时释放未成团订单、支付回调补偿接口服务要限制访问范围管理后台接口不要暴露到公网对异常订单要有告警机制例如支付成功但业务处理失败13.2 隐私与平台合规小程序必须配置隐私保护指引列明收集哪些信息、用途是什么获取用户位置前要在页面中说明用途不能强制授权微信支付必须使用官方 SDK不能代客发起免密支付也不能绕过微信支付协议家政服务人员和跑腿骑手的信息展示需要获得本人同意后才能公开涉及用户人脸、身份证、通讯录等敏感信息必须有明确授权流程13.3 版权与内容合规社区团购里如果引用商家的商品图片需要确认有授权不能直接抓取他人图片用于商业用途。如果涉及品牌名称、商标也需要规避侵权风险。跑腿代买业务如果出现代购违禁品等情况平台需要及时拦截做到“平台有规则、页面有提示、后台有处置”。14. 总结与下一步社区服务小程序最值得投入精力的不是页面样式而是订单状态机和支付回调的稳定性。先把订单从“创建”到“支付”到“完成”再到“退款”整条链路走通再去看营销玩法、优惠券、分销这些锦上添花的功能。如果这篇文章对你有帮助建议收藏备用开发过程中遇到具体问题可以回来对照排查。下一步可以按照这个小程序的服务端 API 设计先把用户登录、地图选点、统一下单三个接口跑通再做页面交互。这三个接口是社区服务小程序的命脉跑通了后面的开发就有底了。
返回列表