ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微信H5游戏源码解析:三级分销逻辑与支付回调部署实战

微信H5游戏源码解析:三级分销逻辑与支付回调部署实战 简介这是一份面向微信小游戏开发者和网络营销从业者的「新版微信夹娃娃抓猴子网络赚钱游戏2.0」完整源码包集成了夹娃娃、抓猴子类互动玩法与三级分销体系适合用于搭建带邀请返利机制的休闲赚钱类H5小游戏。资源共981个文件压缩包大小10.68MB主要包含224个PHP后台逻辑与接口、110个JS前端交互、41个CSS样式、66个SQL数据库脚本以及大量gif、png等图片素材与ttf字体资源同时附带配置文件和备份文件可支撑从数据库搭建到前端页面配置的完整部署流程。内容预览显示项目包含后台管理、支付与分成相关php文件和配置备份便于二次开发时对照修改。已有55人学习/下载适合具备一定PHP基础、希望快速上线并运营微信小游戏变现项目的开发者参考也可作为研究三级分销玩法的实战案例。1. 微信H5游戏源码夹娃娃与三级分销的坑这套微信H5游戏源码包打开之后你会看到入口文件是u.asp备份文件是zhuanqian.php.bak和config.php.bak前端却用了H-ui和layui。它不是标准PHP课程设计而是一套在微信浏览器里跑H5小游戏、靠三级分销返利做裂变的运营工具。核心玩法是“夹娃娃/抓猴子”这类积分游戏用户充值、玩游戏、赢取虚拟奖品同时通过专属链接邀请下级上级按三档比例拿返佣。对于想研究微信H5支付、分销结算逻辑或者打算基于它做二次开发的工程师来说代码里最有价值的不是游戏画面而是那套PHP分销售后与回调对账流程。下面直接按“结构还原 → 分销模型 → 微信支付 → 部署清理”的顺序拆解给出可执行的代码和配置。2. 从文件列表还原项目结构u.asp、php.bak与web.config拿到混杂源码第一件事不是跑起来而是先把文件角色对号入座。这个压缩包里没有完整目录树只有十几个文件但恰恰是这些文件暴露了项目的真实结构早期它可能由ASP编写后来迁移到PHP或者反过来前端静态页挂在IIS上后端接口单独用PHP处理。2.1 入口文件u.asp与备份文件的迁移关系u.asp是典型的ASP入口路径早期的微信端页面经常用简短的a.asp、u.asp作为入口。配合zhuanqian.php.bak和config.php.bak两个备份文件基本可以断定源码在从ASP向PHP迁移过程中部署人员把配置和支付接口备份成了.bak而没有及时清理。在IIS环境下web.config是站点级配置包含默认文档、伪静态规则和HTTP响应头。如果你想在本地还原运行环境我一般会先建一个Windows Server IIS PHP 7.2环境。注意PHP版本不要一上来就上8.x这套代码里的mysqli和bcmath用法很可能是老式风格PHP 8下会被强类型报错打断。如果一定要用PHP 7.4以上需要先跑一遍php -l语法检查。C:\php7.2\php.exe -l zhuanqian.php.bak C:\php7.2\php.exe -l config.php.bakphp -l只做语法解析不会执行代码因此能快速定位分号缺失、变量名错误等问题。注意.bak后缀不会影响php.exe识别但需要保证文件是纯UTF-8不带BOM否则IIS下容易输出页面空白。这里我们先用语法检查确认备份文件能复用再决定下一步是改名还是只提取关键代码。2.2 UI与前端资源配置H-ui、layui和games_widget前端文件里有H-ui.css、H-ui.min.css、layui.css还有games_widget_f94212b.css和default.css。H-ui与layui是两套不同的UI框架同时存在说明后台页面可能用的是H-ui而游戏/活动页用的是layui。games_widget_f94212b.css从命名看像打包工具生成带hash版本的前端组件样式这类文件一般不需要改动可以原样放到静态服务器。微信内打开的H5对CSS兼容性要求不高但对微信浏览器缓存很敏感。改完前端文件后建议在web.config里给静态资源增加far future缓存头但调试时又要禁止缓存。我通常的做法是调试阶段直接注释缓存规则上线前再放开。下面是一段IIS的Cache规则示例configuration system.webServer staticContent clientCache cacheControlModeUseMaxAge cacheControlMaxAge00:00:00 / /staticContent /system.webServer /configuration这里的cacheControlMode设置为UseMaxAgecacheControlMaxAge为0表示每次请求都重新验证。你上线时可以改成30.00:00:0030天。不过要注意.bak文件默认是文本类型会被直接下载必须用remove和mimeMap禁止访问。这一点先埋在5.2节最后统一处理。2.3 文件清单与角色表先不要动代码建议先把文件按“可执行、配置、静态资源、备份残留”四类打标。下面是我拆包后习惯用的清单文件角色处理建议u.asp入口脚本可能包含微信浏览器判断迁移到PHP后可作为跳板或直接取消zhuanqian.php.bak分销/返利逻辑的主备份改名php后检查语法拆成类复用config.php.bak数据库连接和密钥配置改名后立即改库密码并限制访问web.configIIS站点配置保留但需要补禁.bak和目录浏览H-ui.css / H-ui.min.css后台管理UI原样保留layui.css前端展示UI原样保留games_widget_f94212b.css游戏组件样式原样保留default.css业务自定义样式原样保留这套源码缺少数据库结构文件和前端js目录所以直接跑不起来。正常二次开发时我会根据php上的表名反向补一个init.sql或者把项目里可能存在的db.sql扩展名一并找回。没有数据库脚本时也可以靠config.php里数据库连接名称去猜测表前缀。2.4 快速剥离备份文件和搭建本地调试站点先把两个.bak文件复制出来用VSCode或Notepad打开检查。config.php.bak通常会包含数据库主机、账号、密码、库名以及微信支付商户号密钥信息这些信息需要一律替换成你自己的测试参数。zhuanqian.php.bak里一般就是分销佣金的计算方法和几个接口函数定义tixian()提现、fencheng()分成、jilu()记录这类函数。在IIS里搭建调试站点时我会把物理路径指向项目根目录添加默认文档为index.php或u.asp。如果你本机没有IIS直接用phpstudy之类的集成环境也可以但web.config会被Apache忽略。若想让两套环境通用可以在根目录再放一个.htaccess。注意不能和web.config同时启用冲突规则。通常把伪静态规则统一写在web.config即可Apache环境下再单独维护一份。?php // 快速定位备份文件中的关键函数 $code file_get_contents(__DIR__ . /zhuanqian.php.bak); preg_match_all(/function\s(\w)\s*\(/, $code, $m); echo implode(\n, $m[1]);这段代码用正则提取备份文件里的所有函数名跑一遍之后你就知道这套源码里分销相关的方法到底有哪些比如可能输出fencheng、tixian、user_info等。然后再针对性地阅读函数体比整个文件从头看效率高很多。正则提取时要注意函数名和括号之间允许换行所以上面用了\s*。3. 三级分销与游戏返利数据库字段和PHP实现“三级分销”是这套源码的核心增值点。它和你常见的关系链裂变不同这里的分销渠道挂在“游戏积分”和“充值金额”上用户在打完夹娃娃/抓猴子之后系统按他绑定关系的上下级进行分润。3.1 用户关系链与结算流程三个档位通常被定义为一级、二级、三级佣金率。比如用户A邀请用户BB邀请CC邀请D那么D充值玩游戏时C拿一级佣金B拿二级佣金A拿三级佣金。这套源码里典型的佣金比例是0.3 : 0.1 : 0.05也就是充值金额的30%、10%、5%。注意不是所有平台都能用三级分销模式运营前你需要确认平台自身的合规边界这里只从技术上拆解实现。结算流程如下D下单支付 → 支付回调确认成功 → 查询D的pid → 依次查上级的上级 → 按比例更新账户余额并插入流水表 → 同步给前端展示可提现余额。这里核心问题在于分销关系不能中途变更否则会引发推广纠纷。所以一般会记录每个用户的inviter_id并在支付回调时直接用该字段向上追溯而不是查当时的关系链。3.2 关键表结构设计根据php.bak中的写法这套源码至少有三张表用户表、充值/游戏记录表、佣金流水表。我按常见结构补齐一段SQL供你对照改字段名CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, openid varchar(64) NOT NULL COMMENT 微信openid, pid int(11) NOT NULL DEFAULT 0 COMMENT 上级用户ID, balance decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 可提现余额, total_income decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 累计收益, status tinyint(1) NOT NULL DEFAULT 1, create_time int(11) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE income_log ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL COMMENT 获得佣金用户, from_user_id int(11) NOT NULL COMMENT 来源用户, level tinyint(1) NOT NULL COMMENT 1/2/3级, order_id varchar(32) NOT NULL, amount decimal(10,2) NOT NULL, create_time int(11) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里pid是用户表中唯一的上级标记迁移原备份时如果原表叫fx_users你需要把字段名映射到你自己的表。注意decimal(10,2)在计算时要用数值类型运算后再格式化避免直接用浮点存库出现0.30000000000000004这类问题。order_id必须唯一才能保证支付回调幂等防止同一条订单被重复分账。3.3 佣金计算代码与幂等控制下面这一段是处理支付回调后触发三级分佣的PHP函数基于原备份的命名风格精简后的实现?php /** * 支付成功后按等级发放佣金 * param int $user_id 当前支付的用户ID * param float $pay_amount 支付金额 * param string $order_no 商户订单号 */ function fencheng($user_id, $pay_amount, $order_no) { $pdo new PDO(mysql:hostlocalhost;dbnamegame_db;charsetutf8mb4, root, pass); // 幂等检查 $stmt $pdo-prepare(SELECT id FROM income_log WHERE order_id ? LIMIT 1); $stmt-execute([$order_no]); if ($stmt-fetch()) return false; $level1 $pay_amount * 0.30; $level2 $pay_amount * 0.10; $level3 $pay_amount * 0.05; $r $pdo-prepare(SELECT id, pid FROM user WHERE id ?); $r-execute([$user_id]); $current $r-fetch(PDO::FETCH_ASSOC); $levels [0, $level1, $level2, $level3]; $curUid $current[pid] ?? 0; for ($lv 1; $lv 3 $curUid 0; $lv) { $s $pdo-prepare(INSERT INTO income_log (user_id, from_user_id, level, order_id, amount, create_time) VALUES (?,?,?,?,?,?)); $s-execute([$curUid, $user_id, $lv, $order_no, round($levels[$lv], 2), time()]); $pdo-prepare(UPDATE user SET balance balance ?, total_income total_income ? WHERE id ?) -execute([round($levels[$lv], 2), round($levels[$lv], 2), $curUid]); $ur $pdo-prepare(SELECT pid FROM user WHERE id ?); $ur-execute([$curUid]); $curUid $ur-fetchColumn(); } return true; }代码逻辑分三步走先查这笔订单是否已经分过佣防止微信回调失败后重试导致重复入账然后取当前支付用户的pid作为第一级再向仓库循环三次每次把当前用户替换成上一级ID。在实际项目中我还会把fencheng()放到数据库事务里否则中间任何一步失败都会造成分佣不完整。原备份很可能没有加事务所以二次开发时要补上beginTransaction()和commit()。此外$level1等比例应该配置到config文件不要硬编码在函数里否则每次调整比例都要改代码。这里使用round(..., 2)保证插入数据库的字段精度正确。3.4 提现与审核的状态机这套源码里的“提现”大概率是用户申请后由客服人工打款。自动打款要接入企业付款到零钱接口本身并不复杂但需要商户证书和IP白名单内测阶段不一定用得上。如果只是内测可以先把提现记录落到表里后台H-ui界面里人工审核。提现状态最少要三个待审核、已打款、已拒绝。字段设计可以这样字段类型说明statustinyint0待审核1已打款2已拒绝apply_timeint申请时间audit_timeint审核时间admin_idint操作管理员这样就能和余额变动配合避免用户提交后再次修改提现账号。提现审核动作和用户余额扣减要写在同一个数据库事务里避免出现“余额扣了但状态没更新”的中间态。4. 微信支付、授权登录与游戏对账这套源码要跑通微信侧需要准备已认证的服务号或微信开放平台账号拿到AppID、AppSecret、商户号MCHID和API密钥。还要在微信支付商户平台里配置支付授权目录否则H5会报“当前页面的URL未注册”。授权目录要精确到游戏入口所在的目录比如https://yourdomain.com/wxgame/而不是根目录。这和微信小程序开发扫码登录、换token是两套体系别混用。4.1 授权登录与openid的获取微信内打开游戏页面时最常用的是OAuth2.0网页授权。如果只是获取openid使用snsapi_base静默授权即可不需要用户手动同意。流程是用户访问u.asp或index.php → 检测没有openid → 302跳转到微信授权地址 → 微信回调到callbackUrl并携带code → 后端用code换openid和access_token。?php // 微信静默授权获取openid $appid 你的APPID; $secret 你的APPSECRET; $code $_GET[code] ?? ; $url https://api.weixin.qq.com/sns/oauth2/access_token?appid{$appid}secret{$secret}code{$code}grant_typeauthorization_code; $res json_decode(file_get_contents($url), true); $openid $res[openid] ?? ;这里的file_get_contents依赖PHP开启allow_url_fopen在Windows开发环境通常没问题但生产环境我推荐用cURL因为微信接口偶尔超时cURL可以方便设置CURLOPT_TIMEOUT和错误码。授权回调地址必须与微信公众平台配置的授权回调域名完全一致并且H5页面使用的域名已备案。否则就会出现你在浏览器里看到的“请复制网址在手机浏览器中打开”这种微信兜底提示本质上是授权域名没配对。4.2 支付下单与签名生成游戏里用户充值后后端需要生成微信JSAPI支付订单。JSAPI支付只能在微信浏览器里拉起支付并且需要先拿到用户的openid。核心代码是调用统一下单API然后生成前端需要的paySign参数。下面是基于PHP的简化版本注意签名拼接方式?php $params [ appid $appid, mch_id $mchid, body 游戏充值, out_trade_no $orderNo, total_fee intval($amount * 100), spbill_create_ip $_SERVER[REMOTE_ADDR], notify_url https://yourdomain.com/wxgame/notify.php, trade_type JSAPI, openid $openid, ]; ksort($params); $str ; foreach ($params as $k $v) { if ($v ! !is_null($v)) $str . $k . . $v . ; } $str . key . $apiKey; $sign strtoupper(md5($str));这里注意total_fee单位是分所以必须intval($amount * 100)如果用浮点数直接传给微信接口可能出现0.01元变成1分钱的错误。最终返回给前端的参数包括timeStamp、nonceStr、packageprepay_idxxx和signTypeMD5前端用wx.requestPayment拉起支付。这个方法里最容易被忽略的是签名参数拼接顺序微信要求按ASCII码排序所以必须先ksort($params)最后把商户API密钥放在字符串末尾参与MD5。4.3 回调对账与掉单处理支付成功之后微信服务器会向notify_url推送XML通知。源码里如果缺少对应的处理通常表现为“用户已付款但道具没到账”。这时候需要看回调通知是否返回成功标记。回调处理第一步是验签第二步查订单状态第三才是发道具和分佣。通常我会在notify.php里直接输出固定XML。?php $xml file_get_contents(php://input); $data json_decode(json_encode(simplexml_load_string($xml, SimpleXMLElement, LIBXML_NOCDATA)), true); // 验签过程省略确认 result_code SUCCESS return_code SUCCESS $outTradeNo $data[out_trade_no]; // 检查本地订单状态然后调用fencheng($userId, $amount, $outTradeNo) echo xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msg/xml;这段代码把微信推送的XML转成数组拿到out_trade_no后去更新订单和触发第3章的fencheng()。注意回调脚本执行完后一定要返回微信要求的成功标记否则微信会按间隔多次通知造成重复分佣。我的经验是在notify.php里先加一个Redis锁或数据库订单状态判断再做后续业务能让掉单率从5%降到接近0。4.4 支付调试参数速查表参数来源常见错误appid公众号/开放平台用成了小程序AppID导致签名失败mch_id微信支付商户平台服务商模式不用特约商户号会报错notify_url自己服务器域名未备案或外网不可访问key商户平台APIv2密钥旧版32位密钥注意不要和后端加密key混用total_fee订单金额×100浮点运算丢精度必须intval这张表是我在排微信支付问题时最先核对的项目。如果出现40163之类的code错误大概率是授权链接里的redirect_uri没有URL编码如果出现APPID与openid不匹配就要检查用户授权是不是发生在同一个公众号或开放平台账号下。5. 部署时最容易踩的坑和源码安全清理最后一步不是跑通就结束而是把项目安全地收口。我接手的源码包里有不少.bak文件它们暴露了源码的演进过程但留在服务器上就是资产泄露风险。这篇文章最后给你一套可以直接照做的清理顺序。5.1 先做PHP版本与扩展检查在正式投入前先确认服务器PHP版本和必须扩展。老源码大多依赖mysql_*系列函数PHP 7.0之后全部移除所以先检查php -m里有没有mysqli、pdo_mysql、curl和bcmath。如果没有用下面的命令查看当前版本php -v php -m | grep -E mysqli|pdo_mysql|curl|bcmath如果缺少扩展Windows下在php.ini里去掉对应extension前面的分号后重启PHP即可。Linux下用yum install php72w-mysqlnd或apt install php7.2-mysql这一类方式补装。注意改完php.ini后必须重启fpm否则配置不生效页面还是报“Call to undefined function”。5.2 禁止所有.bak文件被web访问.bak文件能被浏览器直接下载等于把数据库密码和微信支付密钥送到公网。在IIS的web.config中加入下面这段规则可以彻底拒绝下载。system.webServer security requestFiltering deniedExtensions add fileExtension.bak / add fileExtension.old / add fileExtension.swp / /deniedExtensions /requestFiltering /security /system.webServer这里的deniedExtensions会对匹配扩展名的请求返回404比简单改MIME类型更彻底。另外项目根目录下建议再放一个index.html空文件避免IIS默认的目录浏览打开文件列表。5.3 用web.config强制HTTPS和隐藏入口微信H5支付要求支付授权目录必须是HTTPS链接所以要为站点绑定SSL证书并强制跳转。下面这段配置会让HTTP请求301到HTTPSrewrite rules rule nameHTTPS stopProcessingtrue match url(.*) / conditions add input{HTTPS} patternoff / /conditions action typeRedirect urlhttps://{HTTP_HOST}/{R:1} redirectTypePermanent / /rule /rules /rewrite这里{HTTPS}为off时重定向{R:1}保留原始路径。如果是后端接口建议再把u.asp这种旧入口做301重定向到index.php保证用户收藏的旧链接还能正常进入游戏。5.4 上线前最后验证在上线前除了确认支付和分销流程再补几条硬性检查把config.php.bak改名为config.php后先确认数据库账号不是root且密码强度足够删除或改名zhuanqian.php.bak如果还有调试用的test.php、info.php也一并移除到微信支付商户平台把API密钥重新生成一次并更新到config.php最后用手机微信访问游戏页确认授权登录、拉起支付和后台分佣流水均正常。你可以在测试环境故意把佣金比例改成0.3/0.1/0.05之外的值然后下一笔小额订单查income_log里三行记录的金额是否按预期比例生成。本文还有配套的精品资源点击获取
返回列表