Appearance
网页 JS SDK
T3 网络验证网页 JavaScript SDK,使用 Web Crypto API 实现 RSA 加密,可直接在浏览器中运行。
适用场景
- 网页应用 / H5 页面
- Electron 渲染进程
- 浏览器插件
无额外依赖
SDK 使用浏览器内置 Web Crypto API 和 BigInt,不依赖任何库。
浏览器兼容性
需要支持 Web Crypto API 和 BigInt 的现代浏览器(Chrome 67+, Firefox 68+, Safari 14+, Edge 79+)。
初始化
方式一:Base64 自定义编码集
javascript
const verify = new T3Verify();
verify.init({
loginCode: '你的单码登录调用码',
noticeCode: '你的公告调用码',
versionCode: '你的版本号调用码',
heartbeatCode: '你的心跳调用码',
appkey: '你的程序APPKEY',
base64Charset: '你的Base64自定义编码集',
encodeType: 'base64',
});方式二:RSA 算法 + HEX 编码 推荐
javascript
const verify = new T3Verify();
verify.init({
loginCode: '你的单码登录调用码',
noticeCode: '你的公告调用码',
versionCode: '你的版本号调用码',
heartbeatCode: '你的心跳调用码',
appkey: '你的程序APPKEY',
rsaPublicKey: `-----BEGIN PUBLIC KEY-----
你的RSA公钥
-----END PUBLIC KEY-----`,
encodeType: 'rsa',
});后台配置
使用 SDK 前,请先完成 后台快速配置。您也可以在后台「SDK 下载与注入」页面一键自动配置并下载已注入配置信息的 SDK,无需手动填写。
推荐调用顺序
API 方法参考
异步调用
所有 API 方法均为异步,需使用 await 调用。
获取机器码
javascript
const machineCode = getMachineCode();提示
网页端机器码基于浏览器指纹生成,精度不如原生应用。
获取程序公告 getNotice() async
javascript
const result = await verify.getNotice();
if (result.success) {
console.log(`公告: ${result.notice}`);
} else {
console.log(`失败: ${result.error}`);
}获取最新版本号 getLatestVersion() async
javascript
const result = await verify.getLatestVersion();
if (result.success) {
console.log(`最新版本: ${result.version}`);
} else {
console.log(`失败: ${result.error}`);
}单码卡密登录 login(kami, imei) async
javascript
const result = await verify.login(card, machineCode);
if (result.success) {
console.log(`到期时间: ${result.end_time}`);
const statecode = result.statecode;
} else {
console.log(`登录失败: ${result.error}`);
}单码心跳验证 heartbeat(kami, statecode) async
javascript
const result = await verify.heartbeat(card, statecode);
if (result.success) {
console.log('心跳验证成功');
} else {
console.log(`心跳失败: ${result.error}`);
}检查更新 checkUpdate(ver) async
javascript
const result = await verify.checkUpdate('1000');
if (result.success) {
if (result.hasUpdate) {
console.log(`最新版本: ${result.ver}`);
console.log(`更新公告: ${result.uplog || ''}`);
console.log(`下载地址: ${result.upurl || ''}`);
}
}查询卡密信息 queryKami(kami) async
javascript
const result = await verify.queryKami(card);
if (result.success) {
console.log(`到期时间: ${result.end_time}`);
console.log(`剩余时间: ${result.available}秒`);
}用户注册 userRegister(user, password, email) async
javascript
const result = await verify.userRegister('username', 'password', 'email@example.com');
if (result.success) {
console.log('注册成功');
}用户登录 userLogin(user, password, imei) async
javascript
const result = await verify.userLogin('username', 'password', machineCode);
if (result.success) {
console.log(`到期时间: ${result.end_time}`);
const userStateCode = result.statecode;
}用户心跳验证 userHeartbeat(user, password, statecode) async
javascript
const result = await verify.userHeartbeat('username', 'password', userStateCode);用户充值 recharge(user, card) async
javascript
const result = await verify.recharge('username', 'recharge_card');用户绑定QQ bindQQ(user, password, openid, accessToken) async
javascript
const result = await verify.bindQQ('username', 'password', 'openid', 'access_token');用户QQ登录 qqLogin(openid, accessToken) async
javascript
const result = await verify.qqLogin('openid', 'access_token');解绑设备 unbindKami / unbindUser async
javascript
// 单码解绑
const result = await verify.unbindKami(card, machineCode);
console.log(result.success ? ` ${result.msg}` : ` 失败: ${result.error}`);
// 用户解绑
const result2 = await verify.unbindUser('username', 'password', machineCode);
console.log(result2.success ? ` ${result2.msg}` : ` 失败: ${result2.error}`);IP 解绑 ipUnbindKami / ipUnbindUser async
javascript
// 单码 IP 解绑
const result = await verify.ipUnbindKami(card);
console.log(result.success ? ` ${result.msg}` : ` 失败: ${result.error}`);
// 用户 IP 解绑
const result2 = await verify.ipUnbindUser('username', 'password');
console.log(result2.success ? ` ${result2.msg}` : ` 失败: ${result2.error}`);获取远程变量 getVariableByKami / getVariableByUser async
javascript
// 通过卡密获取
const result = await verify.getVariableByKami(card, '变量ID', '变量名称');
if (result.success) console.log(`变量值: ${result.value}`);
else console.log(`失败: ${result.error}`);
// 通过用户获取
const result2 = await verify.getVariableByUser('username', 'password', '变量ID', '变量名称');
if (result2.success) console.log(`变量值: ${result2.value}`);
else console.log(`失败: ${result2.error}`);修改远程变量 modifyVariableByKami / modifyVariableByUser async
javascript
// 通过卡密修改
const result = await verify.modifyVariableByKami(card, '变量ID', '新内容');
console.log(result.success ? ` ${result.msg}` : ` 失败: ${result.error}`);
// 通过用户修改
const result2 = await verify.modifyVariableByUser('username', 'password', '变量ID', '新内容');
console.log(result2.success ? ` ${result2.msg}` : ` 失败: ${result2.error}`);修改核心数据 modifyCoreByKami / modifyCoreByUser async
javascript
// 通过卡密修改
const result = await verify.modifyCoreByKami(card, '核心数据');
console.log(result.success ? ` ${result.msg}` : ` 失败: ${result.error}`);
// 通过用户修改
const result2 = await verify.modifyCoreByUser('username', 'password', '核心数据');
console.log(result2.success ? ` ${result2.msg}` : ` 失败: ${result2.error}`);获取核心数据 getCoreByKami / getCoreByUser async
javascript
// 通过卡密获取
const result = await verify.getCoreByKami(card);
if (result.success) console.log('核心数据:', result.core);
// 通过用户获取
const result2 = await verify.getCoreByUser('username', 'password');
if (result2.success) console.log('核心数据:', result2.core);返回值:Object
| 字段 | 类型 | 说明 |
|---|---|---|
success | boolean | 是否成功 |
core | string | 核心数据内容 |
error | string | 错误信息 |
获取在线数量 getOnlineKamiCount / getOnlineUserCount async
javascript
// 获取在线卡密数量
const result = await verify.getOnlineKamiCount();
if (result.success) console.log('在线卡密数:', result.count);
// 获取在线用户数量
const result2 = await verify.getOnlineUserCount();
if (result2.success) console.log('在线用户数:', result2.count);返回值:Object
| 字段 | 类型 | 说明 |
|---|---|---|
success | boolean | 是否成功 |
count | number | 在线数量 |
error | string | 错误信息 |
获取云文档 getCloudDoc(token) async
javascript
const result = await verify.getCloudDoc('云文档Token');
if (result.success) {
console.log(`内容: ${result.content}`);
}应用签名比对 appSign(autograph) async
javascript
const result = await verify.appSign('应用签名');
if (result.success) {
console.log(` ${result.msg}`);
console.log(` 后台签名: ${result.autograph}`);
} else {
console.log(` 失败: ${result.error}`);
}用户修改密码 changePassword(user, oldpass, newpass) async
javascript
const result = await verify.changePassword('username', '旧密码', '新密码');禁用 disableKami / disableUser async
javascript
// 禁用卡密
const result = await verify.disableKami(card);
console.log(result.success ? ` ${result.msg}` : ` 失败: ${result.error}`);
// 禁用用户
const result2 = await verify.disableUser('username', 'password');
console.log(result2.success ? ` ${result2.msg}` : ` 失败: ${result2.error}`);用户注销 userCancel(user, password) async
javascript
const result = await verify.userCancel('username', 'password');完整示例
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>T3验证 - 网页示例</title>
</head>
<body>
<button onclick="main()">开始验证</button>
<script src="t3sdk.js"></script>
<script>
async function main() {
const verify = new T3Verify();
verify.init({
loginCode: 'F2FA89AD46C050B2',
noticeCode: '3512425FE75AE73A',
versionCode: 'F119CF1323743DBC',
heartbeatCode: 'B1D2263C3702177F',
appkey: '5d116108006a454d538839ccff2d32f9',
rsaPublicKey: `-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----`,
encodeType: 'rsa',
});
const card = '你的卡密';
const machineCode = getMachineCode();
// 1. 获取公告
let result = await verify.getNotice();
if (result.success) console.log(`公告: ${result.notice}`);
// 2. 获取版本号
result = await verify.getLatestVersion();
if (result.success) console.log(`最新版本: ${result.version}`);
// 3. 单码登录
result = await verify.login(card, machineCode);
if (result.success) {
console.log(`到期时间: ${result.end_time}`);
// 4. 心跳
result = await verify.heartbeat(card, result.statecode);
if (result.success) console.log('心跳验证成功');
}
}
</script>
</body>
</html>调试
打开浏览器控制台(F12)查看输出结果。