ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

快递上门取件小程序全流程开发复盘:uniapp多端工程化与订单状态机实践

快递上门取件小程序全流程开发复盘:uniapp多端工程化与订单状态机实践 做快递上门取件服务平台的完整复盘可能是最近一线开发同学问得最多的方向之一。这个项目用 vue uniapp 搭起微信小程序端后端接口统一对接从用户下单、快递员接单、上门取件到支付结算基本覆盖了同城/同区快递揽收服务的完整闭环。这篇文章我会从技术选型、业务拆分、关键模块实现、典型问题排查四个角度把整个系统怎么从0到1搭起来、哪些地方值得重点设计、哪些坑我替你踩过了一次讲清楚。适合正在做小程序开发、准备切入本地生活服务赛道或者单纯想了解 uniapp 多端工程化落地的同学阅读。1. 项目整体设计与技术选型思路1.1 快递上门取件业务到底在解决什么问题先别急着写代码你要清楚做一个上门取件服务平台本质是在解决谁的问题。寄件用户端存在三个被忽略的痛点第一是时间成本上班族没法为了寄一个退换货专门跑驿站高峰期排队更是难受第二是物品搬运成本大件、多件物品自己拎过去不现实第三是信息透明度用户把件交出去之后完全不知道快件什么时候被揽收、走到哪个环节了。平台的核心价值就是做一个撮合与履约工具——用户在线下单快递员按需上门订单状态全程可查支付结算线上完成。这个平台的业务链路其实不长但涉及的角色和状态转换非常典型。用户在小程序里选择取件地址、填写物品信息、预估重量、支付运费平台生成订单并推送给区域内的快递员快递员接单后上门扫码或核对取件码完成揽收快件发出后用户能实时看到物流进度最后用户确认收货并对服务进行评价。全程涉及用户端小程序、快递员端工作台、运营管理后台三个入口权限模型、订单状态机、消息通知都要围绕这条链路设计。1.2 为什么选 vue uniapp 微信小程序这套组合很多人会问既然只做微信小程序为什么不直接用原生小程序开发答案是成本和复用性。原生小程序语法封闭组件生态松散开发效率远不如 vue 顺手。而 uniapp 底层编译到微信小程序时虽然会经历一层转换但它让你保留了 vue 的开发体验同时天然获得多端能力。这个项目虽然标题聚焦微信小程序但实际运营中快递员端大概率要出一个独立的 App需要后台持续定位、频繁扫码如果两端分别用不同技术栈开发维护成本会成倍上升。选 uniapp 的一个隐藏收益就在这里用户端小程序和快递员端 App 可以共用一套业务代码只是通过条件编译做差异化展示。技术栈的另一个关键决策是 vue 版本。新项目我强烈建议直接用 vue3 的组合式 API而不是选项式。快递下单这种业务页面里会同时存在表单校验、定位、支付、路由传参、订阅消息等多个关注点用选项式会把 data、methods、watch 拆得七零八落逻辑一旦变复杂就很难维护。组合式 API 按业务功能组织代码比如 useOrder、useLocation、usePayment一个功能的所有状态和操作放在一起调试时不用反复滚动屏幕。后端和后台管理部分常规可靠的搭配是 Spring Boot MySQL Redis管理后台直接用 ant design vue 搭。选 ant design vue 的原因不用多说表格、表单、权限路由这些后台常规需求都有成熟组件团队上手快不需要像从零封装那样去踩表格拖拽、筛选联动这些深坑。Redis 在这里不只是做缓存更多是承担抢单、定位轨迹等实时性要求高的临时数据存储。1.3 整体架构与角色权限设计系统分三端但用户体系是统一的。用户在小程序端通过 wx.login 获得 openid 作为账号标识快递员端登录时绑定同一个用户体系后台通过角色字段区分身份。接口层统一走 Token 鉴权后端建议直接用 Spring Security JWT前端在请求拦截器里注入 token遇到 401 统一跳回登录页。快递员端的角色权限要更细一些接单、改订单状态、扫码核验、查看收益每个操作都需要单独的接口权限控制避免越权操作。订单状态机是整个系统最容易在后期出 bug 的地方我建议前期就把状态枚举定义死。常见状态包括待支付、待接单、已接单、已取件、运输中、已签收、已取消、退款中。每一个状态变更都对应一个操作事件比如“接单”操作只允许发生在“待接单”状态“扫码揽收”只允许发生在“已接单”状态。后端在接口里做状态流转校验不要指望前端按钮禁用就能防住非法操作。2. 核心功能模块与实现细节2.1 用户下单地图选点、物品信息与实时计价下单页是整个用户端体验的核心流程设计直接影响转化率。第一步是选择取件地址这里推荐直接接入腾讯地图或高德地图的小程序 SDK核心场景是两个用户进入页面时自动定位当前位置以及用户手动搜索并选择住宅、公司等常用地址。定位这里要注意微信小程序的 wx.getLocation 接口需要用户在公众平台后台申请权限并且在 manifest.json 里声明对应权限否则真机调试时会一直拿不到坐标很多新手第一次跑通代码却发现定位不了就是卡在这个配置上。获取到坐标后还要做逆地址解析把经纬度转换成可读的省市区街道门牌号这一步可以用地图的 reverseGeocode 能力也可以直接后台转发。物品信息填写要注意交互设计。物品类型建议用单选框组件做分组选择比如文件、数码、衣物、食品、其他因为不同物品类型对应的保价规则和禁运规则不一样。重量信息不要只做一个自由输入框用户对重量其实没有概念更好的方式是提供“小于1kg、1-3kg、3-5kg、5-10kg”这种区间选择后台按区间上限计费前端只负责展示金额试算。计价公式可以这样设计首重1kg内10元续重每增加1kg加2元超重区间和偏远地区另加服务费。下单页还有一个非常容易踩的坑是路由传参。从地图选点页返回下单页如果你直接把整个地址对象拼在 url 上会遇到两个问题一是参数过长被截断二是对象里的特殊字符需要编码。我的建议是两种方案二选一简单场景用 url 拼接但不传对象只传 placeId下单页再通过接口反查地址详情复杂表单场景用 uniapp 的 eventChannel事件通道方式传参这种方案不会污染页面栈。另外下单按钮一定要做防重复提交用户连续点击两次就会生成两个订单后端同步建单接口要做好幂等校验前端则通过按钮 loading 状态限制。2.2 快递员接单与上门路径规划订单产生之后核心问题是怎么让快递员接到单。目前市面上主流方案有两种抢单制和指派制。抢单制适合快递员数量充足的区域平台把订单广播出去快递员手快有手慢无竞争机制会倒逼服务质量指派制适合区域划分严格的加盟制网点系统按距离、评分、当前订单量自动分配给最优快递员。从技术实现看抢单制可以用 Redis 的 List 或 Stream 做一个轻量级消息队列订单创建后 push 到区域队列快递员端通过轮询或 WebSocket 接收新单提醒指派制则是一个带权重的匹配算法按距离、历史履约率、当前负载计算得分。初期建议先做抢单制逻辑简单上线成本低跑通后再演进到指派。快递员一旦接单上门路径规划就成了服务体验的关键。快递员端需要持续上报位置这样后台和用户端才能看到快递员到了哪里。但这里有个精度和耗电的矛盾如果每秒钟都调 uni.getLocation后台坐标会刷得很频繁手机电量也撑不了多久。我的实践方案是快递员在“已接单”状态下每30秒上报一次位置到达取件点附近500米内时改成5秒一次并触发“即将到达”通知。导航部分直接用 uni.openLocation 调起微信内置地图把取件点的经纬度、名称传进去用户点一下就能打开导航页不需要在应用内嵌入完整地图 SDK既省包体积又省开发量。上门核验是容易被忽略但业务上必须存在的环节。用户下单时会生成一个6位取件码或二维码快递员到达后需要用户出示取件码才能完成揽收。取件码的生成规则最好是有时效性的比如30分钟内有效防止截图转发被人冒领。对这个环节我的建议是开发初期先做手动输入取件码验证整体流程后再上扫码能力扫码涉及相机权限和二维码协议规范细节更多放到后面迭代更稳妥。2.3 在线支付与微信支付v3对接快递平台本质上是一个交易平台支付环节绕不开微信支付。微信支付 v3 是目前主流的接入方式和 v2 比最大的变化是安全性要求更高接口请求需要商户证书回调通知需要验签敏感信息比如用户的 openid、金额要用平台公钥加密。对接时要准备的参数包括小程序 appid、商户号 mchid、APIv3 密钥、商户私钥和证书序列号。下单接口的流程是后端调用微信支付统一下单接口拿到 prepay_id再通过签名算法生成给小程序端调起支付所需的参数小程序端拿到参数后调用 uni.requestPayment 弹出支付面板。这里要特别注意一个业务经验支付结果回调的落地顺序一定要设计好。用户支付成功后微信会异步通知你的后端接口这个回调才是订单状态更新的最终依据。很多同学刚做支付时习惯在小程序端拿到支付成功回调就立刻调后端改订单状态这不可靠因为支付成功回调可以被伪造而且网络波动时小程序端可能收不到。正确做法是后端收到微信支付回调后先验签、解密、核对订单金额一致性再把订单状态更新为“已支付”同时返回给微信“处理成功”的应答。另外回调接口要做幂等同一个支付通知可能会被微信发送多次不要因为重复回调把订单状态覆盖错。还有一个现实层面的问题需要提前预防小程序支付功能被限制、提示“由于小程序违规支付功能暂时无法使用”。这个通常不是代码问题而是小程序账号违规或类目资质不齐全导致的。快递取件平台涉及快递物流类目需要营业执照、快递业务经营许可证或与持证快递企业合作的证明文件。开发阶段想调试支付可以用微信支付沙箱环境或者后端配置 mock 支付接口让前端能完整走通下单到回调的流程等资质下来再把真实支付切换上去。不要在资质有风险时强行绕过微信支付走人工转账这样大概率会被永久限制支付权限。2.4 扫码核验、电子签名与轨迹追踪如果说支付决定了平台能不能赚钱那取件码和电子签名就决定了服务环节能不能闭环。上门取件时快递员需要验证寄件人身份和订单有效性取件码就是第一道验证。关于二维码和取件码我建议不要直接在订单号基础上生成而是单独设计一套协议格式比如把订单号加盐混淆后编码成 8 位随机码。快递员端使用 uni.scanCode 扫码后先解析出内容再调用后端接口进行核验。这里正好回答一个高频问题为什么扫码扫出来是一串数字但用户那边订单却对不上大概率是你把订单号直接生成成了二维码然后快递员扫码时拿整串数字去查订单。订单号可能被人为抄错、读错也可能包含业务前缀字符解析规则一变就全乱了。正确做法是约定一套标准链接格式比如https://yourdomain/pickup?orderNoxxxcodexxx二维码扫出来是一个 URL通过解析 URL 参数取 orderNo 和 code再做两步校验。哪怕用户随手转发这个二维码也要校验 code 的时效性和与 orderNo 的绑定关系。电子签名是另一个服务闭环的关键动作。快递员揽收后寄件人需要确认物品信息无误如果在线上完成签认就要让寄件人在小程序里手写签名。技术实现不复杂核心是 canvas 绘图监听触摸开始、移动、结束三个事件把轨迹点记录下来重绘最终通过 canvas 导出图片把 base64 或上传后的文件地址保存到订单记录里。这里有两个细节要注意一是真机上 canvas 的尺寸换算不同机型的 dpr 会导致签名图片模糊需要在导出前按 dpr 做缩放二是不要让签名的图片 base64 直接存数据库量大之后数据库会被撑爆建议上传到 OSS 或云存储数据库只存 URL。轨迹追踪模块实际开发中可以分阶段处理。初期没有对接快递公司内部系统时可以先维护一个模拟轨迹节点列表已下单、已揽收、运输中、派送中、已签收由快递员在关键节点手动点击更新。等到业务跑顺需要获取真实快递轨迹时再对接快递鸟、快递100 这类第三方物流查询接口传入快递单号和快递公司编码定时拉取物流轨迹并展示给用户。这样前期开发成本可控后期升级也不至于推倒重来。2.5 订单状态机与消息通知订单状态机前面提过一次这里详细说一下怎么落地。我建议整个系统的订单状态统一用数字枚举定义0-待支付、1-待接单、2-已接单、3-已取件、4-运输中、5-已签收、6-已取消、7-退款中。每一个状态变更都有一个对应的触发事件支付成功触发待支付到待接单快递员接单触发待接单到已接单扫码揽收触发已接单到已取件等等。前端根据当前状态渲染不同的操作按钮后端在接口层面再次校验状态是否允许流转。这样做的好处是未来如果增加“拒收”“改地址”“退回”等异常流程只需要在状态机里加对应的事件和判断分支不用大改表结构。消息通知是提升用户留存的关键。微信小程序提供订阅消息能力但用户每次授权只能收到一次模板消息推送这意味着在用户下单时就要规划好推送节点。我的建议是在下单流程中嵌套授权引导用户支付成功后弹窗请求订阅“取件进度”消息授权成功后可以获得一次推送机会快递员接单后推送“快递员已接单即将上门”提醒揽收后推送“已揽收快件正在路上”提醒。这里有个产品层面的经验不要把订阅授权放在支付前用户会反感等支付完成、服务体验开始产生价值时再引导授权授权通过率会提高不少。关于自定义分享快递平台经常需要做“邀请好友寄件得优惠券”这类活动就会用到 uniapp 的 onShareAppMessage。这里有一个知乎上讨论很多、实际开发也常踩的坑如果项目里用全局 mixin 统一设置了 onShareAppMessage页面里再单独写的 onShareAppMessage 覆盖不上或者覆盖了但全局配置失效。原因是同名的生命周期函数会被后定义的覆盖而且 mixin 的合并策略里 onShareAppMessage 这类生命周期钩子会被合并为数组依次执行但返回值以最后一个生效的为准。建议是不要把分享逻辑放全局 mixin直接用组合式 API 封装一个 useShare 函数在需要分享的页面单独引入调用这样既能复用配置又能灵活覆盖。3. 前端工程化与多端适配的实操要点3.1 环境准备与项目初始化环境这块是很多新人的第一道坎但实际上步骤清楚了十分钟就能搞定。需要准备四样东西Node.js建议 14.18 以上版本vite 项目要求更高、HBuilderXuniapp 官方 IDE、微信开发者工具用于编译和预览小程序、以及一个微信小程序 appid在微信公众平台注册开发者账号后创建。vue 安装及环境配置里最容易出错的是 Node 和 npm 镜像源问题。国内网络环境下直接 npm install 经常会卡在半路或者报 ERESOLVE 依赖树冲突建议先设置淘宝镜像源。创建 uniapp 项目时HBuilderX 可视化创建和 vue-cli 命令行创建都可以命令行创建更可控可选 vue3vite 模板项目中再安装 uView Plus 或 uni-ui 组件库。manifest.json 里要配置小程序 appid、App 端权限如果需要做快递员 App和打包相关参数。这里记住一个原则manifest 配置要在项目开发前设置不要等代码写完了再补否则调试时会出现权限、appid 对不上导致编译失败的问题。HBuilderX 运行到微信开发者工具这一步如果点击运行后没有任何反应90% 是微信开发者工具没有开启服务端口。在微信开发者工具的“设置-安全设置”里打开“服务端口”开关再回到 HBuilderX 重新运行就能连通。如果提示“不是开发者”需要去微信公众平台把当前微信号添加为项目成员并赋予开发者权限。这类基础环境问题几乎每个人都会遇到不要慌按这个顺序排查大概率能解决。3.2 路由传参、下拉刷新、全局方法的那些坑uniapp 开发微信小程序路由操作和 web 端有差异要在项目初期就明确规范。页面跳转可以用 uni.navigateTo、uni.redirectTo、uni.switchTab 三件套分别对应栈内跳转、替换当前页面、切换 tab 页。路由传参有两个容易踩的坑一是参数值里有特殊字符比如地址里的 ?、、#会导致解析错乱二是传整个对象时 URL 超长被截断。我常用的做法是传值前先 encodeURIComponent(JSON.stringify(obj))接收端再 decodeURIComponent JSON.parse虽然会多两步操作但稳定不出幺蛾子。不过这种方案只适合小对象大型表单数据建议用全局状态管理或缓存。下拉刷新和页面滚动冲突是订单列表页很经典的矛盾。如果页面本身是一个可滚动的长列表又开启了下拉刷新体验就是怎么滑都触发刷新、列表内容拉不动。解决方案有两种页面级滚动时自己实现一个自定义下拉刷新组件用 touch 事件控制刷新状态或者用 scroll-view 包裹列表在 scroll-view 上开启 refresher 属性把系统下拉刷新关掉。两种方案我都试过自定义刷新组件体验更好但工作量大scroll-view 方案简单但长列表渲染性能要留意。快递订单列表这种场景数据量到几百条时建议直接上分页加载不要一次性渲染全部数据。还有一个坑是关于全局方法覆盖。uniapp 的 mixin 可以把方法混入所有页面但有些系统能力比如 onShareAppMessage、onPullDownRefresh、onReachBottom在 mixin 里配置后页面级自定义就会失效或叠加出错。这是因为小程序的页面生命周期函数和 uniapp 生命周期函数之间有一套独立的合并机制并不是简单覆盖。解决方法我觉得最干净的还是全局通用的逻辑用组合式 API hook 封装页面里显式调用页面独有逻辑放页面内部。不要图省事把所有东西挂到 mixin 上否则业务复杂之后你会被各种隐藏的覆盖关系坑到崩溃。3.3 微信小程序细节适配清单微信小程序最磨人的永远是一堆真机细节。顶部导航栏高度就是一个典型的例子普通机型导航栏大约 44px但 iPhone X 以上因为刘海屏状态栏高度会变成 44px 甚至更高胶囊按钮的位置也不固定。如果你用自定义导航栏一定要动态计算。通过 uni.getSystemInfoSync() 拿到 statusBarHeight再根据胶囊按钮的 getMenuButtonBoundingClientRect() 计算导航栏高度这样在不同机型上才不至于把标题顶出屏幕。现在很多项目的做法是直接用原生导航栏省心很多但如果你想做沉浸式顶部的品牌效果自定义导航栏又绕不开这套计算逻辑。软键盘遮挡输入框的问题是表单页面最常见的吐槽点。用户在小程序里填写地址或备注时手机软键盘弹起会把底部的输入框顶掉。常规做法是把页面输入框放在 scroll-view 里监听键盘高度变化动态调整 scroll-view 的底部 padding。微信小程序提供了 wx.onKeyboardHeightChange 接口uniapp 中可以直接用 uni.onKeyboardHeightChange 监听拿到键盘高度后做滚动补偿。这里要提醒不要依赖系统自带的 adjust-position 属性它在部分 Android 机型上表现不稳定强烈建议自己手动处理。安全合规方面iOS App 上架应用市场时有一个硬性要求用户首次打开 App 必须弹隐私政策弹窗并且用户选择不同意时要退出 App。这个逻辑在 uniapp 里可以这样实现启动时判断本地是否已有同意记录没有就弹窗点击同意后存储状态点击不同意直接调用 uni.exitApp() 退出。这个看起来简单的逻辑其实关系到上架审核成败千万不要漏掉。小程序端虽然不强制退出但在收集用户位置、相册权限前也要有单独的授权引导文案否则审核会被驳回。3.4 打包发布与多端上架uniapp 项目的发布流程在不同端差异很大一定要提前规划。微信小程序端在 HBuilderX 里点击“发行-小程序-微信”填写 appid 后会生成一个 dist/build/mp-weixin 目录然后在微信开发者工具中导入这个目录上传代码到微信公众平台在“版本管理”中提交审核即可。如果要额外发布 Android 端快递员 App打包方式有两种云打包和离线打包。云打包简单HBuilderX 勾选证书配置后直接云打包出 apk但受限于网络速度而且 Apple 证书需要自己准备离线打包需要下载 Android Studio将 uniapp 的离线 SDK 集成进原生工程可定制性更高但配置复杂度也高。上架安卓应用市场应用宝、小米、华为、OPPO、vivo时每个市场都要求提供软件著作权证书、隐私政策链接、App 备案号部分市场还要求提供服务器 ICP 备案证明。第一次做多端上架建议提前一个月准备这些材料不要等代码开发完了再补否则产品上线节奏会被拖垮。多端差异可以通过条件编译处理。比如微信小程序端支付调用 uni.requestPaymentApp 端可能需要走 uni.requestPayment 的 App 支付模式它们参数名有差异再比如微信小程序端有订阅消息App 端没有这个能力需要替换为 App 推送。代码里用#ifdef MP-WEIXIN和#ifndef MP-WEIXIN包裹差异部分一套代码就能兼容不同平台。我在实践中发现条件编译写多了代码可读性会下降所以核心业务逻辑尽量抽到公共方法只在平台差异点上做分支。4. 常见问题与排查技巧实录4.1 运行没反应、不是开发者这类环境问题环境类问题占据了新手一半的调试时间。HBuilderX 运行到微信开发者工具没反应排查看三处第一微信开发者工具的“设置-安全设置-服务端口”是否打开第二manifest.json 里填的 appid 是否与微信开发者工具当前登录账号一致第三HBuilderX 和微信开发者工具的版本是否兼容建议都升级到最新稳定版再试。提示“不是开发者”时去微信公众平台的“成员管理”里把当前微信号添加为项目成员授予开发者权限即可。还有一个小问题经常被忽略如果你电脑上装了两个微信开发者工具一个稳定版一个开发版HBuilderX 可能连到错误的工具端口。解决办法是指定 HBuilderX 的运行配置手动选择微信开发者工具的可执行文件路径。另外微信开发者工具的“本地设置-不校验合法域名”在调试阶段建议开着否则 request 请求无法发到你本地局域网的接口地址。4.2 支付上线被限制的前置处理支付问题在这个行业太常见了。你辛辛苦苦写完代码提交审核时收到“由于小程序违规支付功能暂时无法使用”第一反应肯定是懵的。这里要说清楚这个提示有两种可能一是你的小程序账号因某些违规操作被微信限制了支付能力二是你当前的类目根本不支持开通微信支付。快递取件平台要开通支付前置条件是账号主体是企业并且完成快递物流相关类目资质审核。开发期处理方式不要等着支付审核过了再联调。后端把支付接口抽象好分为真实支付和 mock 支付两个实现mock 模式直接模拟支付成功回调前端完整走通下单-支付-回调-状态更新-消息通知的全链路。真实支付模式等资质审核通过后把支付配置切到真实商户号即可。这个设计在项目上线初期非常实用能让业务逻辑开发和资质办理并行推进。如果你已经被限制了整改方向要看微信支付后台的具体违规原因通常涉及“诱导分享”“虚假宣传”或“类目信息不符”逐条整改后重新提审。4.3 扫码结果和订单对不上、解析规则混乱扫码扫出来是一串数字但是和订单号对不上这种问题多半是二维码内容格式没有统一。二维码里建议只放标准 URL不要直接放订单号。扫描后先取出完整内容再用 URL 解析方式取参数。比如二维码内容为https://yourdomain/pickup?orderNoSO20250101001code832915解析时分别取出 orderNo 和 code再调用后台核验接口。这样无论二维码被分享到哪个渠道后台都能准确校验订单归属和取件码有效性。这里我再补充一个规范建议orderNo 的格式最好也做成有规律可循的。比如SO 年月日 6位流水号这样后台按订单号查库时可以直接走索引日志排查时看到单号就能大概判断创建时间范围。别小看这个细节系统运营三个月后你查订单会感谢这个设计。4.4 软键盘遮挡、下拉冲突、性能优化这些体验问题表单页软键盘遮挡我已经在前面讲过监听键盘高度并补偿的方案这里补充一个实战经验不要只想着把输入框滚动到可视区还要考虑页面底部是否有“提交”按钮。如果键盘弹起后提交按钮被挡住用户填完信息找不到提交入口流失率会非常高。建议键盘弹起时把底部操作栏做成吸底状态动态调整 bottom 值等于键盘高度。下拉刷新冲突我会直接给一个配置参考订单列表页如果用自定义下拉刷新pages.json里该页面的enablePullDownRefresh必须设为 false否则会和自定义手势冲突如果要保留系统下拉刷新页面滚动容器必须是页面原生滚动page 的滚动而不是内部 scroll-view 的滚动否则两套滚动逻辑会打架。性能优化方面快递员位置上报是高频写入操作前端一定要做节流30 秒一次足够了后端更新坐标的接口最好用 Redis 做临时存储定期批量同步到数据库不要每条坐标都直接写 MySQL否则订单量上来后数据库 IO 会是瓶颈。4.5 与后端协作中的数据一致性坑最后聊一个前端开发经常忽略的问题前后端数据一致性和字段规范。金额字段是最典型的例子前端接口传金额给后端如果用浮点数传比如 10.9后端计算时可能出现精度丢失。正确约定是所有金额字段都用“分”为单位整数传输前端展示层再除以100。这个规范要在项目一开始就定好不然后期改造成本巨大。时间字段也是重灾区。微信小程序在不同机型上获取时间会得到不同格式建议统一由后端返回时间戳毫秒前端负责格式化展示。这样在快递状态流转记录列表里后端按时间戳排序即可前端也能自由适配各种展示格式。接口联调阶段建议用 Apifox 或微信开发者工具的本地 Mock 功能先跑通前端不要等后端接口全部写完再联调项目开发有依赖关系的模块很多并行开发能节省大量时间。快递上门取件服务平台的技术点很难说集中在某一个单一功能上它更像是一个把定位、地图、支付、扫码、签名、订阅消息、多端发布这些微信生态能力串起来的系统工程。我个人在开发完这个项目后最深的体会是业务状态机的设计要排在所有功能的前面状态定义清楚了后面的支付回调、消息推送、扫码核验都只是围绕着状态机的自然延伸。如果你正在规划类似的项目建议第一步不要写代码先把角色、订单状态、异常流程全部画出来再开始动手。这个投入绝对值得。最后再分享一个小技巧给每个快递订单加一个 clientOrderNo前端生成的下单流水号后端用它做幂等判断能解决用户双击下单、网络重发导致的重复订单问题这个方案我已经在多个项目中验证过很稳。
返回列表