资讯动态

微信小程序商城完整源码:云开发生产级工程实战

发布时间:2026/10/17 11:14:50 来源:尧图企业网站定制
简介这是一套面向微信小程序开发者与电商项目实践者的完整商城源码专为快速构建轻量级微信平台在线商店而设计适用于中小型商家自营电商、毕业设计或小程序全栈能力进阶学习。资源共60个文件包含9个JS逻辑文件实现商品管理、购物车、订单流程与微信支付对接、7个WXML页面结构文件、9个WXSS样式文件、7个JSON配置文件及24张UI素材PNG整体压缩包仅412KB结构清晰、开箱即用。已有7730人学习下载说明其在实战教学与项目复用中具备较高参考价值。读者可直接基于pages目录下的多页面模块如商品详情、结算页、用户中心理解小程序分层架构通过app.js与utils工具库掌握全局状态与网络请求封装结合源码中的微信支付API调用示例快速打通下单到支付的完整链路。1. 微信小程序商城完整源码不是模板套壳是能直接对接真实支付、库存、订单闭环的生产级工程上周帮某高校实验室团队做毕业设计支撑他们拿了个“仿京东小程序”的课设代码跑不起来——点击下单就白屏后台日志里全是wx.request:fail和undefined is not an object (evaluating e.data.list)。最后发现那根本不是商城只是带了几个商品图片的静态页面。而这次拆解的「微信小程序商城完整源码」我本地从零拉取、npm install、填上自己的测试 AppID、连上云开发环境后30 分钟内就完成了「用户登录 → 浏览商品 → 加入购物车 → 提交订单 → 模拟支付成功 → 后台订单状态自动变更为「已支付」→ 管理员端实时看到新订单」这一整条链路。它不是教学 Demo不是 UI 堆砌而是包含用户中心、商品管理、购物车、订单履约、优惠券、物流模拟、后台管理含 RBAC 权限控制七个核心模块的真实项目结构。适合两类人一是想跳过「hello world」阶段、直接在可运行工程里学小程序工程化实践的新人二是需要快速交付一个轻量级私域商城、但又不愿被 SaaS 平台功能和费用卡脖子的中小商户技术负责人。它用的是微信原生语法 云开发CloudBase没引入 Taro 或 UniApp 这类跨端框架所有逻辑都落在小程序端与云函数之间调试路径清晰、问题可定位、二次开发无黑匣子。2. 工程结构与技术栈看清骨架才能不被目录绕晕这个项目不是单文件堆砌而是一个经过多人协作打磨、有明确分层意识的中型小程序工程。我把它解压后第一件事就是tree -L 3 -I node_modules|.git|dist输出结果让我立刻确认这是个真干活的项目。下面按实际目录结构逐层说明重点标出每个目录存在的必要性和不可删减性。2.1 根目录关键文件project.config.json和app.js是启动命门project.config.json不是摆设。它里面硬编码了appid需替换、cloudfunctionRoot指向/cloudfunctions、setting.minified设为true上线必须、以及最关键的libVersion: 3.4.0—— 这个版本号决定了你能否调用wx.cloud.callFunction的 Promise 写法。如果本地开发者工具提示「云函数调用失败基础库版本过低」八成是这里没对齐。app.js是整个小程序的入口胶水。它做了三件不能省的事在onLaunch中初始化云开发环境wx.cloud.init并传入env如prod-xxxxx注册全局globalData存放用户 openid、token、购物车数量等跨页面状态拦截onShow检查登录态未登录则跳转到/pages/auth/login—— 这个逻辑决定了「用户一打开小程序就弹登录页」是否生效。提示app.js里没有写wx.login()的具体实现它只负责触发登录流程。真正的登录逻辑在/pages/auth/login.js中通过wx.getUserProfile获取用户昵称头像并用code换取openid再存入云数据库user集合。这是微信 2023 年后强制要求的隐私合规路径旧版wx.getUserInfo已失效。2.2/pages目录页面即业务单元每个文件夹都是独立闭环这不是一堆.wxml堆出来的页面集合而是按「用户旅程」组织的模块化页面组/pages ├── auth/ # 认证模块login、register、bind-phone ├── index/ # 首页轮播图、分类导航、商品瀑布流含下拉刷新 ├── product/ # 商品详情SKU选择、规格弹窗、加入购物车按钮 ├── cart/ # 购物车多选结算、编辑数量、清空逻辑 ├── order/ # 订单模块order-create地址支付方式、order-list待付款/待发货/已完成、order-detail ├── user/ # 个人中心我的订单、优惠券、收货地址、设置 └── admin/ # 后台管理需权限dashboard、product-manage、order-manage每个页面文件夹下都有完整的四件套.js逻辑、.wxml结构、.wxss样式、.json配置。特别注意/pages/order/order-create.js它不是简单跳转而是先调用云函数getAddressList拉取用户地址再调用getCartItems获取购物车商品最后在提交时调用createOrder云函数——这个函数内部完成「扣减库存 生成订单号 写入 orders 表 更新 cart 表状态」四步原子操作。这才是「订单创建」该有的样子不是前端算个总价就发个请求。2.3/cloudfunctions目录云函数即后端7 个函数覆盖全部服务云开发把后端逻辑下沉到云函数这个项目共定义了 7 个核心云函数全部位于/cloudfunctions下每个函数都是一个独立 Node.js 项目含package.json和index.js函数名触发场景关键逻辑login用户首次登录用event.code调用微信接口换取openid查库是否存在不存在则插入新用户记录getProductList首页/分类页加载支持分页event.page,event.pageSize、按分类筛选event.categoryId、按关键词搜索event.keywordcreateOrder提交订单时调用事务性操作先查商品库存db.collection(products).doc(id).field({ stock: true })库存不足则抛错足够则db.collection(orders).add()db.collection(products).doc(id).update({ data: { stock: _.inc(-1) } })payOrder支付按钮点击调用微信统一下单 APIwxpay.unifiedOrder返回prepay_id前端再调wx.requestPaymentupdateOrderStatus管理员发货时调用接收orderId和status如shipped更新orders表并向用户推送模板消息getCouponList我的优惠券页按用户openid查询coupons表过滤过期、已使用、未领取状态adminLogin后台登录校验管理员账号密码明文比对注意生产环境应改为 bcrypt 加密注意所有云函数都用了wx-server-sdk1.10.0这是目前与微信基础库 3.4 兼容最稳的版本。如果你升级到1.12.0db.command.inc可能报错这是 SDK 的已知兼容问题。2.4/components与/utils复用不是口号是写死的规范/components下只有 4 个自定义组件但每个都解决一个高频痛点sku-selector商品规格选择器。它接收props.skuList如[{id:1,name:颜色,values:[红,蓝]},{id:2,name:尺寸,values:[S,M]}]内部用递归渲染多级选择选中后通过this.triggerEvent(select, selectedSku)向父页面广播结果address-item收货地址卡片。封装了「设为默认」「编辑」「删除」三个按钮的点击事件事件回调里直接调用updateAddress云函数empty-state空状态占位图。当productList.length 0时显示避免白屏loading-modal全局加载遮罩。app.js中通过wx.showLoading无法在云函数异步返回前关闭此组件用wx.createSelectorQuery主动监听 DOM 状态确保 loading 结束才隐藏。/utils/request.js是网络请求中枢。它不是简单封装wx.request而是内置了自动携带Authorizationheader值为wx.getStorageSync(token)401 错误统一跳转登录页请求失败时自动重试 2 次retry: 2所有请求加traceIdDate.now() Math.random().toString(36).substr(2, 9)方便排查问题。3. 本地运行全流程从环境准备到首单成交一步都不能跳别信“下载即用”。微信小程序生态的特殊性决定了环境不对代码再好也白搭。下面是我实测验证过的、零误差的启动路径。每一步都标注了「为什么必须这么做」避免你卡在某个玄学环节。3.1 前置条件三件套缺一不可微信开发者工具Stable 1.06.2308310 版本新版工具对云开发支持更完善。旧版如 1.05.x在调用wx.cloud.callFunction时可能静默失败控制台无报错。下载地址去微信官网搜「微信开发者工具稳定版」别用 Beta 版。开通微信云开发环境免费额度够用登录 微信公众平台 → 开发管理 → 开发者工具 → 云开发 → 创建环境。记住你的环境 ID如prod-abc123后面要填进project.config.json和app.js。注意不要选「仅云函数」环境必须选「云开发含数据库、存储、云函数」因为项目用到了数据库products、orders、user三个集合。安装 Node.jsv16.20.2 LTS云函数依赖 Node.js 运行时。v18 版本会导致wx-server-sdk报ERR_OSSL_PEM_NO_START_LINE错误。v14 太老不支持async/await语法糖。v16.20.2 是目前最稳的黄金版本。3.2 初始化项目改三处否则必报错解压源码后打开根目录必须修改以下三处project.config.json中{ description: 微信小程序商城, packOptions: { ignore: [] }, setting: { urlCheck: false, es6: true, enhance: true, postcss: true, minified: true, newFeature: true, coverView: true, nodeModules: true, autoAudits: false, uploadWithSourceMap: true }, compileType: miniprogram, libVersion: 3.4.0, // ← 必须是 3.4.0 appid: wx1234567890abcdef, // ← 替换为你自己的 AppID projectname: wechat-mall, debugOptions: { hidedInDevtools: [] }, isGameTourist: false, condition: { search: { current: -1, list: [] }, conversation: { current: -1, list: [] }, game: { current: -1, list: [] }, miniprogram: { current: 0, list: [{ id: 0, name: 首页, pathName: pages/index/index }] } }, cloudfunctionRoot: ./cloudfunctions/ // ← 路径必须以 / 结尾 }app.js中App({ onLaunch() { // 初始化云开发 wx.cloud.init({ env: prod-abc123, // ← 替换为你创建的环境 ID traceUser: true }); // ...其余逻辑 } });/cloudfunctions/login/index.js中const cloud require(wx-server-sdk); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); const db cloud.database(); exports.main async (event, context) { try { const wxContext cloud.getWXContext(); // ↓↓↓ 这里必须填你公众号或小程序的 AppSecret ↓↓↓ const APP_SECRET your_app_secret_here; // ...后续逻辑 } catch (err) { console.error(err); return { success: false, msg: err.message }; } };提示APP_SECRET在微信公众平台 → 开发管理 → 开发设置 → AppSecret需扫码重置。切勿上传到 GitHub建议在云函数里用环境变量cloud.updateConfig替代硬编码。3.3 云函数部署不是点一下就完事很多人卡在「云函数本地调试正常上传后调用失败」。这是因为上传时没指定 Node.js 版本和依赖。打开微信开发者工具 → 云开发 → 云函数 → 选中login函数 → 点击「上传并部署」在弹窗中务必勾选「使用 npm 构建」在「Node.js 版本」下拉框中选择16.20.2与你本地一致点击「确定」等待构建完成约 30 秒。重复此步骤将getProductList、createOrder、payOrder全部部署。payOrder函数因调用微信支付 API需额外配置在云函数config.json中添加{ wxpay: { appid: wx1234567890abcdef, mch_id: 1234567890, key: your_mch_key_here, notify_url: https://prod-abc123.tcloudbaseapp.com/payNotify } }notify_url是支付结果回调地址需在微信支付商户平台 → API 安全 → 设置 API 密钥和回调地址。3.4 首单实战走通从浏览到支付的全链路启动小程序点击「微信登录」→ 授权昵称头像 → 自动跳转首页点击任意商品 → 进入详情页 → 选择规格如「红色、M码」→ 点击「加入购物车」右上角购物车图标数字变为1→ 点击进入购物车 → 勾选商品 → 点击「去结算」若无地址点击「新增地址」填写 → 返回后选择该地址 → 点击「提交订单」页面跳转至支付页 → 点击「立即支付」→ 弹出微信支付确认框 → 点击「确认支付」支付成功后页面跳转至「订单详情」状态显示「已支付」打开云开发控制台 → 数据库 →orders表 → 查到新订单status字段为paidpay_time有时间戳。这一步成功证明整个数据流前端 → 云函数 → 微信支付 → 回调 → 数据库更新全部打通。4. 常见问题排查血泪经验总结的 5 个翻车点这些坑我都踩过有些甚至浪费了我一整天。列在这里帮你省下至少 6 小时无效调试时间。4.1 现象点击「微信登录」后白屏控制台报Cannot read property getUserProfile of undefined原因微信基础库版本低于 2.10.4而wx.getUserProfile是 2.10.4 引入的新 API。项目app.json中libVersion: 3.4.0要求基础库 ≥ 3.4.0但开发者工具可能默认用旧版模拟器。解决在开发者工具右上角 → 详情 → 本地设置 → 基础库版本 → 切换为3.4.0或更高若无此选项升级开发者工具到最新 Stable 版。4.2 现象云函数getProductList调用返回空数组但数据库里明明有商品原因云函数查询时用了db.collection(products).where({ status: 1 }).get()但数据库中商品status字段是字符串1非数字导致 where 条件不匹配。解决在云函数中统一用字符串比较where({ status: 1 })或在录入商品时用云函数addProduct确保status存为数字类型status: 1。4.3 现象提交订单时报错Error: permission denied原因云函数createOrder尝试写入orders表但云开发数据库安全规则未开放写权限。默认规则是allow read, write: if false。解决进入云开发控制台 → 数据库 →orders表 → 安全规则 → 编辑为// 允许用户创建自己的订单 allow create: if request.auth ! null request.resource.data.userId request.auth.openid; // 允许管理员读取所有订单 allow read: if request.auth ! null request.auth.token.role admin; // 禁止用户删除/更新订单由后台操作 allow update, delete: if false;4.4 现象支付成功后订单状态仍是「待支付」未自动更新原因payOrder云函数中的支付回调地址notify_url未在微信支付商户平台正确配置或配置了但未启用「支付结果通知」。解决登录微信支付商户平台 → 产品中心 → 开发配置 → 支付结果通知 → 填写https://prod-abc123.tcloudbaseapp.com/payNotify→ 点击「保存」→ 下方「支付结果通知」开关必须为「开启」状态。4.5 现象后台管理页/pages/admin/dashboard打不开提示403 Forbidden原因adminLogin云函数校验通过后返回的 token 未存入wx.setStorageSync(adminToken, res.token)导致后续请求无权限头。解决检查/pages/admin/login.js中登录成功后的逻辑if (res.success) { wx.setStorageSync(adminToken, res.token); // ← 必须有这行 wx.switchTab({ url: /pages/admin/dashboard }); } else { wx.showToast({ title: res.msg, icon: none }); }同时/utils/request.js中需在 header 加Authorization: Bearer ${wx.getStorageSync(adminToken)}。5. 二次开发实战从「能跑」到「能改」的三个关键改造点跑通只是起点。真正体现项目价值的是你能基于它快速响应业务变化。下面三个改造点我都在线上项目中落地过不是纸上谈兵。5.1 改造一接入真实微信支付替换沙箱项目默认用的是微信支付沙箱环境sandbox: true只能模拟支付不能真实扣款。要上线必须切到正式环境。步骤登录微信支付商户平台 → 账户中心 → API 安全 → 设置 API 密钥32 位字母数字组合在payOrder云函数的config.json中删除sandbox: true并更新key字段为刚设置的 API 密钥修改payOrder/index.js中的unifiedOrder参数const result await wxpay.unifiedOrder({ body: 商城订单, out_trade_no: orderNo, // 订单号 total_fee: totalPrice * 100, // 单位分 spbill_create_ip: event.ip, // 必须传客户端 IP notify_url: https://prod-abc123.tcloudbaseapp.com/payNotify, // 必须是 HTTPS trade_type: JSAPI, openid: wxContext.OPENID // 用户 openid });关键点spbill_create_ip不能写死必须从event.ip获取云函数上下文自动注入。很多开发者填127.0.0.1导致微信拒单。5.2 改造二增加商品 SKU 库存预警邮件通知当某 SKU 库存 ≤ 5 时自动发邮件给运营人员。这需要扩展云函数能力。方案在createOrder云函数的库存扣减后加一段库存检查逻辑// 扣减库存后 await db.collection(products).doc(productId).update({ data: { stock: _.inc(-1) } }); // 库存预警 const product await db.collection(products).doc(productId).get(); if (product.data.stock 5) { // 调用邮件服务此处用腾讯云 SES const ses new TencentCloud.SESClient({ credential: { secretId: your_secret_id, secretKey: your_secret_key }, region: ap-guangzhou, profile: { httpProfile: { endpoint: https://ses.tencentcloudapi.com } } }); const params { Destination: [opsyourcompany.com], Subject: 【库存预警】${product.data.name} 仅剩 ${product.data.stock} 件, Content: 商品 ${product.data.name}SKU: ${selectedSku}库存已低于 5请及时补货。 }; await ses.SendEmail(params); }注意SES 需提前在腾讯云控制台申请发信域名、验证邮箱并购买发信额度。测试时可先用console.log替代邮件发送确认逻辑正确后再接入。5.3 改造三后台管理页支持 Excel 导出订单管理员常需导出订单数据做财务对账。原项目只有列表展示没导出功能。实现在/pages/admin/order-manage.js中添加导出按钮事件exportExcel() { wx.showLoading({ title: 导出中... }); wx.cloud.callFunction({ name: exportOrderExcel, data: { dateRange: this.data.dateRange // 日期范围筛选条件 } }).then(res { if (res.result.success) { // res.result.url 是云存储中 Excel 文件的临时链接 wx.downloadFile({ url: res.result.url, success: downloadRes { if (downloadRes.statusCode 200) { wx.openDocument({ filePath: downloadRes.tempFilePath, success: () { wx.hideLoading(); wx.showToast({ title: 导出成功, icon: success }); } }); } } }); } }); }对应云函数exportOrderExcel逻辑const cloud require(wx-server-sdk); const nodeExcel require(excel-export); cloud.init(); const db cloud.database(); exports.main async (event, context) { const { dateRange } event; let query {}; if (dateRange dateRange.start dateRange.end) { query.create_time db.command.gte(dateRange.start).lte(dateRange.end); } const orders await db.collection(orders).where(query).get(); const conf { cols: [ { caption: 订单号, type: string }, { caption: 用户昵称, type: string }, { caption: 总金额, type: number }, { caption: 状态, type: string }, { caption: 创建时间, type: string } ], rows: orders.data.map(o [ o.order_no, o.user_nickname || , o.total_price, o.status paid ? 已支付 : o.status shipped ? 已发货 : 待支付, new Date(o.create_time).toLocaleString() ]) }; const result nodeExcel.execute(conf); // 上传到云存储 const fileID await cloud.uploadFile({ cloudPath: exports/orders_${Date.now()}.xlsx, fileContent: result }); return { success: true, url: fileID.fileID }; };依赖安装进入/cloudfunctions/exportOrderExcel目录执行npm install excel-export --save再上传部署。从那以后我每次接到「加个导出功能」的需求都强制走一遍这个流程先看云函数是否已存在类似逻辑 → 没有就新建 → 本地npm install→ 写完用cloud.callFunction测试 → 成功后再改前端调用。这套动作现在 15 分钟就能跑通比在文档里找 API 节省 90% 时间。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑