简介:一套PHP手机端H5商城系统源码包,定位为移动端商城快速搭建参考,面向有PHP基础、希望学习后台配置或做二次开发的开发者,也适用于抖音小店等H5场景。压缩包共346个文件,包含PHP业务代码、JS交互逻辑、CSS样式、GIF演示图片、PNG图标以及SQL数据库脚本和部署文件,整体大小约13.64MB,目录结构清楚,便于按模块检索。随包附带的设置教程覆盖网站配置、短信与支付接口、商品分类与商品管理、工单与订单管理、分站管理、提现审核等模块,从日常配置到运营维护均有说明;其中GIF演示图可以直接展示后台操作步骤,样式备份文件可作为异常恢复参考。测试环境基于Nginx服务器、PHP7.0与MySQL5.6数据库,可帮助读者在本地快速部署实践。目前已有158人学习下载,作者注明源码仅供学习交流,不可线上商业使用。
1. 这一套PHP手机端商城源码到底能干什么,先别急着下载
我见过太多人看到“抖音商城小店源码”几个字就以为是官方接口打通的工具,下载下来发现根本不是那么回事。这套PHP手机端商城源码,本质是一套传统PHP商城系统加一套H5自适应模板,跑在手机浏览器里就是手机商城,电脑浏览器打开也能正常用。“抖音商城小店”更多是使用场景上的定位——很多做抖音带货的人需要给自己导流用户一个H5落地页,这套源码扛的就是这个活儿。系统覆盖网站配置、短信、支付、商品、订单、工单、分站和提现管理,测试环境是Nginx+PHP7.0+MySQL5.6。说白了,它适合拿来学习PHP商城整体架构、跑通从下单到支付的完整流程,也适合做毕业设计或内部演示,但代码附带声明仅供学习交流,没取得版权权限,别直接线上商用。
2. 把环境跑起来:Nginx+PHP7.0+MySQL5.6 一小时搭法
2.1 环境选型:为什么偏偏是 PHP7.0
这套源码不是最新框架写的,代码风格偏传统,很多函数和写法是PHP 5.x时代留下来的。虽然PHP 7.0能跑,但如果你直接上PHP 8.x,大概率会遇到函数被移除、写法不兼容导致的白屏和报错。所以我建议严格按它要求的环境来,别图新。
我一般会用宝塔面板快速建站,PHP版本选7.0,MySQL选5.6,Nginx选1.18以上都行。面板的好处是PHP扩展、伪静态、SSL这些东西点几下就能配好,省去编译的折腾。如果你习惯手动搭,核心就三件事:装好PHP 7.0及常用扩展、配置Nginx站点、建数据库。
2.2 从 zip 到能打开后台的完整步骤
先把源码包解压到站点目录,比如放在/www/wwwroot/shop/。确认目录结构里有application/、public/、thinkphp/这类目录——这套系统基于ThinkPHP 3.x改的,我看过它的文件构成,入口文件在public/下。
# 解压源码包到站点目录 unzip php_h5_shop.zip -d /www/wwwroot/shop # 设置运行目录,入口文件指向 public cd /www/wwwroot/shop chmod -R 755 runtime/ chmod -R 755 public/uploads/提示:
runtime/和上传目录必须给可写权限,否则你登录后台会报“目录不可写”,或者传图片的时候直接白屏。这是新手最容易卡住的第一道坎。
接着建数据库并导入SQL文件。源码包根目录一般有一个shop.sql或者db.sql,用命令行导入最稳:
# 创建数据库,字符集选 utf8 CREATE DATABASE shop DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; # 导入数据 mysql -uroot -p shop < /www/wwwroot/shop/shop.sql导入完成后,去找数据库配置文件。ThinkPHP 3.x 的配置一般在application/Common/Conf/config.php,里面改三处:数据库地址、库名、密码。
'DB_HOST' => '127.0.0.1', // 数据库地址 'DB_NAME' => 'shop', // 数据库名 'DB_USER' => 'root', // 数据库账号 'DB_PWD' => '你的密码', // 数据库密码 'DB_PORT' => '3306', 'DB_PREFIX' => 'tp_', // 表前缀,特别注意别改错配置里面那个DB_PREFIX很关键,它对应SQL文件里的表前缀。如果你建的库导入后表名是tp_user、tp_order这种,前缀就保持tp_,改错了后台全报表不存在的错。
然后配Nginx站点,重点是把运行目录指到public/,同时把PHP解析交给PHP 7.0:
server { listen 80; server_name shop.example.com; root /www/wwwroot/shop/public; index index.php index.html; location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; } } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }这段配置里,root指到public/是为了让入口文件直接对外,rewrite那段是为ThinkPHP的路由做伪静态支持,不然你访问商品详情页会404。fastcgi_pass要跟你PHP-FPM实际监听的地址一致,宝塔里通常是unix:/tmp/php-cgi-70.sock,手动编译的一般是127.0.0.1:9000。
配好之后,浏览器访问http://你的域名/,能看到商城首页说明前端通了。后台入口一般是/admin,个别版本是/index.php/Admin/Login/index,看源码包里的教程,不同二次开发版本改过后台路径。
2.3 后台首次登录和站点配置
用默认管理员账号登录后台,通常是admin+admin123或者admin+123456,教程里大概率写了。登录进去第一件事不是卖货,而是改配置:商城名称、SEO关键词、联系方式都填你自己的,这会直接影响后面短信模板和支付回调里的参数读取。
后台首页能看到订单数、商品数、用户数这些统计,如果这些数字跟导入的SQL里的测试数据对得上,说明连库成功。如果全是0或者直接报错,先按第5章的排查思路走。
3. 后台九大模块逐个过:先配哪个后配哪个,照着点就行
3.1 网站配置与短信配置:先打地基
网站配置模块管的是商城门面,商城名称、LOGO、页头标题、SEO关键词都在这里。我一般先改这里,因为后面很多模块的调用都依赖站点名称,比如订单通知短信里会拼“XX商城给您发货了”。
短信配置这块要单独说。系统支持短信验证码和订单通知,需要你去短信服务商那边申请签名和模板。配置页里一般有四个必填项:API接口地址、账号、密码(或API Key)、模板ID。
| 配置项 | 填什么 | 注意事项 |
|---|---|---|
| 接口地址 | 服务商给的URL | 别带多余空格 |
| 账号 | 服务商后台创建的子账号 | 不是手机号 |
| 密码/Key | 开通服务后生成的密钥 | 泄露了可以重置 |
| 模板ID | 在服务商后台审核通过的模板编号 | 模板变量要跟系统传参一致 |
注意:如果你只是本地测试,短信配置可以先跳过,用测试模式代替。但支付必须有真实配置才能走完下单流程。
3.2 支付接口配置:微信和支付宝的参数别填反
支付配置是这套系统能不能完整跑通的关键。微信支付需要申请商户号,拿到AppID、商户号、API密钥;支付宝需要签约当面付或手机网站支付,拿应用ID和私钥。后台配置页长得很直观,但有几个坑我反复踩过。
第一,回调地址要填成公网能访问的地址。微信支付的回调不能填localhost,本地测试可以用内网穿透工具把回调地址映射出去。第二,API密钥是32位字符串,别把商户平台的登录密码填进去。第三,支付配置页里通常分“微信支付PC端”“微信支付H5端”,你既然做手机商城,重点填H5端的参数。
填完之后有一个验证技巧:去商城前台选一个商品下单,选微信支付,看弹出的二维码。如果二维码能出来且订单状态变成“已支付”,说明配置成功。如果提示“签名错误”,99%是API密钥复制多了空格,或者回调地址跟商户平台设置的不一致。
3.3 商品分类与商品管理:搞懂“分类排序”的层叠关系
商品分类模块支持无限级分类,一级分类下面能挂二级分类,分类图标用的是iconfont.css里的类名,在后台选择图标时会显示预览。排序值越小越靠前,填的时候注意别所有分类都写0,不然顺序不受控。
商品管理里我建议先建立好分类再添加商品。添加商品时有几个字段容易忽略:规格、库存、缩略图。规格在商城系统里通常用JSON格式存,比如颜色:红色,蓝色;尺寸:M,L。前台用户选择不同规格,价格和库存会联动变化,这是H5商城最核心的交互。
商品图片那块,上传后如果前台不显示,去检查public/uploads/目录权限和Nginx配置里有没有对图片目录的location处理。大部分问题出在目录权限,少数是Nginx没有开图片后缀的缓存或alias。
3.4 工单、订单、分站与提现管理:售后链路不能乱
工单模块是给用户提交售后问题用的。用户在前台“我的工单”里发起,后台“工单管理”列表能看到状态(待处理、处理中、已关闭)。回复工单时系统会给用户发短信通知,这个能力依赖前面短信配置是否正常,所以顺序上必须先配短信再开放工单功能。
订单管理是核心中的核心。列表里有订单编号、用户、金额、状态、创建时间,支持组合条件筛选。详情页能看到收货地址、商品明细、支付流水号和物流信息。批量导出一般支持Excel,用PHPExcel类实现的,导出的文件中文列名偶尔会乱码,这跟PHP的mb_convert_encoding有关系,后面排查章节会展开。
分站管理适合做多区域运营,比如你有华北分站、华南分站,可以给每个分站设置独立管理员和权限范围。它的原理是管理员表里加一个site_id字段做数据隔离,分站管理员登录后只能看到自己区域的数据。提现管理主要服务于商家或分销员体系,用户申请提现后,财务在后台审核,同意后走线下打款并把状态改成“已打款”。
4. 二次开发实战:改模板、加字段、开接口的三步走
4.1 样式改造:搞清楚几个CSS文件的分工
源码包里有bui.css、base.css、style.css、iconfont.css这几个关键文件,还有一堆.bak备份文件,第一次看到的别懵。它们的责任边界是这样的:
base.css:重置标签默认样式,管全局字体、颜色、间距bui.css:BUI框架的组件样式,按钮、弹窗、表单控件都靠它style.css:页面级样式,商城首页、列表页、详情页的布局都写在这里iconfont.css:图标字体,分类图标和功能图标从这里输出
我改H5商城样式时,90%的场景只动style.css。比如想让首屏的轮播图高度矮一点,直接在文件里找轮播容器类名改高度,不用动框架文件。.bak文件是历史备份,后台默认不会加载它们,但放生产环境最好删掉。
/* style.css 示例:调整首屏轮播高度 */ .swiper-container { height: 180px; /* 默认是320px,改小一点更清爽 */ }如果你要换主题色,全局搜索#ff6600或brand-color这种关键词,批量替换成你的品牌色。注意有些颜色是写在bui.css里的组件默认色,只改style.css可能不够,两个文件一起改才彻底。
4.2 给商品加自定义字段:从数据库到表单的完整链路
系统自带的商品表字段是固定的,但实际运营经常需要加“产地”“保质期”这类自定义属性。这需要动三层:数据库表、后台表单、前台展示。
先给商品表加字段。看SQL文件里的表前缀,假设是tp_goods:
ALTER TABLE `tp_goods` ADD `origin` VARCHAR(100) DEFAULT '' COMMENT '产地'; ALTER TABLE `tp_goods` ADD `shelf_life` VARCHAR(50) DEFAULT '' COMMENT '保质期';然后在后台商品管理对应的模板文件里,找到商品添加/编辑表单,追加两个输入项。这类模板一般在Application/Admin/View/ Goods/目录下。
<div class="form-group"> <label>产地</label> <input type="text" name="origin" class="form-control" value="{$info.origin|default=''}"> </div> <div class="form-group"> <label>保质期</label> <input type="text" name="shelf_life" class="form-control" value="{$info.shelf_life|default=''}"> </div>最后在前台商品详情页模板里展示。前台模板一般在Application/Home/View/Goods/detail.html,在参数区加一行输出。
<p>产地:{$goods.origin}</p> <p>保质期:{$goods.shelf_life}</p>提示:ThinkPHP 3.x 的模板变量输出写法是
{$变量名},你加字段的时候一定要跟着控制器里的查询结果来,确保$goods数组里包含这两个新字段,否则模板输出是空的。
4.3 开一个H5端商品列表接口
商城默认是服务端渲染,但如果你想对接其他小程序或H5框架,可以单独写一个轻量接口。以下代码放在Application/Api/Controller/GoodsController.class.php里:
<?php namespace Api\Controller; use Think\Controller; class GoodsController extends Controller { public function lists() { $cat_id = I('get.cat_id', 0, 'intval'); $page = I('get.page', 1, 'intval'); $size = I('get.size', 10, 'intval'); $where = ['status' => 1]; if ($cat_id > 0) { $where['cat_id'] = $cat_id; } $model = M('goods'); $list = $model->where($where) ->order('sort_order DESC, id DESC') ->page($page, $size) ->field('id, goods_name, shop_price, market_price, thumb, sales') ->select(); $total = $model->where($where)->count(); $this->ajaxReturn(['code' => 0, 'msg' => 'ok', 'data' => $list, 'total' => $total]); } }这段代码里,I('get.cat_id', 0, 'intval')是ThinkPHP的输入过滤方法,第三参数intval做类型转换,防止SQL注入。M('goods')是快速实例化模型,对应表前缀下的tp_goods表。ajaxReturn是框架封装好的JSON输出方法,前端拿data里的数组循环渲染就行。
接口访问地址就是http://你的域名/index.php/Api/Goods/lists?cat_id=2&page=1。返回的JSON里,code=0表示成功,total是总数,方便前端做分页组件。
5. 避坑与常见问题:PHP7.0兼容、支付回调、乱码,六条血泪记录
5.1 后台登录页白屏,啥都不显示
现象:访问后台地址,页面纯白,按F12看NetWork没加载出任何PHP返回。
原因:PHP代码有语法错误或运行时致命错误,但display_errors没开,错误被吞了。另一个常见原因是runtime/缓存目录写入失败,导致模板编译生成失败。
解决:先在PHP.INI里打开display_errors = On,同时把error_reporting设成E_ALL,再访问一次看具体报错。如果提示目录不可写就chmod -R 755 runtime/。如果是PHP版本导致的语法错误,切换回PHP 7.0。
5.2 商品列表页全部404
现象:点击任意商品分类,URL看着挺正常,但页面返回404。
原因:Nginx伪静态规则没配,或配置里的rewrite写错,ThinkPHP的PATHINFO模式解析不到控制器。
解决:检查Nginx配置里有没有location /下的rewrite ^/(.*)$ /index.php/$1 last;。注意这句必须放在location /里,别放到PHP解析块里,否则静态资源也会被错误路由。
5.3 短信验证码发不出去,接口报“签名不匹配”
现象:前台注册页点“获取验证码”,提示发送失败,日志里写着签名错误。
原因:短信服务商后台的模板内容里变量名跟系统传的参数对不上。比如系统传的是code,你模板里的变量是${code},服务商解析时找不到对应的值。
解决:先去短信服务商后台看模板审核通过的变量名列表,把那几个变量名抄回来,在后台短信配置的“模板变量名”一栏按顺序填,注意顺序不要乱。
5.4 微信支付回调后订单状态不变
现象:钱已经付了,用户微信扣款成功,但商城订单一直显示“待支付”,系统也没发通知短信。
原因:回调地址没对。微信支付的通知URL在商户平台配置的,和你后台支付配置里填的不是同一个,或者回调地址里的域名没备案导致外网访问不了。
解决:把商户平台“API安全”里的回调域名和后台支付配置的回调地址改成完全一致。改完后去支付一笔,看订单详情里的“支付流水号”有没有生成,如果生成了但状态没变,去控制器里查是否有签名验证失败逻辑,在日志里输出微信返回数据。
5.5 导出订单Excel打开是乱码
现象:后台导出订单,Excel打开中文全乱,英文和数字正常。
原因:PHPExcel导出的文件不是UTF-8编码,或者输出的CSV没加BOM头。这跟服务器系统语言环境也有关系。
解决:如果是Excel格式,在导出控制器里加一行ob_end_clean();清除缓冲区再输出;如果是CSV导出,在文件头加"\xEF\xBB\xBF"BOM标识,Excel就能正确识别UTF-8中文。
5.6 修改代码后前台没变化
现象:改了style.css或模板文件,刷新浏览器一看还是老样子。
原因:ThinkPHP有模板缓存机制,编译后的模板文件缓存在runtime/Temp/里,没重新编译。
解决:改完模板后删除runtime/Temp/下的编译文件,或者干脆删整个runtime/目录让它重新生成。CSS文件的问题一般是浏览器缓存了老版本,按Ctrl + F5强制刷新,或者在后端给CSS加版本号参数。
6. 上线前把代码翻一遍:验证后门与关键配置的几个习惯
这套源码是网上流传的,别人二次开发过,我强烈建议你跑通功能后、真实上线前,花半小时把代码里几个关键点过一遍。第一,全目录搜索eval(、base64_decode(、system(、exec(这些高风险函数,搜索到结果就逐个看上下文,确认不是业务逻辑需要才保留。第二,phpinfo函数如果被写在任意一个PHP文件里,等同于把服务器配置公之于众,必须删掉。第三,数据库配置文件的密码如果还是源码包自带的弱密码,先改成强密码再对外。第四,用mysql命令行查一下有没有多出来的管理员账号,网上流传的源码包经常自带测试后门账号,直接删掉只留你自己的。第五,确认public/目录下没有多余的xxx.php.bak这类备份文件,之前就见过有人把带完整数据库密码的配置文件以.bak后缀留在站点里,被搜索引擎收录后信息全裸奔。
我的习惯是:下载源码之后先全程本地跑一遍核心流程——注册、下单、支付回调、发货、提现申请,每走一步就查一次数据库表记录,确认数据真的写进去了。这套流程走完,再考虑放服务器。从那以后我每次接手一套来历不明的PHP源码,都强制先做这轮检查再做业务配置,省下的可全是后悔药。希望帮到你。
本文还有配套的精品资源,点击获取