thinkphp知识付费需分层控制:支付后同步订单与权限状态并推送cdn授权;视频播放采用动态token+时效校验防盗链;试看与完整播放共用鉴权逻辑,结合hls加密、drm及动态水印防录屏。

ThinkPHP 实现知识付费中的课程购买与防盗链播放,关键不在“能不能做”,而在于“怎么分层控制”。核心逻辑是:支付完成只是起点,真正要守住的是内容交付环节——用户买了课,得让他看得到、看得顺,但又不能让链接一传十、十传百被白嫖。
课程购买流程要闭环,别只盯着支付接口
很多人花大力气接入微信/支付宝 SDK,却忽略支付成功后的状态同步。ThinkPHP 里必须确保三件事同时落地:
- 订单表(order)更新为“已支付”,并记录支付时间、交易号
- 权限表(user_course)插入一条记录,标明该用户对某课程拥有访问权,含生效时间与过期时间(如VIP永久、单课1年)
- 触发异步任务(可用 ThinkPHP 的 command + Redis 队列),向 CDN 或视频服务端推送授权策略(比如刷新 Token 白名单)
注意:回调地址必须做幂等校验,同一 out_trade_no 重复通知只处理一次,避免重复开通权限。
视频防盗链不是加个 Referer 就完事
Referer 校验容易被伪造,生产环境必须叠加动态 Token 验证。ThinkPHP 可这样实现:
- 前端请求播放页时,后端用 uniqid() + 用户ID + 课程ID + 过期时间戳 生成签名,例如:
token=md5(uid+cid+expire+salt) - 视频播放 URL 变成:
/play?cid=123&token=abc123&expire=1746904320 - 播放接口(如
VideoController@play)先校验 expire 是否超时,再重新计算 token 对比,全部通过才返回视频真实地址(如 OSS 签名 URL)或透传给 HLS 分发服务
这样每个链接仅对该用户、该设备、该时段有效,转发出去即失效。
试看与完整播放要用同一套鉴权逻辑
别为试看单独开一个不鉴权的接口。正确做法是:在课程内容模型中预留 free_section 字段(JSON 格式,存可试看的章节 ID 列表),播放前统一走权限判断:
- 用户未购课 → 只允许播放 free_section 内章节,且前端禁用下载、倍速、全屏按钮
- 用户已购课或为 VIP → 返回全部章节,并携带播放 Token
- 所有视频资源文件不放在 Web 可直访路径下,而是存在
/data/videos/这类 Web 根目录外的位置,由 PHP 流式输出或跳转至 CDN 签名地址
防止录屏和盗录得靠前后端配合
技术上无法 100% 阻止录屏,但能显著提高门槛:
- 后端:视频切片使用 HLS + AES-128 加密,密钥由服务端动态下发(每次播放新拿),不硬编码在 m3u8 中
- 前端:小程序或 H5 播放器启用 DRM 模式(如 FairPlay / Widevine),需对接云厂商(阿里云点播、腾讯云 VOD)的加密服务
- 增强体验层:添加动态水印(用户 ID + 时间戳),覆盖在播放器上;禁用右键、F12、截图快捷键提示(非强制,但起警示作用)
这些措施不增加用户操作负担,却让批量盗录成本大幅上升。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











