简介这是一份基于JAVA后端与UniApp前端框架的微短剧H5视频观看服务完整源码面向需要搭建短剧播放与变现闭环的开发者或产品团队可用于H5、小程序等多端业务快速落地。项目核心覆盖视频流播放、剧集管理、付费解锁、虚拟支付、微信支付、账户充值、VIP服务与分销管理并提供充值/消费记录查询形成内容消费到收益结算的完整链路。资源包共2000个文件以1894个JavaScript、41个Vue组件、45个JSON配置为主另含Markdown文档、HTML/CSS页面等压缩包约29.01MB目录中附带readme说明、pages.json页面配置及uniCloud相关云服务目录便于梳理前后端工程结构。目前已有504人学习/下载适合具备Vue或Java基础、希望快速获得微短剧系统参考实现的开发者。借助UniApp跨端特性和JAVA后端稳定架构可大幅缩短从原型到上线的开发周期。1. 微短剧 H5 视频观看服务为什么值得拆这套 JAVA UniApp 源码做微短剧 H5 视频观看服务很多人第一步就卡在“前端页面能画出来但付费解锁、虚拟支付、微信支付、分销佣金这些业务串不起来”。这套基于 JAVA 后端 UniApp 前端的微短剧 H5 视频观看服务源码把短剧从试看、解锁到充值、分销的完整链路都放在同一个工程里5808 个文件既有 UniApp 前端页面也有 JAVA 后端的接口与数据设计。适合正在搭建短剧小程序或 H5 商业项目的开发者、技术负责人以及想快速验证付费短剧模式的创业团队。我拆完后的直接感受是它的价值不在代码量而在业务闭环的完整度尤其是虚拟支付与微信支付同时存在时后端如何处理订单一致性值得认真看一遍。2. 从文件清单拆项目结构先看懂 5808 个文件里谁在干活拿到源码包先别急着跑根目录这一堆文件其实已经把技术选型写在脸上了。项目正文里列出的 jasmine.css、SpecRunner.html、index.js、vue.global.js、vue.esm-browser.js、html2canvas.js、html2canvas.esm.js、vue.runtime.global.js、vue.runtime.esm-browser.js乍一看像随手扔进来的依赖实际上分别对应着测试、入口、Vue 多版本构建和截图能力。把这些文件归类清楚后面改页面、换依赖、排查报错都能少走弯路。2.1 根目录 js 文件Vue 的三种形态和 html2canvas 的用途先看 vue.global.js、vue.esm-browser.js、vue.runtime.global.js、vue.runtime.esm-browser.js 这四份文件它们是同一个 Vue 框架的不同构建产物不是重复冗余。vue.global.js 是完整版包含模板编译器适合直接用 script 标签引入做演示vue.esm-browser.js 是 ES Module 版本给现代浏览器原生 import 用vue.runtime.global.js 和 vue.runtime.esm-browser.js 是运行时版本不含模板编译器体积更小生产环境通常用这种。实际开发中 UniApp 项目编译时会按平台自动选择合适版本源码包保留这些文件更多是为了本地调试和测试页面的独立运行。index.html 是 H5 端入口页面SpecRunner.html 是 Jasmine 测试运行页jasmine.css 是测试报告样式。这里有个容易误解的地方index.js 不是 Vue 项目的入口主文件而是测试辅助或页面逻辑挂载脚本真正的前端入口在 src 或 pages 目录里。html2canvas.js 和 html2canvas.esm.js 是截图库常见用途是生成分享海报。微短剧场景里用户看完一集后往往会触发分享引导后台把当前剧集封面、观看进度、推广二维码画到一张 canvas 图片上再用这张图做分享卡片。这类功能在分销体系里特别重要因为分享图上的二维码就是绑定上下级关系的入口。提示如果只跑 H5 或小程序不要手动引入 html2canvas 的 global 版本UniApp 编译时通过 npm 引入 esm 版本更稳避免重复打包。2.2 uni_modules、uview-ui 与 uniCloud-aliyun第三方依赖和云服务边界源码目录里有两个必须分清的部分uni_modules 和 uniCloud-aliyun。uni_modules 是 UniApp 官方插件规范目录里面的 uview-ui 是一套基于 Vue 的 UI 组件库。短剧详情页、充值弹窗、VIP 开通页、分销中心列表很多现成组件都是从这来的。如果后期要改按钮样式、弹窗交互、表单校验优先去 uview-ui 对应的组件文件里改不要在业务页面里硬覆盖样式否则组件更新或重新编译时会翻车。uniCloud-aliyun 目录表示这套源码接入过云开发环境存在云函数或云数据库的逻辑。但注意一个关键判断核心业务如订单、支付、用户资产不能只依赖云函数。原因是微短剧的支付回调、分销分账、风控逻辑需要与后端数据库事务强一致云函数也能做但团队如果没有云开发运维经验生产环境建议还是走 JAVA 后端提供的 HTTP 接口。源码里保留 uniCloud 目录多数场景是用于上报、配置下发这类轻量逻辑。另一个值得关注的是 node_modules 目录。如果源码包直接带着 node_modules说明作者打包时把依赖一起打了如果没有需要先执行 npm install。这里建议不要直接信任旧依赖尤其是 vue、uview-ui、html2canvas 这几个包版本差距大了会出现编译报错后面会专门讲。2.3 pages.json 与 ext.json页面路由和第三方扩展配置读法pages.json 是 UniApp 项目里最重要的配置文件它决定页面路由、导航栏样式、tabBar 结构。读这套源码时我会先打开 pages.json 看一遍页面清单基本就能画出业务地图首页、剧集列表、播放页、充值页、VIP 开通页、订单记录页、分销中心页、个人中心页一个短剧平台的骨架全在这。{ pages: [ { path: pages/index/index, style: { navigationBarTitleText: 首页 } }, { path: pages/drama/detail, style: { navigationBarTitleText: 剧集详情 } }, { path: pages/pay/recharge, style: { navigationBarTitleText: 充值 } }, { path: pages/user/vip, style: { navigationBarTitleText: VIP服务 } } ], globalStyle: { navigationBarTextStyle: white, navigationBarBackgroundColor: #1a1a1a, backgroundColor: #111111 } }这段配置的逻辑很直接path 对应 pages 目录下的页面文件style 里的 navigationBarTitleText 是顶部标题。黑色背景是短剧类应用的常见设计因为播放页要弱化系统导航栏、强化沉浸感。如果需要新增一个“每日签到”页面就是复制一段 path 配置再在 pages 目录下创建对应 vue 文件。ext.json 在 UniApp 里通常用于小程序平台扩展配置比如第三方插件、自定义组件、某些平台特有的权限声明。如果只做 H5 端ext.json 基本不影响运行但编译到微信小程序时如果页面里用了原生插件必须在 ext.json 里声明。很多人拿到源码后编译小程序报“插件未授权”第一反应是改代码其实先看 ext.json 有没有对应配置更高效。3. 核心业务流程落地从剧集列表到付费解锁的完整链路微短剧的商业模式看着简单实际落地时比普通视频网站多了一层“单集解锁”逻辑。用户看前几集免费到付费集时点播放前端要判断当前用户是否已解锁该集。已解锁直接放未解锁弹出充值或 VIP 引导。这个链路如果只在端上判断很容易被绕过必须由后端的订单和解锁记录共同控制。3.1 微短剧视频流播放的页面编排与组件调用播放页是整套源码里最核心的交互页面。UniApp 的 video 组件在 H5 端会渲染成 html5 video在微信小程序端会渲染成原生 video 组件两者事件和方法基本对齐但样式和层级表现有差异。template view classplayer-page video :idplayer episodeId :srccurrentPlayUrl :postercurrentPoster controls playonPlay endedonEnded erroronError /video view classepisode-list view v-forep in episodeList :keyep.id :class[ep-item, { active: ep.id currentEpisodeId }] clickswitchEpisode(ep) {{ ep.title }} /view /view /view /template这段模板有三个关键点。第一video 的 id 用了动态拼接原因是一个页面可能同时存在多个播放实例或者同一组件被复用固定 id 会导致 context 获取错乱。第二currentPlayUrl 不是简单地从列表里取而是通过一个 getPlayUrl 方法请求后端后端根据用户解锁状态返回可播放地址或错误码。第三play 事件里要做观看上报包括用户 id、剧集 id、集数、时间点这是后续统计解锁转化率的数据来源。参数层面poster 的地址不一定来自视频文件属性常见做法是单独的封面图 CDN 地址。controls 属性直接使用系统播放控件在微短剧场景里通常是够用的但如果要自定义倍速、下一集按钮需要把 controls 去掉自己封装播放器 UI那工作量会大不少。这里我一般建议第一版先保留原生 controls把精力放在解锁逻辑和支付链路上。3.2 虚拟支付与微信支付的支付结果一致性处理这套源码同时包含虚拟支付和微信支付是它最有参考价值的地方。虚拟支付通常用于 App 端或平台内结算微信支付用于小程序和 H5 端。但两条支付通道最终都必须落回 JAVA 后端同一个订单体系。支付回调是后端最容易出问题的环节。微信支付回调是异步的用户支付成功后微信服务器会向 notify_url 发通知后端处理完必须返回固定报文否则微信会重复通知。常见错误是回调里先去给用户解锁再验签或者重复通知时不判断订单状态导致用户权益被加两次、分销佣金被算两次。RestController RequestMapping(/api/pay) public class PayNotifyController { Resource private OrderService orderService; PostMapping(/notify/wx) public String wxNotify(RequestBody String xmlBody) { // 1. 先验签验签失败直接记录日志并返回失败 // 2. 解析订单号 outTradeNo、微信交易号 transactionId、实付金额 // 3. 根据 outTradeNo 查询订单判断当前订单状态是否已支付 // 4. 若已支付直接返回 SUCCESS保证幂等 // 5. 若未支付在事务里更新订单状态、写入解锁记录、触发分销分账 // 6. 返回微信约定的 SUCCESS 报文 return xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msg/xml; } }这段伪代码的核心不是具体 API而是顺序验签在前幂等判断在前业务更新在后。很多人写的回调是先改订单状态再验签一旦回调地址被伪造或验签逻辑出错就会出现用户没付钱也能解锁的严重漏洞。虚拟支付的处理逻辑类似但回调来源变成平台服务端验签方式和字段名不同。源码里如果有虚拟支付的适配层建议把两条通道的订单查询、状态更新、解锁发放抽象成同一个 service 方法这样后续接入其他支付渠道时只需要新增一个 adapter不用动核心事务。3.3 分销管理与充值记录数据模型和接口设计参考分销是微短剧项目拉新最重要的手段。用户 A 分享海报给 BB 充值解锁A 获得佣金。这个逻辑涉及两个核心数据表分销关系表和订单表。CREATE TABLE t_drama_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) NOT NULL COMMENT 业务订单号, user_id BIGINT NOT NULL COMMENT 下单用户, drama_id BIGINT NOT NULL COMMENT 短剧ID, episode_no INT NOT NULL COMMENT 解锁集数, pay_channel TINYINT NOT NULL COMMENT 1-虚拟支付 2-微信支付, amount DECIMAL(10,2) NOT NULL COMMENT 实付金额, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待支付 1已支付 2已退款, create_time DATETIME NOT NULL, pay_time DATETIME DEFAULT NULL, PRIMARY KEY (id), KEY idx_user (user_id), KEY idx_order_no (order_no) ); CREATE TABLE t_distribution_relation ( id BIGINT PRIMARY KEY AUTO_INCREMENT, parent_user_id BIGINT NOT NULL COMMENT 上级分销人, child_user_id BIGINT NOT NULL COMMENT 下级用户, commission_rate DECIMAL(5,2) NOT NULL DEFAULT 0.10 COMMENT 佣金比例, bind_time DATETIME NOT NULL, UNIQUE KEY uk_child (child_user_id) );表结构里的金额字段必须用 DECIMAL不要用 FLOAT 或 DOUBLE。分销佣金计算涉及乘法float 在数据库层面会出精度问题这是金融类业务的基本常识。佣金比例 0.10 表示 10%具体数值应根据平台政策和短剧方分成比例配置。接口设计上分销逻辑最关键的是绑定时机。用户第一次通过分享链接进入小程序或 H5 时前端把分享者的分销码带在 URL 参数里后端确认该用户没有绑定关系后才写入 t_distribution_relation。绑定后不可变更避免用户为了换上级反复取消重新绑定。订单支付成功后在同一个事务里根据 user_id 查询 parent_user_id再按 amount 和 commission_rate 计算佣金写入分销流水表。提示这里有一个容易漏掉的细节用户自购买解锁后如果发生退款分销佣金必须同步回滚或记为负数流水否则分销数据和财务对不上。源码里如果没处理退款场景二次开发时建议优先补上。4. 部署、调试与二次开发把源码跑起来的 5 个关键步骤资源拿到手第一件事不是读代码而是让它先跑起来。这套源码涉及 JAVA 后端、UniApp 前端、微信小程序编译三个环境任何一个环节版本不匹配都会卡住。以下是我拆这类项目时固定走的步骤每一步都会卡掉一部分人。4.1 环境准备JAVA 后端、HBuilderX 和微信开发者工具后端建议使用 JDK 8 或 11配合 Maven 管理依赖。短剧业务量初期不大MySQL 5.7 或 8.0 都可以Redis 用来存登录态和播放进度缓存。前端准备 HBuilderX 最新稳定版它有内置的 UniApp 编译能力小程序端还需要微信开发者工具用来接收编译产物。环境版本要注意对应关系。JAVA 后端如果用的是 Spring Boot 2.xJDK 8 最稳如果源码里已经是 Spring Boot 3.x必须用 JDK 17。启动后端前先确认配置文件里的数据库地址、Redis 地址、支付回调域名是否与本地一致否则后端能启动但所有接口都连不上库。# 后端启动以 Maven 项目为例 mvn clean package -DskipTests java -jar target/drama-server.jar --spring.profiles.activedev-skipTests 是为了跳过测试类第一次运行时不建议跳过因为部分测试会校验基础表和配置项跑一遍能提前发现字段缺失问题。不过如果测试代码依赖外部支付沙箱环境本地跑不过也正常看着报错判断是不是环境影响。前端打开 HBuilderX选择“文件 - 导入 - 从本地目录导入”选中源码根目录。如果是带 node_modules 的完整包导入后可以直接运行如果依赖缺失先执行 npm install。4.2 运行前端从 H5 到微信小程序的双端验证运行前端不要直接点“发行”先点“运行到浏览器”验证 H5 端。H5 端启动快报错信息直观适合调业务逻辑。# 如果项目使用 npm 脚本管理 npm install npm run dev:h5更常见的做法是在 HBuilderX 里菜单栏选“运行 - 运行到浏览器 - Chrome”。编译完成后浏览器打开本地地址此时页面能出来但接口大概率不会通因为前端默认请求地址还是生产环境的域名或内网地址。需要把前端配置里的 baseURL 改成后端本地地址。// config/env.js export default { baseURL: http://localhost:8080/api, timeout: 15000, uploadURL: http://localhost:8080/api/upload, pay: { virtualPayEnabled: true, wxPayEnabled: true } }baseURL 改完后注意浏览器跨域问题。JAVA 后端如果没配 CORSH5 端会报跨域错误。调试阶段最简单的方案是在后端加一个全局 CORS 过滤器允许本地开发地址跨域上线后记得收紧为业务域名。小程序端运行要先在 HBuilderX 里配置微信开发者工具路径然后选“运行 - 运行到小程序模拟器 - 微信开发者工具”。编译产物会生成到 unpackage/dist/dev/mp-weixin 目录微信开发者工具自动加载。此时不能用 localhost 作为接口地址因为小程序真机或模拟器里 localhost 指向的不是你的电脑需要用局域网 IP并且后端要监听 0.0.0.0 而不是默认的 127.0.0.1。4.3 联调接口登录态、支付回调和分销关系链怎么串前端跑起来后联调的第一件事是登录。短剧类项目一般用手机号验证码登录后端返回 token前端存入 storage。所有需要登录的接口请求头里带 token后端通过拦截器校验。// utils/request.js const token uni.getStorageSync(token); uni.request({ url: getApp().globalData.baseURL /api/drama/detail, method: GET, header: { Authorization: Bearer token }, success: (res) { // 根据 code 判断业务状态 } });登录态串通后重点验证分销绑定链路。在 H5 端 URL 后面手动加一个分销参数例如 ?inviteCodeTEST001进入首页后调用绑定接口然后去充值一笔沙箱支付观察分销关系表和佣金流水是否生成。注意联调支付回调时微信支付不能直接在小程序模拟器里完成真实扣款。常见做法是后端通过一个 debug 接口模拟支付成功直接调用回调逻辑。这个接口上线前必须去掉或加权限保护否则等于留了一个自刷支付的后门。5. 避坑与常见问题排查拆这套源码时最容易翻车的 5 个地方源码能跑通和能上线是两回事。我拆过不少短剧类项目以下 5 个问题属于高频翻车点每条都是现象、原因、解决三步讲清楚建议直接收藏当排查手册。5.1 问题一H5 端播放器黑屏或无法起播现象页面正常剧集列表能加载但点击播放后视频区域一片黑控制台报 MEDIA_ERR_SRC_NOT_SUPPORTED 或类似错误。原因常见有两种。第一视频地址是 HTTP而当前页面是 HTTPS浏览器直接拦截了混合内容第二视频地址带了防盗链校验服务端检查 Referer本地调试时 Referer 是 localhost不在白名单。解决先看浏览器控制台具体报错如果是 Mixed Content把视频地址换成 HTTPS 或让后端提供 HTTPS 播放地址。如果是防盗链问题在视频服务的防盗链配置里临时放行本地域名或通过后端代理转发视频流由后端统一加鉴权参数。不要在前端代码里硬编码 Referer浏览器禁止修改。5.2 问题二微信支付回调丢失导致订单状态不一致现象用户微信支付成功但订单状态一直显示待支付用户反复点击解锁提示未支付客服后台能看到微信账单已扣款。原因支付回调没有到达后端或者后端处理回调时抛异常微信重试几次后停止回调。常见原因是回调地址写成了 HTTP微信要求 HTTPS或者回调处理接口没有设置超时保护执行时间过长被微信判定失败。解决支付回调接口必须有独立日志记录原始报文、验签结果、处理异常堆栈。回调地址统一走 HTTPS。处理逻辑里加数据库幂等表同一订单号只允许成功处理一次。补一个定时对账任务每 10 分钟拉取一段时间内已支付但本地未成功的订单主动向微信查询订单状态发现已支付则补单。这套“被动回调 主动对账”的组合是支付类项目能长期稳定运行的兜底方案。5.3 问题三UniApp 编译后样式错乱现象H5 端页面正常编译到微信小程序后部分按钮大小不对、弹窗位置偏移、rpx 换算结果和预期不一致。原因UniApp 里 rpx 在不同平台换算基准不同。H5 端通常以 750rpx 对应屏幕宽度小程序端也是但某些组件库的样式在 H5 编译时会自动注入 web 兼容代码和小程序原生渲染机制冲突。另一个常见原因是 uview-ui 的版本和 Vue 版本不匹配例如 Vue 3 项目里引入了 Vue 2 版本的 uview-ui。解决先确认源码依赖的是 Vue 2 还是 Vue 3再去 uview-ui 官网找对应版本。样式问题优先用通用 class 覆盖尽量避免直接改 node_modules 里的组件源码。如果某个样式在双端始终无法统一建议该组件拆成条件编译用#ifdef MP-WEIXIN和#ifndef MP-WEIXIN分别写样式这是 UniApp 官方推荐的方案。5.4 问题四uniCloud 云函数本地调试超时现象在 HBuilderX 里右键云函数选择“本地运行”一直卡在连接状态最后报超时。原因uniCloud 本地调试依赖 HBuilderX 内置的本地服务某些网络环境下内置依赖下载失败或者云函数代码里请求了远程数据库网络不通导致等待。还有一个原因云函数默认超时时间较短代码里有循环请求外部接口超过默认 5 秒就断了。解决先在 HBuilderX 插件市场重新安装 uniCloud 相关插件更新到最新版。云函数代码里检查是否有同步等待远程接口如果有改成异步并发并在云函数配置里把超时时间调整到 30 秒以上。本案例中核心业务还是 JAVA 后端uniCloud 云函数主要用于轻量网关调试不通时不要卡在这里直接切到 JAVA 接口联调更节省时间。5.5 问题五分销佣金计算精度丢失现象用户充值 99 元佣金比例 10%分销后台显示佣金 9.899999 元用户提现时金额对不上。原因代码里用了 double 或 float 计算金额。99 乘以 0.1 在二进制浮点数里无法精确表示得到 9.899999999。解决金额计算统一使用 BigDecimal数据库用 DECIMAL。更稳妥的做法是把金额单位从元改为分数据库存整数计算时使用整数乘法只在展示层除以 100 并格式化为两位小数。// 错误写法 double commission amount * rate; // 9.899999999 // 正确写法 BigDecimal amountInCents new BigDecimal(9900); // 99元 9900分 BigDecimal rate new BigDecimal(0.10); long commissionInCents amountInCents.multiply(rate).longValue(); // 990分这里背后的逻辑是支付接口返回的金额通常以分为单位分销佣金也应以分结算。把单位统一后提现、退款、对账都通过整数运算精度问题彻底消失。整套源码里如果有其他涉及金额加减的地方比如充值流水和消费记录查询都建议按这个规则排查一遍。6. 从源码到可运营项目验证闭环与上线前的最后一道检查很多人拆完源码后功能都能跑但不敢上线。原因是支付和分销这两个环节一旦出错损失的是真金白银。所以我会在自己的工作流里加一道验证闭环把测试、对账、沙箱支付串成一条固定流程。6.1 用 SpecRunner 跑一遍前端单元测试源码根目录里有 jasmine.css 和 SpecRunner.html这是 Jasmine 测试框架的入口。打开 SpecRunner.html浏览器会自动执行 spec 目录下的测试用例。第一次跑如果全是绿色说明基础逻辑没被破坏如果有红先看是不是修改了公共方法导致的。建议给业务核心方法补一个测试用例比如金额格式化、订单号生成、分销码校验这类纯函数describe(订单号生成, function () { it(同一批次内订单号不重复, function () { const batch []; for (let i 0; i 1000; i) { batch.push(generateOrderNo()); } expect(new Set(batch).size).toBe(1000); }); });6.2 虚拟支付沙箱与分销分账的验收脚本支付和分销联调完成后我会写一个简单的检查脚本模拟一遍完整流程用户注册 - 绑定分销关系 - 下单 - 沙箱支付 - 回调处理 - 解锁 - 佣金入账。任何一个环节的断言失败脚本直接红色退出。# 分账一致性检查脚本模拟一次完整支付解锁流程 node check_pay_flow.js \ --invite-code TEST001 \ --amount 9900 \ --channel virtual这个脚本不直接跑线上数据库而是指向测试库。脚本跑完后人工核对三张表订单表状态为已支付解锁记录表有对应剧集权限分销流水表有正确的佣金记录。三者一致说明链路基本可靠。6.3 收尾个人习惯和希望帮到你从那以后我每次拆这类源码都会强制走一遍“测试页 - 沙箱支付 - 对账检查”三个步骤即使后端接口已经调通也不会跳过。因为支付项目的坑往往不在正常流程里而在回调重试、网络超时、金额边界这些不容易复现的角落。这套基于 JAVA 后端和 UniApp 的微短剧 H5 视频观看服务源码最大的参考价值就是把虚拟支付、微信支付、分销、VIP、充值记录这些复杂业务完整地放在了一个工程里你不需要从零设计只需要理解它然后按自己的业务裁剪。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?