简介:这是一套面向潮玩盲盒电商创业者的移动端商城系统源码,覆盖盲盒星球、泡泡玛特抽盒机、一番赏等主流玩法,适合具备PHP与ThinkPHP基础、希望快速搭建盲盒商城APP或公众号H5的开发与运营人员。资源包共2000个文件,以1353个js脚本、213个html页面、137个css样式及98个json配置为主,另含8个sql数据库脚本与少量md说明文档,压缩包约215.93MB,前后台结构完整。部署环境为Linux7.6搭配Nginx1.18.0、PHP7.2与MySQL5.6.50,需安装fileinfo、sg11、redis扩展,源码上传后运行目录指向public并配置thinkphp伪静态即可。后台提供平台设置、支付商户配置等模块,前台H5入口与抽盒机交互逻辑均已就绪。目前已有338人学习下载,适合想低成本验证盲盒电商模式、研究抽奖概率与订单流程的读者参考复用。
1. 盲盒抽奖系统源码拆解:从一番赏到抽盒机的完整落地路径
最近半年,潮玩盲盒类小程序和 H5 商城的咨询量明显上涨,不少做私域电商的团队都在找能直接跑的盲盒抽奖系统源码。我手上这套「盲盒星球」移动端源码,覆盖了泡泡玛特风格的抽盒机、一番赏、端盒、碎片兑换等核心玩法,前端是公众号 H5 + 小程序双端,后端 PHP 商城框架,数据库 MySQL。它解决的不是「怎么做一个商城」这种泛需求,而是「怎么把盲盒的概率机制、库存锁定、订单并发这三件事同时跑通」——这才是盲盒系统和普通商城最大的分水岭。适合谁?有 PHP 基础、想快速搭一套潮玩盲盒抽奖平台的后端或全栈开发者,以及需要二次开发自有品牌盲盒小程序的团队。下面按我实际部署和压测的顺序,把这份源码从环境到玩法配置完整拆一遍。
2. 环境部署与目录结构:先让系统跑起来再谈玩法
2.1 运行环境与依赖清单
这套源码对环境的容忍度不算高,PHP 版本卡在 7.2~7.4 之间最稳,8.0 以上会因为部分老扩展报错。我一般会先确认下面这张表里的依赖,缺一个后面都可能卡在安装页。
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| PHP | 7.2 / 7.3 / 7.4 | 8.0+ 部分函数废弃,需改代码 |
| MySQL | 5.7 / 8.0 | 8.0 注意连接认证方式 |
| Nginx | 1.18+ | 需配置伪静态 |
| Redis | 5.0+ | 抽盒库存锁定和队列依赖 |
| 扩展 | fileinfo、redis、gd、bcmath | bcmath 用于概率计算 |
Redis 是这套系统的隐形核心,抽盒的库存扣减、限购计数、开奖队列都走它。如果服务器没装 Redis,安装能过,但一进抽盒页面就会报连接错误——这是最常见的第一个翻车点。
2.2 部署步骤与伪静态配置
把源码包解压到站点根目录后,先改数据库配置,再跑安装入口。下面是我习惯的部署顺序,命令按 Linux 环境写。
# 1. 设置运行目录权限,runtime 和 public/uploads 必须可写 chmod -R 755 /www/wwwroot/blindbox chmod -R 777 /www/wwwroot/blindbox/runtime chmod -R 777 /www/wwwroot/blindbox/public/uploads # 2. 导入基础数据库(安装向导也会建,但手动导入更可控) mysql -uroot -p blindbox < /www/wwwroot/blindbox/docs/blindbox.sql # 3. 修改数据库与 Redis 配置 vim /www/wwwroot/blindbox/config/database.phpdatabase.php里重点改四个参数:hostname、database、username、password。Redis 配置在config/cache.php,把host和port对上即可。改完访问域名/install走安装向导,安装完成后务必删掉install目录,否则存在重装风险。
Nginx 伪静态是第二个高频坑。盲盒系统的抽盒、订单回调、支付通知都依赖 URL 重写,伪静态没配好会出现「页面能开但接口 404」。
location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } }这段规则的意思是:请求的文件不存在时,统一交给index.php处理,s参数携带原始路径。配完重载 Nginx,再访问后台/admin,能出登录页基本就通了。
2.3 目录结构与核心模块定位
跑起来之后别急着点功能,先认清目录,二次开发能省一半时间。这套源码是典型的 MVC 分层,application下按模块拆:
application/admin:后台管理,商品、概率、订单、用户都在这里application/api:小程序和 H5 调用的接口层application/home:公众号 H5 前端控制器extend:概率算法、支付、短信等扩展类public/uploads:盲盒封面、商品图、开奖动画资源
抽盒核心逻辑一般在application/api/controller/Box.php这类文件里,概率计算和库存锁定是重点。我建议先把extend下的概率类读一遍,再动后台配置,不然改了概率不知道底层怎么算的,很容易出现「后台设 1%,实际抽出来完全不是那么回事」的玄学问题。
3. 盲盒核心玩法配置:概率、库存与一番赏机制
3.1 抽盒概率模型与权重配置
盲盒系统的灵魂是概率,但很多人把它想简单了。这套源码用的是「权重区间」模型,不是直接填百分比。后台每个奖品有一个weight字段,系统把所有奖品权重求和,再按区间随机落点。
// extend/Probability.php 简化逻辑 public function draw($prizes) { $total = array_sum(array_column($prizes, 'weight')); // 权重总和 $rand = mt_rand(1, $total); // 随机落点 $sum = 0; foreach ($prizes as $prize) { $sum += $prize['weight']; if ($rand <= $sum) { return $prize; // 命中该奖品 } } }逻辑说明:weight越大命中概率越高,但它是相对值不是绝对值。比如三个奖品权重分别是 1、9、90,总权重 100,实际概率就是 1%、9%、90%。参数怎么改?后台「概率管理」里改weight即可,改完不用重启。这里有个血泪经验:权重不要设成 0,设 0 在某些版本里会导致区间计算异常,想禁掉某个奖品应该用「下架」而不是权重归零。
3.2 库存锁定与并发防超卖
盲盒抽奖最怕的不是概率不准,是超卖。用户同时点抽盒,库存扣减没锁住,就会出现「奖品发完了还有人抽中」。这套源码用 Redis 做库存预扣,再异步落库,思路是对的,但配置不对照样翻车。
// 抽盒前先原子扣减 Redis 库存 $key = 'box_stock_' . $boxId; $stock = Redis::decr($key); if ($stock < 0) { Redis::incr($key); // 回滚 return ['code' => 0, 'msg' => '库存不足']; } // 扣减成功再走概率和订单创建逻辑说明:decr是原子操作,多个请求同时进来只有一个能把库存减到 0 以下,其余会被回滚。参数上要注意 Redis 库存必须和数据库库存做定时同步,否则 Redis 重启后数据丢失会直接超卖。我一般会加一个每分钟执行的对账脚本,把 Redis 库存和 MySQL 库存对齐。
提示:压测时用
ab或wrk模拟 200 并发抽盒,观察是否出现负库存。如果出现,先查 Redis 是否真的连上,再查扣减逻辑有没有被绕过。
3.3 一番赏与端盒玩法配置
一番赏和普通抽盒的区别在于「奖池固定、抽完即止」。这套源码里一番赏是独立模块,后台建活动时选「一番赏」类型,然后配置每个奖项的数量,比如 A 赏 1 个、B 赏 3 个、Last 赏 1 个。抽走一个库存减一,抽完自动下架。
端盒玩法则是「整盒购买必出隐藏款」的逻辑,后台需要设置每盒的款式数量和隐藏款位置。配置时注意「端盒」和「散抽」要分开建 SKU,否则库存会互相污染。我见过有人把端盒和散抽挂在同一个商品下,结果散抽把端盒的隐藏款提前抽走了,用户投诉到平台——这种坑配置阶段就能避开。
4. 支付回调与订单状态机:最容易出问题的环节
4.1 支付回调的幂等处理
盲盒系统订单量大、回调频繁,支付回调不做幂等,就会出现「一次支付、多次发货」。这套源码的回调入口在application/api/controller/Pay.php,核心是先用订单号查状态,已处理就直接返回成功。
public function notify() { $orderNo = input('out_trade_no'); $order = Db::name('order')->where('order_no', $orderNo)->find(); if ($order['status'] == 1) { return 'success'; // 已处理,直接返回,保证幂等 } // 未处理才走发货和状态更新 Db::name('order')->where('order_no', $orderNo)->update(['status' => 1]); $this->deliver($order); // 发货逻辑 return 'success'; }逻辑说明:status == 1表示已支付已处理,重复回调直接返回success,避免重复发货。参数上要确保order_no有唯一索引,否则并发回调可能查到两条。这个幂等判断是后悔药,没有它,支付平台重试机制一触发就是灾难。
4.2 订单状态机与异常订单排查
盲盒订单状态比普通商城多,一般有:待支付、已支付待发货、已发货、已完成、已退款、抽盒中。状态流转必须单向,不能跳。排查异常订单时,我习惯先看三张表:order(主订单)、order_detail(奖品明细)、box_log(抽盒记录)。三张表对不上,基本就是并发或回调问题。
常见现象是「用户付了钱但订单还是待支付」。原因通常是回调没进来,或者回调进来了但验签失败。解决方法是先查支付平台的回调日志,再查服务器 access log 里有没有回调请求。如果请求到了但没处理,多半是验签密钥配错。
5. 避坑与常见问题排查
5.1 抽盒概率与后台显示不一致
现象:后台设某奖品 5%,实际抽了几百次明显偏高或偏低。原因:权重是相对值,如果其他奖品权重也改了,实际百分比会变;另外有些版本缓存了概率配置,改完没清缓存。解决:改完概率后在后台点「清除缓存」,或者手动删runtime/cache目录,再用权重总和反算实际百分比验证。
5.2 Redis 未连接导致抽盒报错
现象:进抽盒页面提示「系统繁忙」或直接 500。原因:Redis 没启动、密码不对、或者 PHP redis 扩展没装。解决:命令行redis-cli ping看是否返回 PONG,再检查config/cache.php里的密码和端口,最后确认php -m | grep redis有输出。
5.3 支付回调重复触发导致重复发货
现象:用户只付了一次,却收到两份奖品。原因:回调没做幂等,或者订单号没唯一索引。解决:按 4.1 的逻辑加状态判断,并给order_no加唯一索引。已经发出去的只能人工追回,所以这个坑一定要在测试阶段用支付平台的重试功能模拟验证。
5.4 小程序端接口 404 或跨域
现象:H5 正常,小程序请求接口报 404 或跨域。原因:小程序要求 HTTPS 且域名备案,接口路径没配到合法域名里。解决:在微信后台配置 request 合法域名,确保接口走 HTTPS,Nginx 里补上跨域头。注意小程序不支持 localhost 调试,必须用真实域名。
5.5 安装后后台无法登录
现象:安装成功但后台登录提示账号密码错误。原因:安装时填的管理员账号没写进库,或者数据库前缀和配置文件不一致。解决:直接查admin表看有没有记录,没有就手动插一条,密码用md5加密。前缀不一致就改database.php里的prefix。
6. 二次开发与压测验证:把系统跑稳的最后一公里
二次开发前,我强烈建议先做一轮压测,摸清系统瓶颈在哪。这套源码在 2 核 4G 的机器上,单机 Redis + MySQL,抽盒接口大概能扛 150~200 QPS,再往上 Redis 和 MySQL 连接数就会成为瓶颈。压测命令用wrk最省事:
# 模拟 100 并发、持续 30 秒压测抽盒接口 wrk -t4 -c100 -d30s --latency \ -s post.lua \ http://your-domain/api/box/drawpost.lua里带上用户 token 和盲盒 ID。重点看三个指标:Latency平均延迟、Requests/sec吞吐、以及压测后数据库库存有没有变成负数。如果延迟飙到 500ms 以上,先查慢 SQL,多半是订单表没加索引。
二次开发最常改的三个地方:概率算法(换成更复杂的保底机制)、UI 主题(换皮肤)、支付渠道(接自己的商户号)。改概率算法时,记得保留原来的权重模型作为兜底,别一上来就重写,否则出问题连对比的基准都没有。改支付渠道时,回调验签逻辑一定要自己重写一遍,不能直接套用示例代码里的密钥。
进阶技巧上,我习惯给抽盒接口加一层「用户维度限流」,用 Redis 记录每个用户每分钟的抽盒次数,超过阈值直接拒绝。这能挡住脚本刷奖,也能减轻数据库压力。实现很简单,抽盒前incr一个带用户 ID 和分钟时间戳的 key,设 60 秒过期,超过 30 次就返回「操作频繁」。
从那以后我每次部署这类盲盒系统,都会强制走一遍「压测 → 对账 → 回调重试」三件套,不跑完不交付。概率和库存这两件事,上线前多花一小时验证,上线后能少熬三个通宵。希望帮到你。
本文还有配套的精品资源,点击获取