简介:这份资源是WiFi大师专业版小程序独立版4.0.5的完整源码包,面向希望搭建商家WiFi连接与分销系统的开发者、创业者及小程序运营者。它解决商家为顾客提供WiFi服务时的连接效率与营销转化问题,支持扫码连WiFi、客户信息留存、优惠券发放、周边店铺展示及三级分销等功能,采用TP框架独立开发,无需依赖第三方框架,支持个人或企业资质运营。压缩包共881个文件,约202.34MB,以js、json、wxss、wxml等小程序核心代码为主,另含png、jpg图片素材、sql数据库脚本、so库文件及docx安装说明,结构完整可直接部署上线。已有142人学习下载。资源包含完整后端与搭建教程,可帮助读者快速理解分销逻辑、代理推广机制与收益比例设定,适合用于二次开发或商业项目落地参考。
1. WiFi大师专业版小程序 4.0.5:一套能自己掌控流量主的独立部署方案
做小程序变现的人大多绕不开一个尴尬:功能写完了,流量主广告位却卡在平台审核和分成规则上,收益像隔了一层毛玻璃。WiFi大师专业版小程序 4.0.5 这个方向,本质是把「WiFi 连接工具 + 流量主广告」做成一套可以独立部署的源码方案——用户连 WiFi、看广告解锁、你拿广告收益,整条链路跑在自己的服务器和微信小程序账号里。它适合两类人:一是手里有闲置域名和云主机、想跑一个轻量工具类小程序练手的开发者;二是做过小程序商城、熟悉微信开发者工具,但没碰过独立流量主配置的运营。这篇不吹收益,只讲这套源码从环境准备到广告位跑通的全过程,以及我踩过的那些坑。
2. 环境准备与源码结构:把 4.0.5 跑起来前先看清目录
2.1 独立版和平台版的区别,决定了你要准备什么
很多人拿到「独立版」三个字就以为不用管服务器,这是第一个误解。独立版的核心含义是:小程序前端、后端接口、数据库、广告配置全部由你自己掌控,不依赖第三方 SaaS 后台。代价是你得自己准备三样东西——一个已认证的微信小程序账号(个人主体也能开流量主,但类目有限制)、一台能跑 PHP 或 Node 的云主机、一个已备案的域名(微信要求 request 合法域名必须 HTTPS 且备案)。
平台版则是把后端托管在别人服务器上,你只填 AppID 和密钥。独立版多出来的工作量,换来的是数据自主和广告收益不经第三方抽成。如果你只是想快速验证,平台版够用;但标题既然强调「独立版」,下面全部按自建后端来讲。
云主机的系统选择上,我一般用 Ubuntu 22.04 或 CentOS 7.9,宝塔面板装起来省事。配置 2 核 2G 起步,WiFi 工具类小程序并发不高,这个配置跑几千日活没问题。数据库用 MySQL 5.7 或 8.0 都行,源码里一般带.sql初始化文件。
2.2 源码目录逐个拆开看
拿到压缩包解压后,典型结构是这样的(不同版本可能略有出入,以实际为准):
wifi-master-4.0.5/ ├── miniprogram/ # 微信小程序前端源码 │ ├── pages/ │ │ ├── index/ # 首页:WiFi 列表 + 连接按钮 │ │ ├── detail/ # 详情页:广告解锁逻辑 │ │ └── mine/ # 个人中心 │ ├── utils/ │ │ └── request.js # 统一请求封装,改 baseUrl 的地方 │ └── app.js # 全局配置,广告位 ID 常在这里 ├── server/ # 后端接口 │ ├── api/ # 接口文件 │ ├── config/ │ │ └── database.php # 数据库连接配置 │ └── public/ # 入口目录,Nginx 指向这里 └── database.sql # 数据库初始化脚本前端重点看utils/request.js里的baseUrl,这是你要改成自己域名的地方。后端重点看config/database.php,填数据库地址、库名、账号密码。app.js里通常有全局的广告位 ID 配置,4.0.5 版本一般把激励视频广告位和插屏广告位分开配置。
提示:解压后先别急着改代码,用编辑器全局搜索
http://和https://,把所有写死的域名列出来,一次性替换,比后面一个个报错再找要快得多。
2.3 数据库导入与后端配置
后端跑起来的第一步是建库导数据。用宝塔的话,先在面板里建一个数据库,字符集选utf8mb4,然后导入database.sql。
# 登录 MySQL(宝塔可在面板终端直接操作) mysql -u root -p # 建库,字符集必须 utf8mb4,否则中文 WiFi 名称会乱码 CREATE DATABASE wifi_master DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 退出后用命令行导入 exit mysql -u root -p wifi_master < /www/wwwroot/wifi-master-4.0.5/database.sql导入完成后,编辑server/config/database.php:
<?php return [ 'host' => '127.0.0.1', // 数据库地址,本机就填 127.0.0.1 'port' => 3306, // MySQL 默认端口 'database' => 'wifi_master', // 刚才建的库名 'username' => 'wifi_user', // 建议单独建账号,别用 root 'password' => '你的强密码', // 密码里避免特殊字符,省得转义麻烦 'charset' => 'utf8mb4', ];参数说明:host如果数据库和 PHP 不在同一台机器,填内网 IP;username强烈建议新建一个只对wifi_master库有权限的账号,别图省事用 root,一旦源码有注入漏洞,root 权限等于把整台服务器交出去。charset必须是utf8mb4,WiFi 名称里带 emoji 的情况不少,utf8存不进去。
2.4 Nginx 指向与 HTTPS 配置
后端入口在server/public,Nginx 的root要指到这个目录,而不是server根目录。宝塔里新建站点后,改配置文件:
server { listen 443 ssl; server_name api.你的域名.com; # 宝塔申请 SSL 后会自动生成这两行,没有就手动指向证书路径 ssl_certificate /www/server/panel/vhost/cert/api.你的域名.com/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/api.你的域名.com/privkey.pem; root /www/wwwroot/wifi-master-4.0.5/server/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/tmp/php-cgi-74.sock; # 对应你装的 PHP 版本 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }try_files这行是关键,它把找不到的路径统一交给index.php处理,很多框架路由靠这个。fastcgi_pass的 socket 路径要和你实际装的 PHP 版本对上,装的是 PHP 7.4 就是php-cgi-74.sock,装 8.0 就是php-cgi-80.sock,写错会直接 502。
3. 流量主广告位接入:从 AppID 到激励视频跑通
3.1 开通流量主的前置条件
微信小程序流量主不是注册就能开。硬性门槛是累计独立访客(UV)达到 1000,这个数据微信自己统计,刷量会被判定异常。达到后在小程序后台「流量主」入口申请,审核一般 1-3 个工作日。
开通后你会拿到几个广告位 ID,4.0.5 这类 WiFi 工具最常用的是三种:激励视频广告(看视频解锁 WiFi 密码或延长连接时长)、插屏广告(页面切换时弹出)、Banner 广告(列表页底部)。激励视频单价最高,是这类小程序的主要收益来源,所以源码里的解锁逻辑基本都围绕它设计。
注意:个人主体小程序可以开流量主,但部分类目(如医疗、金融)广告主投放受限,WiFi 工具属于工具类,一般没问题。广告位 ID 是绑定小程序 AppID 的,换小程序要重新申请。
3.2 前端广告位配置与解锁逻辑
广告位 ID 通常配在app.js或单独的config.js里:
// miniprogram/app.js App({ globalData: { baseUrl: 'https://api.你的域名.com', // 后端接口地址 rewardVideoAdUnitId: 'adunit-xxxxxxxxxxxxxxxx', // 激励视频广告位 ID interstitialAdUnitId: 'adunit-yyyyyyyyyyyyyyyy', // 插屏广告位 ID bannerAdUnitId: 'adunit-zzzzzzzzzzzzzzzz' // Banner 广告位 ID } })baseUrl必须和你在微信后台配置的 request 合法域名完全一致,包括协议。rewardVideoAdUnitId这些从流量主后台复制,格式是adunit-加一串字符,填错不会报错,只是广告加载不出来,收益为零,这种「静默失败」最坑。
激励视频的调用逻辑在详情页,典型写法:
// miniprogram/pages/detail/detail.js Page({ data: { rewarded: false }, // 用户点击「看广告解锁」按钮 onUnlockTap() { const app = getApp(); // 创建激励视频实例,每次解锁都新建,避免复用旧实例导致回调不触发 const videoAd = wx.createRewardedVideoAd({ adUnitId: app.globalData.rewardVideoAdUnitId }); videoAd.onLoad(() => { console.log('激励视频加载成功'); }); videoAd.onError((err) => { // 常见错误:1004 无合适广告、1005 广告组件审核中 console.error('广告加载失败', err); wx.showToast({ title: '广告加载失败,请稍后重试', icon: 'none' }); }); videoAd.onClose((res) => { // res.isEnded 为 true 表示用户完整看完,才给解锁 if (res && res.isEnded) { this.unlockWifi(); } else { wx.showToast({ title: '需要看完广告才能解锁', icon: 'none' }); } }); // 先 show,失败再 load 后重试,这是官方推荐的容错顺序 videoAd.show().catch(() => { videoAd.load().then(() => videoAd.show()); }); }, unlockWifi() { // 调用后端接口,记录解锁状态 wx.request({ url: getApp().globalData.baseUrl + '/api/unlock', method: 'POST', data: { wifiId: this.data.wifiId }, success: (res) => { if (res.data.code === 0) { this.setData({ rewarded: true }); } } }); } });逻辑说明:onClose回调里的res.isEnded是判断用户是否看完的唯一可靠依据,早期版本有人用res是否存在来判断,结果用户点关闭按钮也算通过,被薅了不少。show().catch()里再load()是官方推荐的容错写法,因为广告实例可能还没加载好就 show,直接失败。onError一定要处理,否则广告加载失败用户点了没反应,体验很差。
参数说明:adUnitId每个页面每次调用最好新建实例,复用同一个实例在部分基础库版本上会出现回调不触发的问题,这是血泪经验。unlockWifi接口要在后端做校验,不能只靠前端rewarded状态,否则用户改内存就能白嫖。
3.3 后端解锁接口与防刷
后端/api/unlock接口要做两件事:记录解锁、防止重复刷。简单实现:
// server/api/unlock.php <?php // 假设已引入数据库连接 $pdo 和用户身份 $userId $wifiId = intval($_POST['wifiId'] ?? 0); if ($wifiId <= 0) { echo json_encode(['code' => 1, 'msg' => '参数错误']); exit; } // 查是否已解锁,已解锁直接返回成功,不重复记录 $stmt = $pdo->prepare("SELECT id FROM unlock_log WHERE user_id = ? AND wifi_id = ? LIMIT 1"); $stmt->execute([$userId, $wifiId]); if ($stmt->fetch()) { echo json_encode(['code' => 0, 'msg' => '已解锁']); exit; } // 记录解锁,加时间戳 $stmt = $pdo->prepare("INSERT INTO unlock_log (user_id, wifi_id, created_at) VALUES (?, ?, ?)"); $stmt->execute([$userId, $wifiId, time()]); echo json_encode(['code' => 0, 'msg' => '解锁成功']);参数说明:intval强制转整数,防止 SQL 注入的初级手段,但更规范的是用预处理语句,上面已经用了prepare。unlock_log表建议加user_id + wifi_id的唯一索引,从数据库层面防重复。created_at存时间戳方便后面做统计。
防刷的核心是:前端isEnded只是第一道门,后端要校验用户身份(通过微信登录换取的openid或自定义 token),并且对同一用户短时间内的解锁请求做频率限制。我一般会在 Redis 里存一个unlock:用户ID的键,60 秒内只允许一次,超过就拒绝。
4. 避坑与排查:那些让广告收益归零的细节
4.1 广告一直加载失败,收益为零
现象:激励视频点击后转圈然后提示失败,流量主后台显示曝光为零。
原因:最常见的是广告位 ID 填错,或者小程序还没通过流量主审核就填了 ID。其次是baseUrl和微信后台配置的合法域名不一致,导致广告 SDK 初始化时拿不到配置。还有一种情况是新开通流量主,广告组件还在审核中,通常 24 小时内会好。
解决:先在微信开发者工具的控制台看onError返回的错误码,1004 是无合适广告(正常,换个时间段再试),1005 是广告组件审核中,1008 是广告单元已关闭。对照错误码排查,别盲目改代码。
4.2 用户看完广告没解锁
现象:用户反馈完整看完了视频,但 WiFi 还是连不上。
原因:onClose回调里res.isEnded判断有问题,或者后端接口调用失败但前端没处理。还有一种情况是用户网络切换,wx.request超时,前端没重试。
解决:在onClose里加日志,把res完整打印出来看。后端接口加超时重试,前端fail回调里给用户明确提示并提供「重试」按钮。别让用户看完广告却卡在最后一步,这是最伤留存的问题。
4.3 数据库中文乱码
现象:WiFi 名称里的中文显示成问号或乱码。
原因:建库时字符集用了utf8而不是utf8mb4,或者连接配置里charset没设对。
解决:建库语句必须DEFAULT CHARACTER SET utf8mb4,连接配置里charset也写utf8mb4。已经建错的库,用ALTER DATABASE wifi_master CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;改,但已有数据可能已经损坏,需要重新导入。
4.4 后端接口 502 或 404
现象:小程序请求接口返回 502 Bad Gateway 或 404。
原因:502 通常是 PHP-FPM 没启动或fastcgi_pass路径写错;404 是 Nginx 的root指错了目录,或者try_files没配。
解决:宝塔面板里检查 PHP 服务是否运行,fastcgi_pass的 socket 路径和实际 PHP 版本对应。root必须指到server/public,不是server。改完 Nginx 配置记得重载。
4.5 激励视频在 iOS 上不显示
现象:安卓正常,iOS 上广告加载失败或黑屏。
原因:iOS 对广告 SDK 的初始化时机更敏感,有时需要在onLoad里提前创建广告实例,而不是点击时才创建。另外 iOS 的静音开关会影响视频播放,但一般不影响加载。
解决:把广告实例的创建提前到页面onLoad,点击时直接show。如果还不行,检查基础库版本,太低的基础库对激励视频支持不完整,在app.json里把libVersion调高。
5. 进阶:把解锁逻辑做成可配置的运营工具
跑通基础流程后,真正拉开差距的是运营侧的灵活度。我一般会把「看几次广告解锁」「解锁后有效时长」「是否允许分享替代广告」做成后台可配的参数,而不是写死在代码里。这样改活动不用重新提审小程序,改数据库就行。
具体做法是加一张config表:
| 字段 | 类型 | 说明 |
|---|---|---|
key | varchar(50) | 配置项名,如unlock_ad_count |
value | varchar(255) | 配置值,如1 |
remark | varchar(255) | 备注,方便运营看 |
前端在onLoad时请求一次配置接口,把unlock_ad_count等参数缓存到globalData,解锁逻辑根据配置动态判断。后端在/api/unlock里也读同一份配置做校验,保证前后端一致。
验证配置是否生效,最直接的办法是在开发者工具里改数据库的值,然后杀掉小程序重新进入,看解锁流程是否按新配置走。别只改前端缓存,那样后端校验会拦下来。
另一个技巧是给解锁接口加一个「模拟模式」,在测试环境用固定 token 跳过广告直接解锁,方便调试后端逻辑,上线前记得关掉。这个开关我一般放在config表里,用debug_mode控制,生产环境设为0。
最后说个我自己的习惯:每次改完广告相关代码,一定在真机上用「体验版」完整走一遍解锁流程,包括看完广告、中途关闭、网络断开三种情况。开发者工具的模拟环境和真机差异不小,尤其是广告 SDK 的行为。这个习惯帮我拦下过好几次「模拟器正常、真机收益为零」的问题。希望帮到你。
本文还有配套的精品资源,点击获取