
简介码科速送同城跑腿小程序v3.0.62是一套基于微擎框架开发的同城跑腿商业源码面向中小跑腿团队、货运公司及小程序开发者用于搭建集代驾、车险代办、帮送、拉货、帮买、约车、万能帮等场景于一体的众包式跑腿平台。源码包共2000个文件以php后端逻辑文件为主辅以png及jpg图片素材、js交互脚本、json数据配置和wxss/wxml小程序页面文件压缩包整体约94.48MB目录结构清晰。目前已有441人学习/下载适合对同城跑腿业务有完整建站需求或希望二次开发的技术人员参考。资源包含用户端和接单端两个小程序支持订单从下单、支付到骑手上门取货等七大状态流转并集成了智慧派单、无人接单自动取消等实用机制同时提供搬家、家政、车险、发单等扩展插件便于功能拓展。不过前端登录授权问题需自行修复建议根据描述中的Redis、宝塔面板及CentOS环境进行部署调试。1. 码科速送 v3.0.62一份同城跑腿小程序的完整交付物运营一个同城跑腿平台最卡人的不是地推而是订单从用户手里到骑手手里的那套流程计价规则、支付回调、抢单推送、轨迹上传、骑手结算任何一环有 bug 都会变成客服电话。码科速送 v3.0.62不是教学 demo是一份把用户端、骑手端、商家端、后台管理全部收进一个工程的同城配送微信小程序源码包版本号能迭代到 0.62说明它是被真实业务磨过的不是一次性代码。它适合接外包的团队、正在冷启动的区域配送平台、以及想拆一套成熟订单模型做二次开发的人。这份资源能解决的核心问题是把同城跑腿“从下单到结算”的最小完整闭环直接摊在你面前你只需要改业务流程细节不用重新发明状态机。2. 撕开交付包看结构四端角色、uni-app 选型与数据库脚本2.1 拿到压缩包先看什么目录排布与交付边界我拆同城配送源码的习惯是先不看代码先看目录和 README。因为源码包的可交付性往往在目录阶段就能判断出来一个连目录都乱的项目内部逻辑大概率也是硬凑的。v3.0.62 这类跑腿小程序常见的交付结构是下面这套我建议你也在解压后第一时间核对目录交付内容技术栈预期admin/后台管理端Vue Element UI 或类似管理框架api/后端接口服务PHP 8 ThinkPHP 或 Java Springuser_app/用户端小程序uni-appVue 3 语法runner_app/骑手端小程序uni-app含地图轨迹merchant_app/商家端小程序或 H5视版本而定database/SQL 脚本与初始数据MySQL 5.7 / 8.0docs/部署说明与接口文档Markdown / PDF这套结构最大的价值在于“端是分离的”。很多外包项目把骑手功能硬塞进用户端用一个角色字段去切页面前期省事后期加权限、加推送、加结算时全挤在一起改一处崩三处。v3.0.62 按角色拆端后端接口天然就要区分鉴权维度反而好维护。unzip maku_suda_v3.0.62.zip -d maku_suda cd maku_suda find . -maxdepth 1 -type d这个命令先把顶层目录列出来确认有没有docs/和database/。这两个目录是判断源码包“能不能落地”的硬指标没有部署文档的包你大概率要花一晚上猜数据库连接配置没有 SQL 脚本的包建表绝对能把你逼疯。2.2 四端角色与权限为什么跑腿业务必须分端跑腿场景里有三类人下单的用户、送单的骑手、出商品的商家或者帮买帮送的合作商户。如果三者共用同一套界面权限边界会非常模糊。v3.0.62 的做法是物理分端用户端主流程微信授权登录、选择配送地址、查看计价、下单支付、实时轨迹、订单评价。骑手端主流程接单大厅、抢单/派单、取货上传小票、送达标记、轨迹回传、每日结算。商家端主流程接收新订单、备货状态流转、核销码。后台管理端主流程计费规则配置、骑手审核与提现、订单干预、数据看板。权限模型建议直接复用源码里已经写好的那一套不要重写。跑腿业务的核心约束是“骑手不能看用户手机号”所以四端之间通过订单号关联敏感信息只在后端接口中做字段脱敏后返回。// user_app 端接口封装示例 import request from /utils/request export function createOrder(data) { return request({ url: /api/order/create, method: POST, data }) }这段代码是用户端创建订单的入口实际项目里url前缀取决于后端路由前缀。要注意的是request封装里通常有两个关键参数header里的Authorization令牌以及timeout超时时间。跑腿场景下骑手在室外网络不稳定超时设置过短会反复报错我一般会调到 15 秒。2.3 技术选型为什么要信 uni-app一次开发多端复用源码包里的用户端和骑手端如果都是 uni-app 工程这个选择是合理的。同城跑腿业务经常被要求同时出微信小程序和支付宝小程序甚至骑手端要跑在 Android 手机上uni-app 的编译目标覆盖了这些渠道。辨认方法很简单看根目录有没有manifest.json和pages.json有这两个文件就是 uni-app 工程。pages.json是路由配置文件值得先通读一遍因为每个页面路径都对应一个业务模块。比如pages/order/detail是订单详情、pages/runner/income是骑手收入页。从路由清单能反过来倒推业务功能清单比看代码快得多。{ pages: [ { path: pages/index/index, style: { navigationBarTitleText: 码科速送 } }, { path: pages/order/create, style: { navigationBarTitleText: 发布订单 } } ] }这里的navigationBarTitleText是页面标题后续做动态标题也是改这个字段。pages.json里还会出现subPackages配置这是分包字段后面第 5 章讲编译超限时要用到。先记住一句话所有和“页面开在哪、标题叫什么、包怎么分”有关的配置都在这一个文件里改坏了小程序直接编译不过但也好排查。3. 从 zip 到跑通环境清单、数据库导入与小程序端联调3.1 环境准备版本先对齐别让玄学报错背锅跑腿源码最常见的翻车点不是代码本身而是本地环境版本和交付环境不一致。PHP 7 跑 ThinkPHP 8 的包一上路由就 404MySQL 版本差了SQL 脚本里utf8mb4索引长度直接报错。我在搭环境前习惯先做一次版本检查php -v mysql -V redis-server --version node -v看到版本后对照源码包docs/里的部署要求。v3.0.62 这类较新的源码包PHP 至少 8.1MySQL 用 8.0 比较稳。如果本机版本偏老优先用 Docker 起一套同版本环境不要在物理环境里死磕二手包依赖冲突会花掉你一下午。3.2 数据库导入初始化数据往往比表结构更重要从database/目录找到 SQL 脚本常见文件名是init.sql或者带版本号的maku_suda_v3.sql。导入方式mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS maku_suda DEFAULT CHARACTER SET utf8mb4 mysql -uroot -p maku_suda database/maku_suda_v3.sql导入成功后别急着改表结构。先看几个关键表的初始数据config表里有没有计费参数、admin_user表里有没有默认账号、region表里有没有开通城市。很多跑腿源码的初始数据里带着演示城市和演示计费规则这些数据能支撑你快速跑通链路如果你自己重新造数据反而不容易复现官方预期行为。然后改.env配置文件APP_DEBUGfalse DATABASE_HOST127.0.0.1 DATABASE_NAMEmaku_suda DATABASE_USERroot DATABASE_PASSWORDyour_password REDIS_HOST127.0.0.1 REDIS_PORT6379REDIS_HOST和REDIS_PORT是很多新手容易忽略的字段。跑腿项目的抢单、骑手定位缓存、微信 access_token 缓存都依赖 RedisRedis 没启动接口会报连接失败或者性能极差。改完.env后重启 PHP-FPM 或者重新跑内置服务器配置才生效。3.3 小程序端联调打开开发者工具前的三个设置用 HBuilderX 打开user_app目录首次运行前必须做三件事# 1. 在 manifest.json 里填入你自己的小程序 AppID # 2. 在 config 文件里修改 BASE_URL # 3. 在微信开发者工具里关闭合法域名校验仅限本地开发manifest.json中的mp-weixin.appid字段不能为空否则微信开发者工具会报“无 AppID”。你用测试号也行但测试号拿不到手机号授权所以建议直接注册一个小程序账号个人主体也能跑大部分功能。// user_app/common/config.js export default { baseUrl: http://127.0.0.1:8080/api, timeout: 15000 }baseUrl是前后端联调的关键。本地开发时可以是http://127.0.0.1:8080/api但要到真机预览这个地址必须换成局域网 IP 或线上 HTTPS 域名。微信开发者工具里有“不校验合法域名”的开关本地调接口方便但正式体验版和上线版必须配置 request 合法域名否则线上所有请求都会挂。3.4 联调自检顺序先登录再造单最后碰支付联调时不要东点一下西点一下。我习惯按业务链路走先用后台账号登录管理端确认后台能打开再在用户端走一次微信登录看后端日志里能否打印出code2Session的返回然后创建一单“同城取送”订单发起微信支付。tail -f /var/log/php-fpm/error.log跑一遍链路的同时盯后端日志。如果卡在登录环节检查小程序后台的 AppSecret 是否和.env里的一致如果卡在创建订单优先看order_create接口返回的字段缺失提示。用日志驱动排错比对着代码逐行猜快得多。4. 订单支付主链路微信登录拿手机号、计价与回调验签4.1 微信登录从wx.login的 code 到 session_key同城跑腿的登录链路一定绕不开微信手机号。v3.0.62 用户端的标准流程是用户点击微信授权按钮前端拿code后端用code调微信接口换openid再拿openid去用户表里查是否注册未注册则引导用户授权手机号完成绑定。// 用户端登录 uni.login({ provider: weixin, success(res) { uni.request({ url: ${baseUrl}/auth/login, method: POST, data: { code: res.code } }) } })不要直接在前端用 code 换 openid那样会暴露 AppSecret。正确做法是 code 只交给后端由后端调到微信服务端接口// 后端 ThinkPHP 控制器示例 $url https://api.weixin.qq.com/sns/jscode2session?appid{$appid}secret{$appsecret}js_code{$code}grant_typeauthorization_code; $res file_get_contents($url); $data json_decode($res, true); $openid $data[openid] ?? ;这里要注意jscode2session返回的数据里除了openid还有session_key。session_key是解密手机号的钥匙不能写进日志也不能返回给前端。很多源码包在登录时会把session_key缓存到 Redis为的是后续解密手机号用。4.2 计价与下单读配置表而不是写死逻辑跑腿计价的复杂度在于“距离 时段 重量 小费”的叠加。v3.0.62 这类源码一般把计价规则存在后台配置表里前端只是把起终点经纬度传给后端。// 用户端计价查询 const res await request({ url: /api/order/calc-price, method: POST, data: { from_lat: 31.2304, from_lng: 121.4737, to_lat: 31.2450, to_lng: 121.4950, distance: 3.2, goods_type: 1 } })计价接口返回的price只能做展示最终以创建订单接口重新计算为准。前后端都算一遍是为了防止有人篡改请求体把大单改成小单。计费参数至少包括基础价、每公里加价、夜间服务费、等待费、小费后台改这些参数后立即生效无需发版。订单创建成功后订单状态机的推进逻辑值得拿出来看一遍它是整个跑腿系统的骨架状态码状态触发动作下游通知0待支付用户创建订单无1已支付/待接单微信支付回调广播给骑手2已接单骑手抢单通知用户3取货中骑手标记取货通知商家4配送中骑手送达起点轨迹持续上报5已完成骑手确认送达触发结算-1已取消用户/后台取消退款状态码字段建议保持和后端常量一致前端不要自己定义字符串。否则前后端状态名对不上会出现订单已完成但界面仍显示配送中的尴尬。4.3 微信支付回调验签不过的九成原因都在排序支付环节最容易翻车的是回调。用户支付成功微信服务端会往notify_url发一条 XML你要先验签再改订单状态最后返回“SUCCESS”。很多二次开发的人把验签代码简化成只查return_code这就留下了安全隐患而且有签名校验时字段漏了或大小写不对都会验签失败。// 支付回调验签示例 $xml file_get_contents(php://input); $params xmlToArray($xml); $sign $params[sign]; unset($params[sign], $params[sign_type]); ksort($params); $str urldecode(http_build_query($params)); $str . key . $this-payKey; $mySign strtoupper(md5($str)); if ($mySign ! $sign) { // 记录日志方便核对原始报文 file_put_contents(/tmp/pay_error.log, $xml . PHP_EOL, FILE_APPEND); return xmlreturn_codeFAIL/return_codereturn_msg签名失败/return_msg/xml; }验签代码里最容易被忽略的地方是ksort后的拼接顺序。微信官方要求按参数名 ASCII 码排序如果你把某个字段拼在错误的位置必然验签失败。另一个高频坑是回调里不校验金额你要把回调里的total_fee和你订单表里已存的金额比对金额不一致直接拒绝否则可能被人用小额订单号伪造大额支付回调。5. 部署运行常见问题避坑五个让我返工的点5.1 坑 1编译主包超限报错source size 2612kb exceed max limit 2mb现象HBuilderX 运行到微信开发者工具编译直接失败提示主包资源超过 2MB 上限。原因uni-app 默认把所有页面、组件、图片打包进主包。跑腿小程序涉及地图组件、支付插件、多个角色页面很容易就超了。2612kb 这个报错我见过不止一次。解决在pages.json里配置分包。配送相关页面移到subPackages把骑手端功能作为独立子包地图 SDK 按需加载。图片再压一遍超过 200KB 的 UI 图直接转 WebP 或者放 CDN。分包之后主包体积降下来编译就过了。5.2 坑 2开发者工具能通真机预览全部白屏现象本地联调一切都好手机扫码预览后页面转圈或白屏接口请求全部失败。原因真机环境走了正式域名校验你配置的baseUrl是127.0.0.1或局域网 IP微信在小程序真机环境里不认。解决把接口部署到 HTTPS 域名在微信公众平台「开发管理 - 服务器域名」里配置request 合法域名。这里有个细节request 合法域名和业务域名是两码事跑腿小程序里如果用了web-view嵌业务后台还要单独配业务域名。配完后通常等一两分钟生效不用反复重启工具。5.3 坑 3支付成功后订单状态没变钱收了但无人接单现象用户反馈“钱扣了订单没出来”后台查订单还是待支付。原因微信支付回调没有到达后端。常见原因是notify_url没有传或者回调地址被HTTPS证书校验拦了也有可能是后端日志里直接报了签名错误被你忽略。解决先在支付下单接口里确认notify_url是完整可公网访问的路径。然后在后端支付相关控制器里加一行文件日志把回调原始报文落盘一次用编辑器直接搜索return_code和out_trade_no两个字段确认微信真的推过。如果日志里什么都没有问题在网络层如果有报文但返回了 FAIL才是签名或金额问题。切记不要用die(xml.../xml)这种写法把响应头搞错也会导致微信重试逻辑异常。5.4 坑 4骑手轨迹变成一条直线客户投诉“没有按路线走”现象订单轨迹回放时地图上的路线直接从起点连到终点中间没有任何折点。原因轨迹点采集间隔太长或者骑手端在后台被系统杀进程定位上传线程断了。GPS 信号弱时返回的坐标精度低两点之间没有中间点绘制出来就是直线。解决把定位采集间隔调整为 3 到 5 秒一次每次上传带accuracy字段小于 50 米的点才入库。骑手端申请前台服务权限避免 App 切后台被杀死。轨迹表里加一个upload_time索引查询轨迹时按时间排序不要只按 ID 排序否则并发上传时顺序是乱的。5.5 坑 5手机号授权报错提示code无效或使用次数超限现象用户点击“微信一键登录”弹窗不出现或者后端解密手机号时报错invalid code。原因手机号快速验证组件的 code 是动态的且只能消费一次。如果你在小程序里先调了一次解密接口又拿同一个 code 去解密第二次后一次必然报错。另外如果小程序基础库版本太老新版手机号组件可能不兼容。解决前端使用button open-typegetPhoneNumber触发授权不要用uni.login拿到的 code 去解手机号——这是两个不同的 code。后端收到手机号 code 后用phonenumber.getPhoneNumber接口换取手机号信息拿到后立即置为已使用避免重复提交。请求失败时把errCode记入日志10002 这类报错多半是基础库版本问题更新基础库版本即可。6. 上线前三件套动态标题、订阅消息与双端登录打通6.1 动态设置页面标题小店名的实时同步运营同城跑腿平台你免不了让商家在后台修改自己的店铺名。如果小程序端订单详情页的标题还写死“取件详情”商家在后台改了店名用户也看不到体验就很割裂。v3.0.62 的页面标题统一走pages.json里的navigationBarTitleText但页面内可以用一行代码覆盖标题uni.setNavigationBarTitle({ title: 码科速送 · ${storeName} })建议把标题动态化逻辑收敛到一个公共方法里进入订单详情时先查商家名称再设标题订单状态变化时再把标题改成“订单配送中”。这样用户扫一眼状态栏就能知道当前这单处于什么阶段。注意动态设置标题只在默认导航栏模式下生效如果用了自定义导航栏需要自己渲染标题组件。6.2 订阅消息订单状态推送的长期与一次性取舍跑腿业务最需要的消息是“骑手已接单”和“骑手已送达”。微信的一次性订阅消息在用户下一次触发某个动作时才能再推送对跑腿这种低频 App 来说不够用。所以你要在后台给长期订阅消息预留位置。在微信公众平台里只有特定类目能申请长期订阅消息跑腿类目一般对应“快递/物流”或“生活服务”。申请不过的话退一步用一次性订阅在下单支付成功那一刻请求订阅用户确认后订单状态变化时就能推一条消息。wx.requestSubscribeMessage({ tmplIds: [模板ID_A, 模板ID_B], success(res) { // 用户点击允许后后端记录该 openid 的订阅凭证 } })这里有个容易被忽略的细节订阅凭证有有效期一般是 7 天。骑手接单通常发生在下单几分钟内所以支付成功后立刻弹订阅能覆盖接单通知送达通知要等半小时以上7 天有效期是够的但如果用户取消了订单订阅凭证就浪费了。最好在支付成功回调里同时触发订阅请求而不是在上一步创建订单时就弹否则用户还没决定付钱订阅弹窗反而干扰转化。6.3 双端登录打通网页后台扫码登录同一套账号体系团队内部经常需要一个网页管理后台来处理售后、骑手审核、提现打款。如果网页登录和小程序登录是两套系统用户在小程序绑定的手机号、优惠券、余额在网页端全看不到内部运营就会被割裂。打通方式是利用微信开放平台的 unionid小程序端登录后后端把unionid写入用户表网页端用扫码登录拿到同一个unionid后直接复用同一份用户数据。// 网页端扫码登录回调 const res await fetch(/api/auth/qrcode-login, { method: POST, body: JSON.stringify({ code: qrCode }) }) if (res.data.unionid) { // 查用户表如果 unionid 已存在则直接登录 }这套逻辑要在后端实现一个“按 unionid 查用户”的方法而不是只按 openid 查。否则小程序端和网页端各存一套用户 ID会员余额和充值记录就会对不上。我从那以后每次接到新源码包第一件事就是开一个 git 分支先跑通主链路再动手改业务细节。把登录、计价、支付、轨迹这四个环节跑一遍比什么都强v3.0.62 的包我也是这么拆完的。希望帮到你。本文还有配套的精品资源点击获取