尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

微信强制分享红包裂变系统源码解析:播放计时、部署与防刷

微信强制分享红包裂变系统源码解析:播放计时、部署与防刷 简介这是一款面向微信公众号运营者及流量增长团队的微信裂变引流源码以强制分享红包机制为核心支持试看、直播、朋友圈转发、分享任务、邀请入群、群聊、红包等多种裂变玩法。系统对页面做了精简优化访问速度更快同时强化防封防盗能力可自定义广告位、页面信息、视频封面及播放多久后强制分享的时间节点并支持秒播和任意格式视频方便运营者灵活配置。资源包共75个文件压缩包仅1.89MB包含20个js、16个php、10个html、8个css、8个gif、6个png等类型php文件承担裂变逻辑与后台配置js负责前端交互和播放监听html/css搭建页面结构图片素材用于红包和分享引导。已有246人学习下载。源码内提供iis专属视频裂变增强版、apache版视频裂变增强版及视频裂变增强版可适配不同服务器环境便于开发者对照部署或二次开发快速落地一套实用的微信强制分享引流系统提升广告流量转化与吸粉变现效率。1. 微信强制分享红包裂变系统源码把分享从「可选项」变成「解锁条件」「微信强制分享红包裂变系统源码」这套东西真正值钱的地方不在红包而在于把分享动作做成继续观看的前置门槛。用户打开视频页播放到后台设定的时间点播放器自动暂停并弹出分享层不分享到微信群或朋友圈就没法继续播放。这种强制裂变思路最适合知识付费试看、直播预热、私域导流这几类场景流量进来后分享是被执行的而不是可点可不点的按钮。我拆这份源码重点看三条线播放计时与强制暂停怎么实现、IIS 与 Apache 两个部署版本的差异、红包和分享回调之间的校验闭环怎么串通。下面的配置记录和排错思路可以直接拿到自己服务器上改。2. 裂变触发机制播放计时、强制分享与回调校验2.1 先画清任务-奖励闭环这套源码包内标注为 videotest 增强版的业务模型是一个典型任务-奖励闭环。用户进入落地页播放器开始计数播放到后台设定的阈值播放器自动暂停强制分享遮罩层弹出用户把页面分享到微信群或朋友圈前端以固定间隔轮询服务端校验接口服务端确认分享标记后放行播放同时把用户送入红包池。闭环的两个关键节点在第二步和第五步。第二步决定什么时候拦截拦截太早用户还没了解内容就离开拦截太晚关键内容已经暴露分享动力自然下降。第五步决定分享动作是否可信而这一步恰好是微信内置浏览器环境里最难处理的地方。为什么难微信没有给普通网页一个「分享成功」的系统级回调网页应用能拿到的只有用户点击分享按钮这个动作。所以从 PC 端验证思路迁移过来的人都会卡在「服务端无法确认用户是否真的分享成功」这个问题上。目前 PHP 技术栈里通用的做法是前端收到分享按钮点击后延时 1 到 2 秒再通知服务端写入share_done标记。理解这个限制后面对红包参数和防刷策略的取舍才能成立。2.2 播放器计时与自动暂停的 JavaScript 实现源码中控制「播放多少分钟后强制分享」的核心是前端播放器的事件监听。我一般会先监听timeupdate因为这个事件会随播放进度周期性触发是计算观看时长的最稳定入口。// 试看与强制分享核心控制 var shareLock false; // 是否已放行true 表示已完成分享 var lockShown false; // 遮罩层是否已弹出防止重复触发 var limitSeconds 90; // 试看阈值单位秒由后台配置换算而来 video.addEventListener(timeupdate, function () { if (shareLock || lockShown) return; if (video.currentTime limitSeconds) { lockShown true; video.pause(); // 暂停播放锁住后续内容 showShareMask(); // 弹出强制分享层 startShareCheck(); // 启动轮询等待服务端确认 } });逻辑说明timeupdate在播放过程中高频触发这里用shareLock和lockShown两个布尔值做双重拦截。shareLock表示整个会话已经放行lockShown表示遮罩层已经弹出避免用户在临界时间附近来回拖动导致 pause 反复触发。先暂停再弹层这个顺序很重要先暂停后弹层用户感知是被锁住反过来播放器缓冲的声音可能会继续播放一到两秒关键内容就暴露了。参数说明limitSeconds对应后台「播放多少分钟后进行强制分享」的设置videotest 增强版后台填的是分钟前端拿到后需要乘以 60 再赋值给这个变量。调整阈值时建议同时检查视频实际时长如果视频只有 60 秒而阈值设为 90 秒分享层永远不会触发这是最容易踩的配置错误之一。2.3 微信内置浏览器识别与分享状态轮询服务端要区分「微信内置浏览器」和「普通浏览器」访问因为两个渠道的可信度和后续防刷策略不一样。微信内置浏览器的 UA 里带MicroMessenger标识识别逻辑如下。// 判断是否微信内置浏览器 function isWechatBrowser() { $ua $_SERVER[HTTP_USER_AGENT] ?? ; return strpos($ua, MicroMessenger) ! false; } // 分享状态轮询接口 public function checkShareStatus() { session_start(); if (!empty($_SESSION[share_done]) $_SESSION[share_done] 1) { echo json_encode([status 1, msg ok]); } else { echo json_encode([status 0, msg pending]); } }逻辑说明checkShareStatus是前端startShareCheck轮询的目标接口。用户点击分享按钮后前端延迟 1.5 秒左右请求标记接口比如/api/markShare服务端把$_SESSION[share_done]置为 1然后前端轮询本接口拿到放行信号。这套方案不完美但它是 PHP 技术栈加微信内置浏览器环境里最实际的选择改造成本低也方便后续接入 Redis 做分布式会话。参数说明轮询间隔建议控制在 800ms 到 1500ms。间隔太短高并发下 session 锁会让 PHP-FPM 进程排队接口响应变慢间隔太长用户分享完还要干等跳出率上升。另外session_start()必须在任何输出之前调用接口里一旦混入警告信息json_encode的响应就会被污染前端JSON.parse会直接抛异常表现为分享后一直卡在加载中。2.4 强制分享触发参数速查下面这张表是部署和调优时最常改的参数集中在播放器前端文件和后端 Session 配置里。参数位置作用建议值limitSeconds前端 JS播放多少秒后触发强制分享视频时长的 30%50%lockShown前端 JS防止遮罩层重复弹出布尔值默认 falseshare_donePHP Session记录用户已完成分享0/1轮询间隔前端 JS请求校验接口的频率800ms1500msvideo.currentTime前端 JS当前播放进度由播放器维护调试时优先看两个点。第一timeupdate是否真的在触发部分 H5 播放器在视频文件未加载完成时不会触发该事件表现为播放器转圈但分享层一直不弹。第二showShareMask之后视频是否处于 paused 状态某些安卓 WebView 在调用pause()后仍会继续输出最后一帧的音频需要额外把video.currentTime回拨几秒来切断声音输出。3. 部署差异IIS 专属增强版与 Apache 版的环境适配3.1 源码包结构与版本选型依据压缩包里包含两个可部署目录videotestIIS 专属视频裂变增强版和 Apache 版视频裂变增强版。两者前端逻辑基本一致差异集中在伪静态规则和请求参数接收方式上。IIS 版靠web.config的 URL Rewrite 模块Apache 版靠.htaccess的RewriteRule规则语法不同配置文件不能互换。不少人在本地 Apache 调试正常上传到 Windows 服务器后后台全部 404就是因为没有同步替换伪静态规则文件。两个版本在以下环节有明确差异选型时直接对照下表。检查项IIS 版videotestApache 版伪静态配置web.config.htaccessPATH_INFO 支持需处理器映射开启默认支持视频目录写权限IUSR / IIS_IUSRSwww-data / daemon伪静态生效前提URL Rewrite 模块mod_rewrite AllowOverride All入口文件index.phpindex.php规则写法不同IIS 7 及以上默认不带 URL Rewrite 模块需要单独安装否则web.config里的 rewrite 节点会被忽略系统直接报 500 或按物理路径访问。Apache 版则要确认AllowOverride All已开启否则.htaccess文件不会生效视频路由直接暴露物理路径。3.2 IIS 部署伪静态规则与 FastCGI 配置IIS 部署我一般先把 PHP 以 FastCGI 方式跑起来再配置 URL Rewrite。下面这份web.config核心配置可以直接套用。configuration system.webServer rewrite rules rule namevideo_detail stopProcessingtrue match url^video/([0-9])$ / action typeRewrite urlindex.php?videoId{R:1} / /rule rule nameapi_share stopProcessingtrue match url^api/([a-zA-Z])$ / action typeRewrite urlapi/index.php?action{R:1} / /rule /rules /rewrite handlers add namePHP-FastCGI path*.php verbGET,HEAD,POST modulesFastCgiModule resourceTypeFile / /handlers /system.webServer /configuration逻辑说明第一条规则把/video/123这种视频详情页路由到index.php?videoId123第二条规则把/api/checkShare之类的分享校验接口收敛到统一 API 入口。{R:1}是正则捕获组的反向引用对应([0-9])或([a-zA-Z])匹配到的内容。stopProcessingtrue表示当前规则命中后不再执行后续规则避免api开头的请求再被video规则捕获。参数说明path*.php与verbGET,HEAD,POST限定了 PHP 处理器的请求类型如果红包发放接口用了PUT或自定义动词需要在这里扩展。同时确认站点应用程序池的「启用 32 位应用程序」设置与 PHP 版本位数一致PHP 7.4 以上建议用 64 位否则扩展加载时会报错。3.3 Apache 版部署.htaccess 与目录权限Apache 版的.htaccess配置如下。Options -Indexes RewriteEngine On RewriteBase / RewriteRule ^video/([0-9])$ index.php?videoId$1 [L,QSA] RewriteRule ^api/([a-zA-Z])$ api/index.php?action$1 [L,QSA] # 禁止外部直链拿视频文件 RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^https?://your-domain.com [NC] RewriteRule \.(mp4|flv|m3u8)$ - [F,L]逻辑说明最后两行RewriteCond是防盗链规则只放行携带本站 Referer 的视频请求。这个规则对浏览器直接打开视频地址有效但挡不住伪装 Referer 的抓取工具所以只能作为第一层防护。[F]返回 403[L]停止匹配[QSA]保留原有查询参数。参数说明RewriteBase /在站点部署到子目录时必须修改。比如部署在/demo/下要写成RewriteBase /demo/同时RewriteRule的匹配路径要去掉目录前缀。Apache 还需要开启mod_rewrite并在虚拟主机配置里设置AllowOverride All。3.4 部署后环境自检部署完先用命令行确认环境条件再进后台配置。# 检查 PHP 版本与关键扩展 php -v php -m | grep -E session|json|pdo|curl # 验证伪静态是否生效 curl -I http://your-domain/video/1 # 验证分享校验接口 curl -s -X POST http://your-domain/api/checkShare | head -c 200逻辑说明php -m | grep检查 PHP 扩展这套源码依赖session分享状态和json接口返回缺失任何一个都会导致回调失败。curl -I看伪静态规则是否生效返回 200 说明路由正确返回 404 则要检查规则文件所在目录级别和模块加载状态。POST api/checkShare的返回内容里应包含status字段如果返回 PHP 错误优先排查 session 配置和输出缓冲。4. 红包发放、分享任务与防封防盗的实战配置4.1 红包参数与发放约束红包模块的核心是把「完成分享」与「领红包」绑定。源码后台可以自定义红包总个数、随机金额范围、领取门槛。发放接口里至少要有两道校验share_done是否置位、当前用户是否已经领过否则就会出现刷红包的问题。// 红包发放入口 public function grantRedPacket($userId) { // 第一道校验分享任务未完成直接拒绝 if (empty($_SESSION[share_done])) { return [code -1, msg 分享任务未完成]; } // 第二道校验同一用户不能重复领取 if (RedPacketModel::isGranted($userId)) { return [code -1, msg 红包已领取]; } // 随机金额以「分」为单位生成避免浮点精度问题 $amount mt_rand(50, 200) / 100; RedPacketModel::create([ user_id $userId, amount $amount, status pending, create_t time() ]); return [code 0, msg success, amount $amount]; }逻辑说明mt_rand(50, 200) / 100生成的金额范围是 0.5 到 2 元以「分」为随机单位避免浮点运算产生0.30000000000000004这类精度问题。发放状态先置为pending等用户实际点击「领取到微信零钱」并回调成功后再更新为success不推荐在进入红包池时就写死成功。参数说明userId建议取微信 OpenID而不是自增 ID。OpenID 在微信生态内唯一自增 ID 在用户重装或清缓存后可能重新分配导致同一人多次领取。红包总额在后台建议设置为「每日上限」而不是「总上限」否则活动还没开始红包就被测试用户领完了。红包发放关联参数速查配置项后台入口推荐值每日红包总额红包管理根据预算设置单次金额范围红包管理0.52 元领取门槛红包管理强制分享完成同一用户限制红包管理每日 1 次发放状态MySQL 表字段pending / success4.2 分享任务、邀请入群与直播试看的配置方式这套源码的分享任务不止一种群聊分享、朋友圈转发、邀请入群、试看、直播。每种任务对应不同的校验强度后台配置时要注意区分。任务类型校验方式用户动作触发奖励群聊分享点击分享 延时标记拉起微信群继续观看朋友圈转发点击分享 延时标记朋友圈转发红包 / 积分邀请入群点击记录 后台审核扫描群二维码入群资格试看 / 直播timeupdate seeked 监听播放行为放行正片邀请入群和强制分享到群可以做成同一个入口用户点击后拉起微信群二维码服务端记录点击行为并进入待校验状态。朋友圈转发与分享到群的差异在于朋友圈没有可校验的群聊 ID所以一般会要求用户提交截图或直接放行。直播模块通常走m3u8流源码里如果配置了直播地址前端就切换到 HLS 播放器没配置直播地址时默认走本地 MP4 试看。分享状态和红包发放接口都是纯 JSON 返回后续如果要接微信小程序版前端服务端接口基本可以原样复用只需要把轮询逻辑从 JS 换成小程序的wx.request改造量集中在播放器层。4.3 防止拖进度条绕过强制分享只监听timeupdate是不够的用户可以直接拖进度条到视频末尾跳过强制分享点。需要在seeked事件里做二次拦截。// 捕获拖动进度条事件 video.addEventListener(seeked, function () { if (shareLock) return; // 拖到试看阈值之后强制拉回并弹出分享层 if (video.currentTime limitSeconds) { video.pause(); video.currentTime limitSeconds - 5; showShareMask(); } }); // 播放结束兜底正常看完也要校验分享 video.addEventListener(ended, function () { if (!shareLock) { shareLock false; video.pause(); showShareMask(); return; } video.play(); });逻辑说明seeked在用户拖动进度条完成后触发此时currentTime已经跳变判断如果超过阈值就先把播放进度拉回limitSeconds - 5再暂停和弹层。ended事件是兜底即使视频自然播放到最后只要分享标记没置位仍然要锁住。这两个事件补上之后强制分享就很难被绕过。4.4 防封与防盗的处理边界防封集中在这几个层面分享文案可自定义、分享图标可替换、页面标题可伪装。源码后台的「页面信息」「广告位」「视频封面」设置本质是让每个推广落地页看起来不同降低被平台批量识别的概率。但任何强制分享的玩法都存在被平台治理的风险运营侧要控制分享频率和触发时机最好给用户提供一条可选的普通观看路径比如「分享解锁」和「等待 5 分钟自动解锁」并存这样既保留裂变效果又不会把转化路径堵死。防盗则靠直链签名和 Referer 双重限制。直链签名代码如下。// 生成带签名的视频直链600 秒过期 function signVideoUrl($filePath, $expireSeconds 600) { $secret your_site_salt_key; $expire time() $expireSeconds; $sign md5($secret . $filePath . $expire); return /video_url.php?f . urlencode($filePath) . e . $expire . s . $sign; }逻辑说明服务端在输出视频地址前先做一次签名签名字段依赖密钥、文件路径和过期时间。播放器拿到签名地址后请求到达video_url.php服务端重新计算md5($secret . $filePath . $expire)并与s参数比对不匹配或已过期就返回 403。这个方案的优点是在不改播放器的前提下让视频直链最多存活 10 分钟足以满足「秒播 试看」的需求。参数说明密钥your_site_salt_key只保存在服务端不要写进 JS。过期时间$expireSeconds建议设为视频长度的 1.5 到 2 倍太短会导致长视频播放中途地址失效太长会失去防抓取的意义。同时可以把伪造微信浏览器头信息的请求也纳入签名校验普通浏览器直接拉流和微信内置浏览器拉流在 Referer 和 UA 上有明显差异对不上就直接拒绝。5. 验证强制分享链路与排错的三个要点强制分享链路部署完之后直接在手机微信里点开测试页是最快的方式但整个验证过程要系统一点。5.1 用伪造微信 UA 做接口冒烟先用命令行确认服务端能正确识别微信内置浏览器并注入试看阈值。# 模拟微信浏览器访问视频详情页 curl -s -H User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.49(0x18003123) NetType/WIFI Language/zh_CN \ http://your-domain/video/1 | grep -o limitSeconds [0-9]*命令返回limitSeconds 90之类的输出说明页面已经正确读取后台配置并注入前端。如果没有输出优先检查后台「视频管理」里的分享设置是否保存成功以及前端模板里变量名是否被改写。5.2 直接跑通分享回调手机微信里很难自动化模拟「点击分享」这个动作我通常的做法是绕开前端直接调后端接口验证闭环。# 创建会话并标记分享完成 curl -s -c /tmp/wechat_cookie -X POST http://your-domain/api/markShare | jq . # 同一会话下校验分享状态 curl -s -b /tmp/wechat_cookie http://your-domain/api/checkShare | jq .markShare返回status: 1后checkShare就应该返回放行信号。如果markShare成功而checkShare仍返回pending几乎可以断定是 session 配置问题要么session_start()没有在公共入口统一调用要么前后端跨域导致 Cookie 没带上。5.3 三个高频失败点最常碰到的问题集中在三处。一是 session 写入时机太早或太晚用户还没真正点击分享服务端就写入了标记这对运营是直接损失解决方法是把标记接口拆成「点击分享」和「服务端确认」两步中间延迟 1 到 2 秒。二是 IIS 伪静态生效了但视频仍然 404这是因为 FastCGI 没有解析 PATH_INFO需要在站点的「处理程序映射」里确认 PHP 请求限制包含路径信息。三是秒播不生效。MP4 的moov元数据在文件尾部时播放器必须等整个文件下载完才能开始播体验就很差。提示用MP4Box -inter 500或ffmpeg -movflags faststart把元数据挪到文件头会重新输出一个新文件处理前先备份原始视频。对 videotest 增强版来说跑通这三项检查后IIS 和 Apache 两套环境下的闭合链路基本稳定剩下的就是根据实际流量调整轮询间隔和红包预算。本文还有配套的精品资源点击获取
返回列表