
简介天极网络验证系统3.0源码修复版附带易模块源码专为软件、插件、APP及网站开发者提供轻量级授权验证方案适合需要快速搭建或二次开发网络验证服务的技术人员。资源共1527个文件压缩包仅11.25MB包含PHP后端、JavaScript前端、HTML页面、CSS样式以及SQL脚本、PNG/GIF图标等素材目录覆盖源码、对接模块、网站程序与教程文档便于按需查阅。已有247人学习/下载上手门槛适中。借助易模块可进行模块化集成方便将授权机制嵌入现有项目同时附带的教程能帮助开发者完成安装、配置与调试缩短部署周期。修复版在稳定性与安全性上有所加强适合用于商业软件授权管理、会员系统对接及防破解保护等场景。1. 先搞清楚天极3.0到底替你做了什么做过软件收费的都知道本地注册码校验是最容易翻车的环节无论是把校验结果写进注册表还是藏在某个dll里只要判断逻辑还在用户硬盘上就一定会被脱壳、patch、做成注册机。天极网络验证系统3.0的思路是把“这个用户有没有权限”这个判断从客户端挪到服务端——客户端只负责把设备信息和账号凭证提交给PHP接口具体放行还是拒绝由服务端决定。这套修复版重点解决了早期版本的三类问题回调token会随机失效、服务器与客户端时间偏差导致误判、易模块在Win10/Win11下取设备码返回空串。源码包里带了完整的易模块源码和后端管理面板适合给EXE工具、插件、APP做授权分发也适合当网站会员登录的鉴权层。2. 服务端部署目录结构、数据库与第一张卡密2.1 先看源码目录别急着上传解压压缩包后第一印象是文件很杂但拆开看其实就四块PHP接口源码、后台管理页面、易模块源码.ec/.e、文档教程。assets目录里那一堆bootstrap.min.css、layui.css、app.min.css、skin.css表面上是样式文件实际上暴露了后台的前端技术栈——bootstrap和layui混用皮肤走的是AdminLTE那套。这是早期PHP验证系统很常见的组合后台管理页迭代过几轮前端框架换过但没彻底清理。二次开发时注意别在同一个页面同时引两套框架的同名类 layui的form和bootstrap的form冲突时表单样式会莫名错乱。根目录的php-parse.bat是Windows下的PHP语法检查批处理内容就是遍历php文件执行php -l。改完接口源码后双击跑一遍能提前发现少分号、引号没闭合这类低级错误比传上服务器再报500快得多。部署之前把它用上成本几乎为零。运行环境方面这套系统不挑食常见配置就能跑组件推荐版本说明Web服务器Nginx 1.16 / Apache 2.4伪静态不是必须的默认入口文件方式即可PHP5.6 ~ 7.4用openssl做AES加解密7.x兼容性最好MySQL5.6 / 5.7不要直接上MySQL 8.0老代码里mysql_*函数或排序规则可能不兼容扩展fileinfo、curl、openssl检查fileinfo很多精简版PHP默认不开2.2 导入数据库与修改配置常见部署流程是先建库再改配置。以宝塔面板为例cd /www/wwwroot || exit unzip tianji3-fixed.zip -d /www/wwwroot/auth chown -R www:www /www/wwwroot/auth chmod -R 755 /www/wwwroot/auth mysql -uroot -p auth.sql这里说下逻辑解压到站点目录之后chown www:www是让PHP-FPM进程有读写权限否则后台生成卡密、写日志都会报权限错误auth.sql是初始化脚本一次性把数据库、表结构和默认管理员账号都建好。执行完进入安装向导填数据库地址、用户名、密码系统会生成config.php。这套系统的表结构不算复杂数据表带tj_前缀核心就是四张表表名职责关键字段tj_user终端用户username、password_md5、device_limit、expire_timetj_software接入的软件/应用appid、appkey、status、versiontj_card卡密card_no、card_pwd、duration_days、bind_devicetj_log验证与心跳日志appid、device、username、action、ip、create_time这里有个细节值得注意tj_user.device_limit是单账号最多绑定几台设备tj_card.bind_device是卡密是否绑定设备码。如果做的是低价工具建议卡密不绑设备允许换机做企业级软件再开绑定避免一个员工离职把卡密带走。2.3 后台添加软件与批量生成卡密部署完成后用默认管理员登录/admin第一件事是添加软件。填软件名称、版本号、回调地址提交后系统分配一个appid和appkey。appid是公开的appkey是客户端签名用的密钥所有在易模块里看到的通信都是基于这两个参数展开的。生成卡密在“卡密管理”菜单里批量生成时可以设卡密前缀、生成数量、有效天数、最大绑定设备数。前缀建议按渠道命名比如TG开头的给淘宝渠道JD开头的给京东渠道后面排查哪个渠道被人批量扫号时一眼就能从日志里分辨出来。生成后卡密列表支持导出Excel发给代理商或者走自动发卡流程都方便。到这里服务端已经能跑起来卡密也能生成了。但从客户端角度对接才是真正的关键这也是这个版本带易模块源码的优势所在。3. 易模块源码设备码、token与客户端对接3.1 易模块在授权链路里的位置天极3.0的易模块源码本质上是把易语言和PHP服务端之间那把“翻译钥匙”做成了可重复调用的模块。易语言本身没有成熟的HTTPS和JSON库直接用网页_访问裸调接口会遇到编码问题、证书问题、签名拼接麻烦。模块把这些全部封装好对外只暴露几个函数取设备码、账号验证、卡密验证、心跳维持、取公告。拿到易模块源码.ec格式后用易语言IDE的“工具→支持库配置→模块引用”加进项目即可。如果你需要改模块逻辑源码里包含.e源码文件改完重新编译模块就行。最常见的改动是取设备码的策略——默认可能只取硬盘序列号但部分笔记本硬盘序列号读取为空这时就要在模块源码里改成硬盘序列号MAC地址CPU ID三者拼接后取MD5保证唯一性的同时降低取空概率。3.2 设备码、token、心跳三个核心设计先说设备码。它是整个验证体系的锚点服务端判断“这个账号是否在多台设备上使用”全靠它。设备码的生成规则在易模块源码里一般是取硬盘序列号() 取MAC地址() 取CPU序列号()拼接后MD5得到32位字符串。这里有个容易踩的坑部分虚拟机环境里CPU序列号是固定的“00000000”会导致所有虚拟机设备码相同相互挤掉线。处理办法是在模块源码里加判断取到空值或全零值时自动跳过该字段用“主板序列号MAC”作为兜底。token的设计则更务实。每次验证通过后服务端返回一个token字符串客户端后续操作都带这个token而不是反复提交用户名密码。这么做的好处有两个一是减少数据库查询次数二是降低用户名密码在传输中被截获的风险。token一般带有效期快过期时客户端通过心跳接口续期。心跳机制是防止授权被绕过的关键客户端每3到5分钟调用一次心跳接口告诉服务端“我还活着”。如果超过设定时间比如10分钟没收到心跳服务端就认为客户端已退出释放设备绑定名额。这个机制也直接支持了“单设备同时在线”的场景——新设备登录时能把旧设备顶掉线靠的就是心跳过期判断。3.3 易语言端的调用示例打开易模块源码核心调用是账号密码验证和卡密验证两个函数。项目里放入模块后主程序代码通常是这个形态.版本 2 .支持库 spec .程序集 窗口程序集_启动窗口 .子程序 _启动窗口_创建完毕 局部变量 设备码, 文本型 局部变量 提交数据, 文本型 局部变量 返回文本, 文本型 设备码 取设备码 () 提交数据 “appid1001usernametest” “password123456” “device” 设备码 返回文本 网络验证_账号验证 (提交数据) 调试输出 (返回文本)关键在网络验证_账号验证这个函数它是易模块源码里最核心的方法。模块内部做的事情是拼接完整接口地址、加上时间戳和nonce随机字符串、用appkey做MD5签名然后POST给服务端。外面只需要传入appid、用户名、密码和设备码模块自己会处理编码和签名。从服务端返回的JSON通常是这样{code:1, msg:验证成功, data:{ token:f8a2d9..., expire_time:2026-01-01 12:00:00, notice:欢迎使用 }}模块内部会解析这个JSON把token存在全局变量里供后续调用。真正的易模块源码在返回之后还会做一件事验证token的md5是否与本地计算一致防止返回值在传输过程中被篡改。3.4 易模块接口参数说明读模块源码时重点关注这几个对外开放的接口函数函数名作用请求参数网络验证_账号验证账号密码登录appid、username、password、device网络验证_卡密验证卡密充值/登录appid、card_no、card_pwd、device网络验证_心跳token续期token、device网络验证_取公告拉取服务器公告appid网络验证_退出登录注销并释放设备token、device易模块源码里每个函数的参数顺序、返回格式都有注释。第一次对接时最容易出问题的反而不是模块本身而是参数值——比如appid填成了后台里的软件ID而不是appid或者password没有按模块要求的MD5方式预处理。遇到报错先从参数入手别急着改模块。4. 签名校验与防重放服务端接口的安全底线4.1 为什么必须加签名天极3.0的接口是HTTP明文传输如果客户端往服务端POST数据时不带签名任何人都能自己写个脚本模拟请求把expire_time改到十年后或者伪造卡密充值请求。所以服务端最重要的防线就是签名校验——客户端把参数加上appkey做排序拼接再算一次MD5服务端用同样的appkey重算不一致就直接拒绝。签名的计算规则在易模块源码和PHP源码里各有一份约定必须完全一致。常见规则是除了sign本身把所有请求参数按参数名ASCII码从小到大排序拼成keyvaluekeyvalue形式末尾拼接appkey再整个做MD5。客户端和服务端各算各的只要appkey不泄露伪造请求就做不到。4.2 时间戳与nonce防重放只有签名还不够。签名防的是“伪造”防不了“重放”——攻击者抓到你一次合法请求原样重发一百遍服务端没法区分是不是你本人。所以3.0的接口里同时要求带timestamp和nonce两个参数。timestamp规定客户端时间与服务端时间偏差不能超过300秒超过则拒绝nonce是随机字符串服务端在有效期内遇到重复的nonce直接拒绝。这部分逻辑可以在服务端check.php的入口看到。核心校验代码是这个形态?php // api/check.php 权限校验入口简化版 $appid $_POST[appid]; $device $_POST[device]; $ts (int)$_POST[timestamp]; $nonce $_POST[nonce]; $sign $_POST[sign]; // 客户端提交的签名 $appKey getAppKeyByAppId($appid); // 从tj_software表取appkey // 1. 时间窗口校验正负300秒 if (abs(time() - $ts) 300) { exit(json_encode([code 1003, msg timestamp expired])); } // 2. 防重放5分钟内同一个nonce不能重复出现 if (nonceExists($nonce, $appid)) { exit(json_encode([code 1008, msg nonce reused])); } saveNonce($nonce, $appid, 300); // 3. 服务端重算签名 $params [ appid $appid, device $device, timestamp $ts, nonce $nonce, ]; ksort($params); $str http_build_query($params) . key . $appKey; $expect md5($str); // 4. 用hash_equals比较避免时序攻击 if (!hash_equals($expect, $sign)) { exit(json_encode([code 1002, msg sign invalid])); } // 5. 签名通过后才进入实际的账号/卡密验证逻辑一步步说第一步用abs(time() - $ts)做时间窗口判断防的是离线抓包后长时间后重放第二步的nonce防的是窗口期内的短时重放同一个随机串300秒内只能出现一次第三步重新拼接参数算MD5与服务端收到的sign比对第四步用hash_equals而不是比较这是为了避免PHP里0e123...这类弱类型比较绕过。实际源码中nonce存储用的是MySQL的临时表或redis单机部署建议直接用tj_nonce表注意给expire_time字段加索引。4.3 易模块端的签名生成易模块源码里的签名生成逻辑要和服务端完全对应否则验证永远失败。在易模块源码中找到负责签名的子程序逻辑通常是.子程序 生成签名, 文本型 .参数 参数字典, 文本型 .局部变量 参数字段, 文本型, , 0 .局部变量 i, 整数型 .局部变量 拼接串, 文本型 参数字段 分割文本 (参数字典, “”, ) 数组排序 (参数字段, 0, ) 计次循环首 (取数组成员数 (参数字段), i) 拼接串 拼接串 参数字段 [i] “” 计次循环尾 () 拼接串 拼接串 “key” 全局_AppKey 返回 (取数据摘要 (到字节集 (拼接串)))这里有个易语言特有的坑数组排序默认按字节排序而不是ASCII排序中文字符串参与签名时会乱序导致两边签不上。解决方法是把排序对象限制在a-z 0-9范围内或者直接让所有参数名都用纯小写英文命名避开中文参与排序。4.4 设备绑定与封禁签名和nonce解决的是“请求来源可信”设备绑定解决的是“同一份授权不能被无限复制”。服务端在验证成功后会检查该账号当前绑定设备数是否达到上限。绑定关系存在tj_user_device表里每次心跳会刷新last_active时间。如果设备数超限新设备尝试绑定时会返回“设备数超限”错误同时给出最早活跃的设备信息供用户确认是否解绑。封禁逻辑也应该在这里处理检测到同一个设备码在短时间内高频请求比如每秒超过5次直接把对应IP加入临时黑名单响应1007错误码。这类黑名单不用持久化存内存或临时表都可以主要是防遍历卡密的行为。5. 日志定位、时间同步与二次开发收尾5.1 用tj_log表定位验证失败对接过程中遇到验证失败不要凭感觉猜直接查日志表。验证日志里记录了每次请求的appid、设备码、用户名、action、IP、返回码和时间SELECT create_time, appid, device, username, action, code, ip FROM tj_log WHERE create_time DATE_SUB(NOW(), INTERVAL 1 HOUR) ORDER BY id DESC LIMIT 50;重点看code字段1002是签名不一致说明易模块的appkey和后台不一致优先检查全局_AppKey常量的值1003是时间戳偏差超过300秒先看服务器时间是不是标准时间1004是账号密码或卡密错误这类请求往往来自同一IP的大量尝试说明卡密被扫号了应立刻在后台禁用对应卡密批次1006是设备数超限说明账号在多台机器上被使用。5.2 时间不同步与老版本PHP问题时间偏差是这类验证系统最常见的误判源也是修复版重点处理的部分。检查方法很简单date -R php -r echo date(Y-m-d H:i:s, time());如果服务器时间与北京标准时间偏差超过5分钟用NTP同步一次ntpdate time.windows.com systemctl restart php-fpm另一个高发问题是老版本PHP5.6/7.0访问HTTPS接口时的SSL错误。PHP 5.6之后默认开启了证书校验如果服务器证书链不完整接口会返回SSL certificate problem。定位时在易模块端看到的是空返回或超时容易误判成接口地址错误。测试阶段可以在PHP代码里临时加curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);跳过校验但上线前必须换回正常校验否则签名参数容易在传输中被篡改。5.3 对接其他语言的思路易模块只解决了易语言客户端的对接问题但很多场景下客户端是C#、Python或者网页。这套系统的PHP接口本身是HTTP协议其他语言直接按同样的签名规则调用即可不需要易模块。比如C#调用验证接口核心就是用HttpWebRequest把参数拼好POST过去签名用MD5.Create()计算排序规则与易模块保持一致。网页端直接做AJAX调用更简单但要注意appkey不能写死在页面里否则等于公开了签名密钥。Web端常见的降级处理是让用户先通过验证码获取一个短时token后续请求都带这个token而不是appkey。5.4 数据库维护的两个收尾技巧最后给两个实际运维中很有用的技巧。第一tj_log表会随业务量快速增长建议写一个cron任务定期清理0 3 * * * mysql -uroot -pauth_db -e DELETE FROM tj_log WHERE create_time DATE_SUB(NOW(), INTERVAL 90 DAY)清理时注意在create_time字段上加索引否则全表扫描会把数据库拖垮。第二多个软件共用一套验证时tj_software表里每个软件的appkey要独立生成不要图省事所有软件用同一个appkey——一旦某个渠道的软件被人逆向拿到appkey其他软件全都要跟着重新配置密钥到时候改客户端和服务端的代价远大于现在多维护几个appkey的成本。本文还有配套的精品资源点击获取