简介最新修复版H5农场牧场养殖理财鸡游戏运营源码定位为可直接运营的网站游戏项目适合有建站基础、希望搭建休闲理财类H5游戏的个人或团队二次开发。资源包共2271个文件约88.4MB主体由HTML页面、JavaScript逻辑、JSON配置与数据、CSS样式构成并包含Java/JSP服务端源码、SQL数据库脚本、YAML/properties配置及Markdown说明文档目录分类清晰便于按前端展示、后端接口、数据表结构等模块检索和修改。已有198人学习下载。玩法围绕母鸡下蛋、鸡蛋买卖展开内置交易商城、饲料喂养、推广与短信接口当前短信接口可用并支持对接免签约支付可快速搭建线上交易闭环商城、会员、订单等模块也适合按业务需求二次调整。除了可直接部署外源码还展示了H5游戏常见的任务、收益、用户体系等实现思路适合学习前后端数据交互、支付接口集成及推广功能设计。1. 四月修复版H5农场养殖鸡蛋理财鸡源码先认清它能解决什么再决定下载做运营的人拿到一套 H5 农场养殖源码第一反应往往是“这东西能不能直接上线收钱”。前阵子我得到一套标注为“四月修复版”的 H5 农场养殖鸡蛋理财鸡游戏运营源码修复点集中在支付回调、产蛋任务、提现状态这几个最容易翻车的地方。整套源码包含前端 H5 页面、后端管理接口和数据库脚本核心玩法是玩家领养小鸡、喂养后产蛋再把鸡蛋出售或合成新鸡最终走免签约支付通道完成充值与提现。它适合想快速搭建一个可试运营的模拟经营类小游戏的人也适合拿来做源码级学习看一套带支付闭环的小游戏到底怎么把“鸡生蛋、蛋生鸡”的规则跑起来。2. 源码包拆解从注册到提现整条链路藏着这些设计2.1 玩家侧的核心玩法闭环领养、喂养、产蛋、合成与出售先看玩家侧的完整路径。用户打开 H5 页面后注册登录系统赠送一只初始小鸡。小鸡按“成长值”随时间增加玩家消耗饲料或金币喂养后成长值攒满会进入可产蛋状态。产蛋不是前端定时触发的动画而是后端定时任务统一结算这么做是为了防止用户改本地时间刷鸡蛋。源码里这段逻辑在api/cron/egg_settle.php它每分钟扫描一次所有达到产蛋条件的鸡写入库存并生成一条产出记录。// 伪代码示意产蛋结算任务 $chickens ChickenModel::where(status, ready) -where(next_egg_time, , date(Y-m-d H:i:s)) -limit(500) -get(); foreach ($chickens as $chicken) { DB::beginTransaction(); try { $eggCount eggYield($chicken-star_level); // 根据星级计算产蛋数 Inventory::add($chicken-user_id, egg, $eggCount); $chicken-next_egg_time date(Y-m-d H:i:s, time() $chicken-star_level * 3600); $chicken-save(); DB::commit(); } catch (\Exception $e) { DB::rollBack(); logger()-error(egg_settle_fail, [chicken_id $chicken-id, error $e-getMessage()]); } }这段代码里eggYield()按星级返回不同鸡蛋数一星到五星的基础产蛋分别是 1、2、4、8、16。next_egg_time是下一次可产蛋时间用 MySQL 的DATETIME存储定时任务里用判断避免重复产蛋。事务包裹库存和状态两个操作保证不会出现“库存加了但鸡状态没更新”的脏数据。这里要注意limit(500)是为了防止一次性扫描全表高并发时你可以改成循环分页处理。合成逻辑放在api/trade/compose.php。玩家用 10 个鸡蛋换一只更高星级的小鸡合成后旧鸡删除、新鸡写入。前端只做弹窗提示真正的判断在服务端完成数量够不够、仓库是否锁定、单日合成次数有没有超限。2.2 管理后台的关键配置产蛋率、回收价格、提现门槛后台是整个运营的中枢我看完这套源码后印象最深的是它的site_config表几乎把经济模型相关的参数全部外置了。你不需要改代码就能调整产蛋速度、出售价格、提现门槛。表格字段大概是这些配置键默认值作用egg_rate1.0全局产蛋倍率调成 1.2 就是所有产出提高 20%sell_price0.05每个鸡蛋回收给系统的单价单位是元withdraw_min10最低提现金额低于这个值不让发起提现withdraw_fee_rate0.06提现手续费比例0.06 表示扣 6%compose_star_limit5合成最高星级超过后不可再合成daily_withdraw_limit100单用户单日提现上限这些参数都在后台“系统设置”里可视化编辑修改后立即生效无需重启服务。运营时你不需要天天改代码只要盯着用户产出和提现数据调参即可。提现流程走的是人工审核 第三方代付。用户在 H5 端发起提现后生成一条withdrawals记录状态为pending。后台管理员看到申请后核对真实姓名、账号、金额点击通过后系统调用支付通道的代付接口打款打款成功再把状态置为success。这套流程里比较关键的是审核状态和打款结果要分开记录源码里给withdrawals表加了audit_status和pay_status两个字段避免“已打款但没审核通过”这类状态错乱。2.3 数据库表关系与几个关键索引数据库共 18 张表核心几张是users玩家、chickens用户的小鸡、inventory仓库、egg_records产出记录、orders充值订单、withdrawals提现单、pay_config支付配置。建表时有两个地方值得关注。第一是chickens表的user_id status next_egg_time组合索引定时任务靠status过滤“可产蛋”的小鸡靠next_egg_time过滤“到点”的鸡没有这个索引的话数据量过万后任务会越来越慢。ALTER TABLE chickens ADD INDEX idx_settle (status, next_egg_time); ALTER TABLE orders ADD UNIQUE KEY uk_out_trade_no (out_trade_no);第二是orders表的out_trade_no唯一索引。支付回调可能重复推送幂等性完全靠这个唯一约束兜底同一笔订单你永远只能成功写入一次第二次插入会直接报错。后文说支付对接时还会再提到这个坑。3. 从源码到可访问的站点部署这台 H5 农场的完整路径3.1 环境准备PHP、MySQL、Redis 一个都不能少这套源码的后端是用 PHP 写的入口在public/index.php同时依赖 Redis 做缓存与队列。整体环境是 LNMPLinux Nginx MySQL PHP 7.4。PHP 需要安装pdo_mysql、redis、bcmath、curl、openssl、fileinfo这几个扩展bcmath容易被忽略但它能保证金额计算不出现浮点误差支付模块每次都靠它算金额缺失的话回调验签会报函数不存在。我用的是宝塔面板做演示也可以直接用命令行装核心步骤一致。装完后先确认扩展齐全再继续后面操作。php -v php -m | grep -E pdo_mysql|redis|bcmath|curl|openssl|fileinfo如果没有redis扩展用pecl install redis装上再重启 PHP-FPM。这套源码的登录态和产蛋队列都走 Redis没装会导致用户登录后立刻掉线排查起来很像“灵异事件”其实是缓存没连上。3.2 数据库初始化与环境配置改三个地方少走弯路源码包里有一份sql/install.sql这是初始化脚本。新建一个数据库后直接导入再把源码根目录下的.env.example复制成.env然后改下面三处。APP_URLhttp://你的域名 DB_HOST127.0.0.1 DB_PORT3306 DB_NAMEfarm_game DB_USERroot DB_PASSWORD你的密码 REDIS_HOST127.0.0.1 REDIS_PORT6379 REDIS_PASSWORD注意APP_URL必须和前端访问地址保持一致。前端 H5 里所有接口请求都是基于这个地址拼接的如果你配成localhost手机扫码打开页面后请求都会发到用户自己的手机上接口全挂。REDIS_PASSWORD如果 Redis 没设密码就留空但生产环境强烈建议给 Redis 设个密码否则容易被人扫到后直接清缓存。导入数据库后建议顺手执行一次迁移脚本把admin_users表里默认管理员的密码重置掉。源码默认管理员账号密码写在安装文档里上线前必须改这属于基础安全动作。mysql -u root -p farm_game sql/install.sql导入成功后会看到chickens、orders等表。如果导入过程中报 “Unknown collation”检查一下 SQL 文件头部指定的字符集是否与你数据库默认字符集一致改成utf8mb4_general_ci再导入即可。3.3 Nginx 配置与前后端联调站点根目录必须指向 publicNginx 配置是这套源码最容易出问题的地方。项目目录不能直接作为站点根目录必须指向public子目录否则index.php和各类静态资源全部暴露在可下载路径下别人直接访问源码文件就能拖走整套代码。下面是一份可用的 server 配置。server { listen 80; server_name your-domain.com; root /data/www/farm/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ .*\.(js|css|png|jpg)$ { expires 7d; access_log off; } }try_files那行是把所有非真实文件请求都转给index.php处理这是 PHP 框架最常见的伪静态写法。如果你后端不是标准入口而是路由文件也可以把index.php换成router.php但本质上都是“统一入口 路径解析”。配好后访问http://你的域名/api/ping能看到一个 JSON 返回说明后端已通。这时候还有一个隐藏点H5 前端是单独部署的静态文件包通常放在另一个目录跑nginx -s reload即可。如果前端想跟后端放同一个域名下就把静态文件放到public/h5目录里保证请求同源还能少配一层跨域。3.4 定时任务与守护进程产蛋、超时关单、支付对账部署完站点后必须把定时任务配好否则游戏里的鸡永远不会下蛋。源码里提供了一份crontab.example我的做法是直接用crontab -e挂上去。* * * * * php /data/www/farm/think egg:settle /data/www/farm/runtime/cron_egg.log 21 */5 * * * * php /data/www/farm/think order:close /data/www/farm/runtime/cron_order.log 21 */10 * * * * php /data/www/farm/think pay:query /data/www/farm/runtime/cron_pay.log 21三行的频率分别是每分钟、每 5 分钟、每 10 分钟。egg:settle是产蛋结算不能改得太慢否则玩家会觉得鸡半天不下蛋。order:close负责关闭超时未支付的订单避免玩家生成一个支付链接后几小时再付款造成状态错乱。pay:query是支付对账的重试机制后面讲支付对接时还会细说。全部配完后用tail -f runtime/cron_egg.log观察输出正常情况下应该能看到每次执行成功或空跑的结果出错时日志会直接打出异常堆栈。4. 对接免签约支付接口避开验签、回调、掉单三个大坑4.1 免签约支付的接入模型通道方统一收款回调通知到你的服务器这套源码最大的卖点是“免签约支付”意思是运营者不需要自己申请商户号支付通道方会提供一个公共收款接口。玩家付款后通道方服务器向你的回调地址发送异步通知你在回调里验签、改订单状态、发鸡蛋。这里有一个概念要理顺订单状态不是你在前端改的所有真实状态都以支付通道的异步通知为准。配置位置在后台的“支付配置”页需要填四个参数商户号mch_id、应用IDapp_id、密钥app_secret、回调地址notify_url。参数示例说明mch_id1000234通道方分配的商户编号app_id8f4f2b6e应用标识用于区分不同项目app_secretabc123...密钥用于签名不能泄露到前端notify_urlhttps://你的域名/api/pay/notify接收异步通知的完整地址必须公网可访问回调地址必须是一个完整的公网 URL不能写localhost或内网 IP否则你家服务器的支付回调永远打不通。另外千万不要把app_secret写进前端代码它只允许出现在服务端配置里。有些人图省事把它直接写死在 H5 页面里聪明的用户抓包看源码后就能伪造其他玩家的充值成功请求。4.2 生成签名与回调验签后端必须按这个顺序写签名算法不复杂但顺序很重要。通道方通常要求把参数按字典序排列拼接后加上密钥做 MD5转大写就是签名。支付回调时你也要在服务端重新计算一遍签名再和回调参数里的sign比对完全一致才说明数据没有被篡改。下面是生成签名的示例。// 生成签名请求支付时与服务端验签共用同一套逻辑 function makeSign(array $params, string $secret): string { // 1. 过滤空值和 sign 本身 $params array_filter($params, function ($value) { return $value ! $value ! null; }); unset($params[sign]); // 2. 按字典序排序 ksort($params); // 3. 拼接成 abcd 格式 $str urldecode(http_build_query($params)); // 4. 拼接密钥并 MD5 加密转大写 return strtoupper(md5($str . key . $secret)); }http_build_query生成的字符串里空格和中文会被 URL 编码所以先urldecode还原再和密钥拼接。这个细节直接影响验签能否通过。回调处理代码写在api/pay/notify.php里必须按下面这个顺序执行// 1. 先接收原始数据 $rawBody file_get_contents(php://input); $data json_decode($rawBody, true); // 2. 验签失败直接返回 fail if (!verifySign($data, $data[sign])) { file_put_contents(/tmp/pay_fail.log, $rawBody . PHP_EOL, FILE_APPEND); echo fail; exit; } // 3. 查订单不存在不能按成功处理 $order Order::where(out_trade_no, $data[out_trade_no])-first(); if (!$order) { echo fail; exit; } // 4. 校验订单金额防止回调金额和实际订单不一致 if (bccomp($order-amount, $data[amount], 2) ! 0) { echo fail; exit; } // 5. 判断状态已经成功的订单直接返回 success幂等 if ($order-status paid) { echo success; exit; } // 6. 更新订单并给用户加库存 DB::transaction(function () use ($order) { $order-status paid; $order-paid_at date(Y-m-d H:i:s); $order-save(); Inventory::add($order-user_id, egg, $order-egg_amount); }); echo success;这段逻辑里验签放第一关订单存在检查第二关金额比对第三关幂等第四关最后才是事务更新。千万不能先改订单状态再验签否则攻击者用一个带正确订单号的假回调就能把自己的订单改成已支付。验签时的hash_equals也要提一下。比较两个字符串是否相等时用hash_equals($sign, $calculatedSign)它能避免时间差侧信道攻击。直接写不是不能用只是严谨的签名校验都建议用hash_equals。4.3 掉单处理与对账机制别只依赖回调支付回调不是 100% 必达的。网络抖动、通道方服务重启、Nginx 超时都可能导致你的服务器收不到通知。如果只靠回调用户付了钱但鸡蛋迟迟不到账投诉立刻就来。源码里处理掉单的方式是“主动查询 定时对账”。启动一个pay:query定时任务扫描所有状态为pending且创建时间超过 5 分钟的订单调用支付通道的“订单查询接口”确认支付状态// 对账任务查询超过5分钟仍未支付的订单 $pendingOrders Order::where(status, pending) -where(created_at, , date(Y-m-d H:i:s, time() - 300)) -limit(200) -get(); foreach ($pendingOrders as $order) { $result PayChannel::queryOrder($order-out_trade_no); if ($result[status] paid) { // 复用回调里的状态更新逻辑保证一致 markOrderPaid($order-id); } }markOrderPaid里的逻辑要和回调处理完全一致订单状态更新、库存落账、流水记录缺一不可。这样即使回调丢失最多 10 分钟内后台也会把订单捞回来。仍有个别订单两边都没查到这类订单最终靠运营后台的手动对账按钮处理管理员核对支付流水截图后手动置为已支付。你上线后第一周最好每天早中晚各看一次runtime/cron_pay.log掉单发生频率通常能看出通道方接口是否稳定。5. 运营运维避坑四个实际翻车现场与排查思路5.1 现象玩家已经提现成功后台订单却一直显示未支付支付通道返回“打款成功”但后台订单还是pending玩家截图来问为什么没到账。原因是回调和订单状态走了两条独立路径回调用旧逻辑只改了pay_status而提现审核页面看的却是audit_status两个字段没同步更新。解决办法是统一状态机把后台订单详情页的状态展示改为基于pay_status计算同时数据库里加一个调度任务每分钟把已打款订单的audit_status也刷成通过保证两边永远一致。5.2 现象产蛋数量随机变少库存偶尔出现负数多条产蛋记录同时写入时A 用户和 B 用户的订单在同一秒内都触发同一只鸡的结算库存扣减被覆盖。我遇到过库存从 5 变成 -2 的情况。原因是没有给库存操作加行级锁也没做乐观锁控制。正确做法是产蛋和合成操作都在事务里执行并且对inventory表加FOR UPDATE行锁锁住用户那一行再更新数量。更简单的方式是给egg_records表加user_id chicken_id settle_time唯一索引重复结算直接报错不会静默写脏数据。ALTER TABLE egg_records ADD UNIQUE KEY uk_user_chicken_time (user_id, chicken_id, settle_time);5.3 现象支付回调日志有记录但数据库订单状态没更新日志显示回调进来了echo success也输出了但订单还是未支付。原因是事务提交失败被外层吞了异常或者 MySQL 在事务里更新完订单后没有真正 commit。排查时先看 MySQL 错误日志多半是字段长度不够比如paid_at字段设计成DATE类型存不了完整时间。解决方法是把所有时间字段统一改成DATETIME并给关键操作加上异常上报回调处理里出现异常时一定要记录完整的堆栈和参数不能静默吞掉。5.4 现象H5 页面白屏手机打开后接口全部请求失败前后端分离部署时前端文件和后端 API 不在同一个域名浏览器的跨域策略会拦截请求。最常见的情况是前端部署在https://h5.xxxx.com后端在https://api.xxxx.com没有配置 CORS浏览器直接拒绝读取响应。解决办法是 Nginx 在 API 站点加上跨域响应头同时前端所有请求走同一个域名也能彻底绕开。location /api/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers Content-Type,Authorization; add_header Access-Control-Allow-Methods GET,POST,PUT,OPTIONS; }生产环境建议别用*改成具体的 H5 域名否则你的接口可以被任意网站跨域调用容易诱发刷接口的风险。6. 上线前最后一道护身符参数调优、备份与自检清单6.1 关键运营参数的调整建议不要直接沿用源码默认参数上线。以我的经验第一版运营参数按“养鸡成本回收周期 3 到 5 天”来设计比较稳妥。参考配置参数一星级五星级单次产蛋间隔1 小时2.5 小时单次产蛋数116鸡蛋回收价格0.05 元0.05 元合成下一星级需要鸡蛋数1080参数调整成什么样取决于你的推广渠道成本。如果拉新成本高就把前三天产蛋率上调 20%先让玩家快速看到收益再考虑留存。提现门槛建议设成充值金额的 0.7 倍到 0.8 倍避免低价值用户批量注册套走小额资金。6.2 数据备份与恢复演练让数据找回不再依赖运气运营游戏最怕的就是数据库误删或被人拖库。我每次部署完都会把备份脚本固定下来每天凌晨自动执行一次保留最近 14 天。#!/bin/bash BACKUP_DIR/data/backup/farm DATE$(date %Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR mysqldump -u root -p密码 farm_game | gzip $BACKUP_DIR/farm_$DATE.sql.gz find $BACKUP_DIR -name *.sql.gz -mtime 14 -delete把脚本放进crontab每天晚上 2 点执行。但备份不等于安全每月强制做一次恢复演练把备份文件导入一台临时服务器验证可用性。我见过有人备份了三个月恢复时才发现 SQL 文件是坏的等于没备份。6.3 上线自检清单用一组命令扫完所有关键环节上线前一小时我会依次执行下面这组检查全部通过才开放注册入口。# 1. 检查关键接口是否返回正常 JSON curl -s https://你的域名/api/ping # 2. 检查定时任务日志是否持续更新 tail -n 20 /data/www/farm/runtime/cron_egg.log # 3. 检查 DEBUG 是否关闭 grep APP_DEBUG /data/www/farm/.env # 4. 检查站点根目录是否指向 public curl -s -o /dev/null -w %{http_code} https://你的域名/.env第四步很关键如果返回200说明你的.env文件可以直接被下载数据库密码、支付密钥全部暴露马上把 Nginx 根目录改到public并加上禁止访问.env的规则。从那以后我每次部署这套农场游戏无论再怎么赶时间都会强制走一遍自检脚本再手动发起一笔一分钱支付验证回调链路。等到玩家问“我充值怎么还没到账”时再去修接口那时候丢的不只是口碑还有整套环境的安全性。希望这份拆解帮你在部署这套 April 修复版 H5 农场源码时少走几个坑祝你顺利上线。本文还有配套的精品资源点击获取