开发者中心 v2.0
欢迎使用幺幺零网络验证。v2.0 版本引入了全新的 DEX 源码级构建引擎 和 多算法安全鉴权,为您提供更专业、更安全的授权管理方案。
全系统北京时间对齐 (UTC+8)
本系统所有到期时间、日志时间、签名校验均自动校准至北京时间,开发者无需考虑服务器时区偏差。
三步快速上线
创建应用
在控制台创建您的软件,获取独有的 AppKey 和 AppSecret。
选择集成方式
使用我们的全自动构建引擎生成插件,或手动调用 API 接入。
配置支付
配置支付宝/微信/易支付,实现卡密自动销售与发货。
安全鉴权机制
幺幺零网络验证 v2.0 采用多维度鉴权,所有 API 请求均受 签名 (Sign)、时间戳 (Timestamp) 和 随机数 (Nonce) 的保护。
1. 签名算法说明
根据请求平台的不同,系统会自动适配不同的哈希算法:
- Lua / 轻量级平台: 使用
MD5(为了极致的运行速度与精简库体积)。 - 原生平台 (Android/iOS/PC): 推荐使用
SHA256。
Sign = Hash(app_key + app_secret + timestamp + nonce)
import hashlib
import time
import uuid
app_key = "YOUR_APP_KEY"
app_secret = "YOUR_APP_SECRET"
timestamp = str(int(time.time()))
nonce = uuid.uuid4().hex[:16] # 16位随机字符串
# 原生平台推荐使用 SHA256
raw = f"{app_key}{app_secret}{timestamp}{nonce}"
sign = hashlib.sha256(raw.encode()).hexdigest()
print(f"Header/Body: timestamp={timestamp}, nonce={nonce}, sign={sign}")
-- Lua 平台签名示例 (MD5)
local app_key = "YOUR_APP_KEY"
local app_secret = "YOUR_APP_SECRET"
local timestamp = tostring(os.time())
local nonce = tostring(math.random(100000, 999999))
-- 需确保已加载 md5 库
local raw = app_key .. app_secret .. timestamp .. nonce
local sign = md5(raw)
// JS 签名示例
const appKey = "YOUR_APP_KEY";
const appSecret = "YOUR_APP_SECRET";
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = Math.random().toString(36).substring(2, 10);
const raw = appKey + appSecret + timestamp + nonce;
// 使用 crypto-js 或原生 SubtleCrypto
const sign = CryptoJS.SHA256(raw).toString();
RESTful API 参考
基础请求地址: https://yz.1108.top/api
1. 应用初始化 / 状态同步
POST应用启动时调用,用于获取配置、公告、版本信息,并可传入卡密执行“一键静默验证”。应用设置了试用分钟数且设备未激活时,首次无卡密调用会创建该设备/平台的试用记录。
trial_minutes 为空或 0 表示关闭;正整数表示试用分钟数。每个 app_id + device_id 全平台只启动一次,重装或重复请求不会重置到期时间;试用到期后返回 status=trial_expired,必须使用卡密激活。{
"app_key": "string",
"timestamp": "string",
"nonce": "string",
"sign": "string",
"device_id": "string", // 设备唯一码
"platform": "lua|ios|android|windows", // 平台标识
"card_code": "string", // 可选:静默验证卡密
"current_version": "string" // 可选:用于版本更新检查
}
关键响应字段:
| 字段 | 说明 |
|---|---|
status | active (正常) | error (未激活/异常) |
is_free | 1 为免费模式,跳过验证;0 为付费模式 |
trial_minutes | 应用试用分钟数;空值或 0 表示关闭,正整数表示每个设备/平台首次可试用的分钟数。 |
status | trial 表示试用中;trial_expired 表示该设备试用已到期,需要卡密激活。 |
hotupdate | 包含热更新版本号、下载地址及更新类型 (强制/建议) |
popup_diy | 弹窗 DIY 配置。存在时客户端可按 html_code 自定义显示授权弹窗/授权页;不存在或为空时继续使用默认弹窗。 |
heartbeat_interval | 建议心跳间隔(秒) |
trial | 1 表示本次为试用授权。试用客户端必须保持联网,心跳网络失败时应立即停止运行;正式卡密是否允许短时断网由各客户端策略决定。 |
trial_expired | 1 表示该设备试用已经用完,重新安装、清缓存、切换平台或修改本地时间不会重置,必须使用卡密激活。 |
2. 实时心跳监测
POST在应用运行期间定时调用。若后台冻结卡密或应用关停,此接口将立即返回 code: 1。
{
"app_key": "string",
"timestamp": "string",
"nonce": "string",
"sign": "string",
"device_id": "string",
"code": "string", // 当前使用的卡密
"platform": "string" // 建议传入,用于适配签名算法
}
3. 手动激活卡密
POST当一键验证失败(如新卡密)时,引导用户手动输入卡密并调用此接口进行激活。
{
"app_key": "string",
"timestamp": "string",
"nonce": "string",
"sign": "string",
"device_id": "string",
"code": "string", // 用户输入的卡密
"platform": "string" // 建议传入
}
4. 检测热更新/版本
POST查询指定平台的最新版本信息及热更新下载地址。
{
"app_key": "string",
"timestamp": "string",
"nonce": "string",
"sign": "string",
"platform": "lua|ios|android|windows",
"current_version": "string"
}
5. 软件内购卡 / 自动激活
NEW用于客户端在授权弹窗内直接拉取套餐、创建订单、打开支付并查询激活结果。该能力为新增接口,不影响旧版 /api/init、/api/activate、发卡网购卡链接和原支付回调。
create_key(... creator_id=开发者ID) 扣除开发者后台卡密额度;额度不足时不会发卡,也不会自动激活。
接入流程
- 调用
/api/shop/packages获取当前应用可售套餐。 - 用户选择套餐后调用
/api/shop/order/create创建订单。 - 客户端打开返回的
pay_url完成付款。 - 服务端收到支付平台异步回调后,自动发卡、扣开发者卡密额度,并按需绑定设备。
- 客户端轮询
/api/shop/order/status,当paid=true且activated=1时进入软件。
获取套餐
{
"app_key": "string",
"timestamp": "string",
"nonce": "string",
"sign": "string",
"platform": "android"
}
{
"code": 0,
"msg": "Success",
"data": [{
"package_id": 1,
"name": "月卡",
"description": "30天授权",
"duration_type": "month",
"duration_value": 1,
"duration_days": 30,
"duration_minutes": 0,
"price": 9.9,
"max_devices": 1
}]
}
创建订单
{
"app_key": "string",
"package_id": 1,
"device_id": "device_unique_id",
"platform": "android",
"pay_type": "alipay",
"customer_email": "user@example.com",
"auto_activate": true,
"return_url": "https://example.com/pay-return",
"timestamp": "string",
"nonce": "string",
"sign": "string"
}
{
"code": 0,
"msg": "Success",
"data": {
"order_no": "CD202608070930001234",
"pay_url": "https://pay.example.com/submit.php?...",
"status_url": "/api/shop/order/status",
"price": 9.9,
"package_name": "月卡",
"auto_activate": 1
}
}
查询订单状态
{
"app_key": "string",
"order_no": "CD202608070930001234",
"platform": "android",
"timestamp": "string",
"nonce": "string",
"sign": "string"
}
{
"code": 0,
"msg": "Success",
"data": {
"order_no": "CD202608070930001234",
"status": "paid",
"paid": true,
"package_name": "月卡",
"price": 9.9,
"key_code": "ABCD-EFGH-IJKL",
"auto_activate": 1,
"activated": 1,
"activation_message": "已激活",
"expire_time": "2026-09-07 12:00:00",
"paid_at": "2026-08-07 09:35:00"
}
}
| 状态 | 说明 |
|---|---|
pending | 待支付,或支付回调后发卡失败等待再次处理。 |
processing | 支付回调正在处理,通常只会短暂出现。 |
paid | 已支付并生成卡密;activated=1 表示已自动激活当前设备。 |
pay_url 和查询订单状态,发卡和激活以支付平台异步回调为准。
弹窗 DIY 配置对接
NEW后台「应用管理 → 弹窗DIY」保存的 HTML 会随验证接口返回给客户端。该功能为新增字段,老客户端不识别时可直接忽略,不影响原有 popup_announcement 和默认卡密弹窗。
返回位置
/api/init:返回在data.popup_diy。/api/activate:激活成功时返回在data.popup_diy。/api/check_update:返回在data.popup_diy,便于只检测更新时同步弹窗配置。
字段结构
"popup_diy": {
"id": 1,
"app_id": 100,
"platform": "android", // all|lua|ios|android|windows
"title": "授权弹窗",
"html_code": "<div data-display='modal' class='km-modal-card'>...</div>",
"status": 1,
"created_at": "2026-08-06 00:00:00",
"updated_at": "2026-08-06 00:00:00"
}
platform。同一平台允许保存多条配置,服务端返回当前平台最新启用的一条;若当前平台没有启用配置,则回退返回 all 平台最新启用配置;如果都没有,则 popup_diy 为 null。HTML 显示模式
建议在根元素显式声明显示方式,避免复杂 CSS 造成客户端误判:
<!-- 全屏授权页面 -->
<div data-display="fullscreen">...</div>
<!-- 居中授权弹窗 -->
<div data-display="modal" class="km-modal-card">...</div>
客户端处理建议
- 先判断
data.popup_diy是否存在、status === 1且html_code不为空。 - 存在 DIY HTML:使用客户端 WebView/HTML 容器渲染。
- 不存在 DIY HTML:继续显示客户端内置默认卡密弹窗,保持旧客户端兼容。
data-display="fullscreen"应覆盖整个授权界面;data-display="modal"应使用透明、居中的弹窗容器。- 约定元素 ID:
card-input、remember-card、activate-btn、buy-btn、contact-btn、notice-box。 buy_link为空时隐藏buy-btn;contact_link为空时隐藏contact-btn。
两类公告字段
| 字段 | 显示时机 | 处理方式 |
|---|---|---|
notice | 激活前 | 显示在默认卡密弹窗或 DIY 的 notice-box 内;若 DIY 未提供该元素,客户端可自动插入公告栏。 |
popup_announcement | 激活成功后 | 先关闭卡密/DIY 授权窗口,再单独弹出公告窗口;与 notice 相互独立。 |
伪代码示例
const payload = response.data;
const diy = payload.popup_diy;
if (diy && diy.status === 1 && diy.html_code) {
// 1. 创建 WebView / HTML 容器
renderAuthHtml(diy.html_code);
// 2. 绑定卡密输入与按钮事件
bindClick("activate-btn", () => {
const card = getInputValue("card-input");
callActivateApi(card);
});
bindClick("buy-btn", () => openUrl(payload.buy_link));
bindClick("contact-btn", () => openUrl(payload.contact_link));
} else {
// 老逻辑:显示默认卡密弹窗
showDefaultAuthDialog();
}
远程变量
兼容新增远程变量是应用级配置,由后台「应用管理 → 远程变量」设置。客户端每次调用验证接口时读取,不需要重新构建动态库、DEX、DLL 或 Lua 文件。它只返回配置值,不会远程执行代码。
1. 后台配置步骤
- 进入「应用管理」,找到目标应用。
- 点击该应用操作栏的「远程变量」按钮。
- 填写变量名、变量值、类型和平台,勾选「启用」。
- 保存后,客户端下一次请求验证接口即可读取新值。
2. 三个接口都会返回
POST /api/init:初始化成功或免费模式返回data.remote_vars。POST /api/activate:激活成功返回data.remote_vars。POST /api/check_update:检测更新时返回data.remote_vars。
app_key、timestamp、nonce 和 sign。远程变量不是新接口,也不会改变原有签名规则。3. 返回结构
{
"code": 0,
"data": {
"status": "active",
"expire_time": "2026-09-20 12:00:00",
"remote_vars": {
"maintenance": false,
"activation_tip": "当前为专业版授权",
"max_retry": 3,
"theme": {"color": "blue"}
}
}
}没有配置变量时返回 {}。客户端必须从 data.remote_vars 读取变量;notice 和 popup_announcement 仍只代表应用公告与弹窗公告,不会被远程变量覆盖。
notice 或 popup_announcement 去改变公告内容;需要改公告请在应用公告/弹窗公告中配置,需要业务开关或提示文本请读取 data.remote_vars。4. 内置行为变量
| 变量名 | 类型 | 作用 |
|---|---|---|
maintenance | bool | 为 true 时显示维护提示,用户确认后退出应用 |
maintenance_text | string | 维护提示内容 |
allow_run | bool | 为 false 时禁止运行,显示 deny_text 后退出 |
deny_text | string | 禁止运行提示内容 |
activation_tip | string | 首次手动激活成功后的底部低打扰提示 |
silent_tip | string | 保存卡密再次启动、静默同步成功后的底部提示 |
show_remote_vars | bool | 为 true 时额外显示全部变量明细,调试用 |
Android/iOS 新模板都支持以上规则。变量名未命中内置规则时不会执行代码,只会作为普通配置保留。
5. 类型与填写规则
| 类型 | 后台填写示例 | 客户端收到的类型 |
|---|---|---|
string | 欢迎使用 | 字符串 |
int | 3 | 整数 3 |
float | 0.5 | 小数 0.5 |
bool | true 或 false | 布尔值 |
json | {"color":"blue","show_logo":true} | JSON 对象 |
6. 平台匹配规则
平台可选 all、ios、android、windows、lua。客户端请求中的 platform 必须与实际平台一致;如果同名变量同时存在,平台专属配置优先于 all。例如 Android 请求优先读取 platform=android 的 activation_tip,没有时才读取 all 的 activation_tip。
7. 客户端读取示例
// JavaScript / WebView
const data = response.data || {};
const remote = data.remote_vars || {};
const maintenance = remote.maintenance === true;
const activationTip = typeof remote.activation_tip === "string" ? remote.activation_tip : "";
const maxRetry = Number.isInteger(remote.max_retry) ? remote.max_retry : 3;
if (maintenance) {
showMessage("系统维护中");
return;
}
if (activationTip) showMessage(activationTip);8. 失败兜底与安全要求
- 接口请求失败时,继续使用原有授权流程和本地默认值。
remote_vars不存在、为空或类型不符合预期时,使用默认值。- 不要把 App Secret、支付密钥、数据库密码等敏感信息配置为远程变量。
- 不要把远程变量当作可执行代码;平台只下发数据,不执行 Python、Lua、JavaScript 等代码。
remote_vars JSON,业务代码可自行解析使用。旧客户端如果没有读取 remote_vars,变量不会自动生效。6. 接口解绑 (API Unbind)
POST允许开发者在自己的程序逻辑内触发解绑操作(通常会扣除一定的时长)。
{
"app_key": "string",
"timestamp": "string",
"nonce": "string",
"sign": "string",
"card_code": "string",
"platform": "string"
}
构建引擎 (v2.0) 说明
DEX & C# 源码级动态构建
幺幺零网络验证 v2.0 突破了传统的二进制占位符替换模式,采用源码级动态构建技术:
- Android (DEX): 集成
javac+d8工具链,通过源码注入生成合规 DEX。 - Windows (EXE): 集成动态 C# 编译 (Stub),支持 Python (PyInstaller) 等复杂 EXE 环境的一键加壳运行,具备极高的隐蔽性与兼容性。
- 突破限制: 解决服务器地址、AppKey 长度受限问题,支持无限长配置信息注入。
全平台产物支持
Lua 脚本集成
幺幺零网络验证为 Lua 脚本(如 GG 脚本)提供了专属的混淆封装器。
特性:
- 变量混淆: 每次构建自动生成随机变量名,防止静态分析。
- 全功能 UI: 内置登录、购买、客服、公告弹窗逻辑。
- 换绑支持: 脚本内支持输入 "1" 触发设备解绑流程。
集成方式:
在控制台上传您的原始 Lua 脚本,系统会自动在脚本顶部插入验证核心代码并打包。您的原始代码将被包裹在授权成功的逻辑之后运行。
iOS SDK 接入
支持原生 App (Framework) 和 越狱/注入插件 (Dylib) 两种模式。
1. 自动化构建 (推荐)
在控制台进入“插件构建”,选择 iOS 平台,填入应用信息后即可一键生成已完成授权逻辑封装的 .dylib 或 .framework 文件。
2. 手动集成示例 (Objective-C)
#import <JiubanAuth/JiubanAuth.h>
// 初始化
[[JiubanAuth shared] initWithServerUrl:@"https://yz.1108.top/api" appKey:@"YOUR_APP_KEY"];
// 检查授权
[[JiubanAuth shared] checkStatus:^(BOOL success, NSString *msg) {
if (success) {
NSLog(@"授权成功");
} else {
// 显示激活界面
}
}];
Android SDK 接入
支持 Native (SO) 注入和 DEX 源码级构建。
DEX 源码级构建 (v2.0 旗舰特性)
通过构建引擎生成的 Verification.dex,可直接通过 ClassLoader 加载。由于其源码级编译的特性,您可以自定义任何复杂的校验逻辑。
// 载入验证类 (假设使用构建引擎生成)
Class<?> authClass = classLoader.loadClass("com.jiuban.Verification");
Method initMethod = authClass.getDeclaredMethod("init", Context.class, String.class);
initMethod.invoke(null, context, "YOUR_CARD_CODE");
Windows 平台接入
幺幺零网络验证为 Windows 平台提供行业领先的一键 EXE 加壳保护 (Stub 模式),旨在实现零门槛接入与极致安全性。
一键 EXE 加壳保护 (Stub 模式)
专为 Python (PyInstaller)、C# (Unity/WPF)、C++ 等独立 EXE 环境设计的加壳方案。无需修改原程序源码,只需上传 EXE 即可实现:
- 幻影隐藏释放:原程序以隐藏属性释放运行,退出自动清理,防止用户直接接触 Payload。
- 环境零冲突:通过共享锁技术(Shared-Lock),完美支持 Python 等复杂程序的动态资源加载。
- 心跳 Flood 防御:内置高强度心跳频率校验,有效抵御针对服务器的非法请求攻击。
- 一键热更新:支持云端版本比对,自动下载并静默覆盖安装。
如何使用?
登录后台 -> 插件构建 -> 选择 Windows 平台 -> 上传您的原始 EXE 软件 -> 点击构建。下载后的成品即已包含完整的授权逻辑。
Web / JS SDK
适用于网页应用、H5 游戏或 Electron 应用。
<script src="https://yz.1108.top/static/sdk/organized/html_js/sdk/auth-sdk.js"></script>
<script>
const auth = new AuthSDK('https://yz.1108.top', 'YOUR_APP_KEY', 'YOUR_APP_SECRET', 'web');
const deviceId = localStorage.deviceId || (localStorage.deviceId = crypto.randomUUID());
auth.init(deviceId, 'CARD_CODE', '1.0.0').then(res => {
if (res.code === 0 && res.data && res.data.status === 'active') {
console.log('远程变量:', res.data.remote_vars || {});
alert('欢迎使用!');
} else {
alert(res.msg || '验证失败');
}
});
</script>
APP_SECRET,正式生产建议使用 PHP/后端代理签名。完整多平台 SDK 位于 /static/sdk/organized/。错误码说明
| Code | 描述 | 建议处理 |
|---|---|---|
| 0 | 成功 | 解析 data 字段进入业务流程。 |
| 401 | AppKey 无效 | 检查配置的应用识别码是否正确。 |
| 403 | 鉴权失败 | 1. 检查签名算法;2. 检查客户端系统时间。 |
| 1 | 业务拦截 | 查看 msg 字段(如:卡密过期、设备冻结、并发受限)。 |
| 429 | 频率受限 | API 请求过快,请降低心跳或操作频率。 |
Webhooks 事件推送
当发生以下重要事件时,服务器将向您配置的 URL 推送 POST 请求:
activation
新设备首次激活成功
unbind
设备解绑成功
// 验证推送签名: HMAC-SHA256(secret, body_json)
// 确保数据来源的真实性