需实现课程加密播放、试看自动截取、rbac会员权限控制、试看转订联动及静态资源混淆五项核心能力,确保内容安全与转化效率。

如果您计划使用PHP搭建一个支持课程加密、试看功能与会员订阅机制的知识付费平台,则需围绕内容安全分发、访问权限控制与用户生命周期管理进行核心模块设计。以下是实现该平台关键能力的具体方法:
一、课程视频加密与动态解密播放
为防止课程资源被直接下载或盗链,需对上传的视频文件进行服务端加密,并在播放时通过临时令牌验证身份后动态解密流式传输。此方式可规避前端静态URL暴露原始文件路径的风险。
1、将原始MP4文件使用AES-256-CBC算法加密,密钥由课程ID与系统盐值拼接后SHA256哈希生成,加密后存储于非Web可访问目录(如/var/www/private/courses/)。
2、创建/player.php?course_id=123&token=abc接口,接收带签名的token,校验其是否在10分钟内有效且绑定当前用户ID与课程ID。
3、校验通过后,读取加密文件,使用相同密钥实时解密并以Content-Type: video/mp4分块输出,同时设置Accept-Ranges: bytes支持拖拽播放。
4、前端Video标签src指向该PHP接口,禁用右键另存为,通过controlsList="nodownload"属性隐藏下载按钮。
二、课程试看片段自动截取与权限隔离
试看功能需在不暴露完整课程的前提下,精准提取前5分钟内容供未订阅用户观看。应避免手动剪辑,采用FFmpeg命令行工具在上传时自动生成独立试看文件,并与主课程物理隔离。
1、用户上传完成触发PHP脚本执行:exec("ffmpeg -i /upload/raw/course_456.mp4 -ss 00:00:00 -t 00:05:00 -c copy /public/trial/trial_456.mp4 2>&1", $output, $return);
2、将生成的试看文件路径写入数据库courses表的trial_path字段,主课程路径存入full_path字段,两者字段值互不可推导。
3、前端根据用户角色决定加载trial_path或full_path,未登录或非会员用户仅能获取trial_path对应URL。
4、试看文件所在目录启用Nginx的location ^~ /public/trial/规则,禁止执行PHP且限制Referer为本站域名,防止外站热链。
三、基于RBAC模型的会员订阅权限控制
会员体系不能仅依赖“是否付费”布尔值判断,须构建角色-权限-资源三级控制链,使不同会员等级(如月度/年度/终身)可访问不同课程集合,且权限变更即时生效。
1、数据库建立roles(id, name)、permissions(id, code, description)、role_permissions(role_id, permission_id)三张表,其中permission_code格式为course:access:123或category:access:7。
2、用户支付成功后,调用assignRoleToUser($user_id, $role_id)方法,将用户ID与对应角色ID写入user_roles中间表。
3、课程详情页加载前执行hasPermission($user_id, 'course:access:'.$course_id),该函数递归查询用户所属角色所拥有的所有permission_code,匹配当前课程ID。
4、权限检查失败时返回HTTP 403状态,并渲染提示:您当前会员等级不可访问该课程,请升级至年度会员解锁全部内容。
四、试看进度与会员开通跳转联动
为提升转化率,需在试看结束前10秒插入浮动提示层,展示已观看时长与开通权益对比,并提供一键跳转支付页功能,所有行为必须与用户会话强绑定,防止伪造请求。
1、前端Video标签监听timeupdate事件,当currentTime >= duration - 10时触发弹窗,弹窗内显示您已试看4分52秒,开通后立即解锁剩余58分17秒及全部配套资料。
2、弹窗中“立即开通”按钮href属性动态拼接:/subscribe?plan=annual&redirect=/course/123&ref=trial_end,其中ref参数用于后端识别来源。
3、支付回调成功后,更新users表中membership_tier与membership_expire字段,并清空Redis中该用户的权限缓存键user:perms:{$user_id}。
4、用户刷新课程页时,服务端重新生成权限缓存,确保下一毫秒即可访问完整内容,无感知延迟。
五、课程静态资源混淆与Referer验证双保险
除视频主文件外,课件PDF、代码包、字幕SRT等静态资源同样需防下载。单纯隐藏路径不够,须叠加文件名混淆与HTTP头验证,形成双重防护。
1、上传课件后,生成32位随机字符串作为存储文件名(如a7f3b9e1c2d4f5a6b7c8d9e0f1a2b3c4.pdf),原始文件名仅存入数据库materials表的original_name字段。
2、资源访问统一走/resource.php?id=889入口,脚本根据ID查出混淆后的物理路径,并验证$_SERVER['HTTP_REFERER']是否包含当前站点域名且非空。
3、若Referer缺失或不匹配,返回HTTP 403并记录日志;若匹配,则读取文件并设置Content-Disposition: inline; filename="course_material.pdf",保持浏览器内嵌显示而非强制下载。
4、Nginx配置中添加add_header X-Content-Type-Options "nosniff";,阻止MIME类型嗅探导致的误执行风险。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











