Sunny Pro
    Sunny Pro
    • Sunny Pro 简介
    • API接口文档
    • 购买方式

    API接口文档

    0.请求方式#

    URL:http://服务器ip:端口?data=请求数据的base64编码
    Method: GET
    所有请求都使用此接口进行访问,使用GET方式请求。

    1.请求数据#

    请求数据是json格式,如下:
    {
        "software_id": 0, 
        "crypt_type": 0,  
        "operation_type": "string", 
        "data": "string",           
        "signature": "string"       
    }
    字段说明:
    字段名格式说明
    software_idint要请求的软件id
    crypt_typeint加密方式,1为AES-GCM-256,2为AES-CBC-256,推荐使用1
    operation_typestring具体业务操作类型,详见后方的具体业务介绍,不同业务类型具有不同的业务数据
    datastring对业务请求数据加密后BASE64编码的数据,BASE64(AES(业务请求数据)),每个业务有不同的数据
    signaturestring使用hmac-sha256签名本json文本后的BASE64编码数据。签名时不包含此字段,计算出签名后再添加本字段到此json中,校验签名的时候,也要先把此字段移除

    2.响应数据#

    响应数据是json格式,如下:
    {
        "code":0,
        "message":"",
        "data":"",  
        "signature":""
    }
    字段说明:
    字段名格式说明
    codeint请求的错误码,详见下方的错误码列表
    messagestring请求结果信息,对错误码的详细解释
    datastring对业务响应数据加密后BASE64编码的数据,BASE64(AES(业务响应数据)),不同业务请求有不同的响应
    signaturestring使用hmac-sha256签名本json文本后的BASE64编码数据。签名时不包含此字段,计算出签名后再添加本字段到此json中,校验签名的时候,也要先把此字段移除

    3.业务数据#

    所有请求和响应的业务数据都是json格式。请求数据和响应数据中的data字段就是加密并BASE64编码后的业务数据。

    3.1.业务请求数据公共头#

    所有业务请求数据都会带有业务请求数据公共头再加上具体的业务字段。 格式如下:
    {
        "nonce":"",
    	"timestamp":0,
    	"machine_code":"", 
        "token":""
    }
    字段说明:
    字段名格式说明
    noncestring封包唯一值,一定要随机,建议使用GUID+时间戳
    timestampint10位 UNIX时间戳
    machine_codestring机器码数据
    tokenstring卡密登录之后才会返回token,未登录时此值为空即可

    3.2.业务响应数据公共头#

    所有业务响应数据都会带有业务响应数据公共头再加上具体的业务字段。 格式如下:
    {
        "nonce":"",
    	"timestamp":0,
    	"machine_code":"",
        "server_timestamp":0    
    }
    字段说明:
    字段名格式说明
    noncestring业务请求数据公共头中的原样返回
    timestampint业务请求数据公共头中的原样返回
    machine_codestring业务请求数据公共头中的原样返回
    server_timestampint服务器的10位UNIX时间戳

    3.3.具体业务请求及响应数据#

    业务请求/响应数据公共头加上具体的业务字段,组成最终的业务请求/响应数据。

    3.3.1.获取软件信息#

    operation_type#

    software_info

    请求业务字段#

    无

    响应业务字段#

    {
        "basic.announcement":"",
        "update.download_url":"",
        "update.force":"1",
        "update.version":"",
        "software_id":1,
        "name":"",
        "description":""
    }
    字段说明:
    字段名格式说明
    basic.announcementstring公告数据,utf8编码
    update.download_urlstring版本下载连接,utf8格式
    update.forcestring是否强制更新,"1"为强制更新,"0"为不强制
    update.versionstring当前版本
    software_idint软件的id
    namestring软件名,utf8编码
    descriptionstring软件描述,utf8编码

    3.3.2.卡密登录#

    operation_type#

    login

    请求业务字段#

    {
        "card_key":""
    }
    字段说明:
    字段名格式说明
    card_keystring卡密

    响应业务字段#

    {
        "token": "7b5120903a021f6c0ec719f50d67cb44f0cc2237e36270124788d3483ff16ef3",
        "card_info": {
            "activated_machine_count": 1,
            "activation_time": 1757601213,
            "create_time": 1757578575,
            "creator": "admin",
            "expiry_time": 1757604813,
            "key": "FX2XSM1I0IJS5CWW5YTOS1458EFWL7HG",
            "note": "",
            "remaining_points": 100,
            "status": "used"
        },
        "card_type_info": {
            "available_points": 100,
            "available_seconds": 3600,
            "bind_ip": false,
            "created_at": 1757577818,
            "id": 6,
            "key_length": 32,
            "max_instance": 1,
            "max_machines": 1,
            "name": "3333",
            "note": "",
            "prefix": "",
            "price": 1,
            "rebind_deduct_points": 0,
            "rebind_deduct_seconds": 0,
            "software_id": 3,
            "updated_at": 1757577818,
            "use_separator": false
        },
        "machine_info": {
            "activation_ip": "127.0.0.1",
            "activation_time": 1757601213,
            "card_key_id": 5107,
            "first_login": false,
            "id": 2,
            "last_used_time": 1757601213,
            "machine_code": "test_machine",
            "status": "active"
        } 
    }
    字段说明:
    字段名格式说明
    tokenstring会话token,登录之后只需用此token进行后续操作即可,对就业务请求数据公共头中的token字段
    card_infoobject卡密信息
    card_type_infoobject卡密类型信息
    machine_infoobject绑定机器信息
    card_info字段说明:
    字段名格式说明
    activated_machine_countint卡密已激活的机器数量
    activation_timeint卡密激活时间,10位UNIX时间戳
    create_timeint卡密创建时间
    creatorstring卡密创建者,admin是管理员其他是代理名
    expiry_timeint卡密到期时间
    keystring卡密文本
    noteint卡密备注
    remaining_pointsint卡密剩余点数
    statusstring卡密状态,used是已使用,disabled是已禁用
    card_type_info字段说明:
    字段名格式说明
    available_pointsint可用点数
    available_secondsint可用时间,单位秒
    bind_ipbool是否绑定ip
    created_atint创建时间
    idint卡密类型id
    key_lengthint卡密长度
    max_instanceint每台机器多开数量
    max_machinesint绑机数量,0为不限
    namestring卡密类型名称
    notestring卡密类型备注
    prefixstring卡密前缀
    priceint卡密价格
    rebind_deduct_pointsint换绑扣除点数
    rebind_deduct_secondsint换绑扣除时间,单位秒
    software_idint所属软件id
    updated_atint最后更新时间
    use_separatorbool卡密文本是否使用分隔符
    machine_info字段说明:
    字段名格式说明
    activation_ipstring机器激活时的IP
    activation_timeint机器激活绑定时间
    card_key_idint机器激活的卡密id
    first_loginbool是否第一次登录
    idint机器id
    last_used_timeint最后登录时间
    machine_codestring机器码
    statusstring状态,active为正常,disabled为禁用

    3.3.3.取VMP授权码#

    operation_type#

    get_vmp_license

    请求业务字段#

    {
        "vmp_machine_code":"",
        "vmp_with_date":true
    }
    字段说明:
    字段名格式说明
    vmp_machine_codestring使用VMProtectGetCurrentHWID获取的机器码数据
    vmp_with_datebool是否获取有到期时间的VMP授权码,到期时间跟卡密到期时间相同

    响应业务字段#

    {
        "license":""
    }
    字段说明:
    字段名格式说明
    licensestring后台生成的VMP授权码,只有第一次会动态生成,之后会直接返回第一次生成的授权码。这样就可以用这个授权码来绑定机器。

    3.3.4.取远程变量值#

    operation_type#

    get_variable

    请求业务字段#

    {
        "key":""
    }
    字段说明:
    字段名格式说明
    keystring变量名

    响应业务字段#

    {
        "value":"",
        "note":"",
        "update_time":""  
    }
    字段说明:
    字段名格式说明
    valuestring变量值
    notestring变量备注
    update_timestring更新时间,例:2025-09-29 21:00:00.000 ,此值可用来判断当前变量是否被修改

    3.3.5.解绑#

    operation_type#

    unbind

    请求业务字段#

    {
        "card_key":""
    }
    字段说明:
    字段名格式说明
    card_keystring卡密

    响应业务字段#

    无,直接判断响应数据中的code

    3.3.6.心跳#

    operation_type#

    heart_beat

    请求业务字段#

    无

    响应业务字段#

    {
      "card_info": {
            "activated_machine_count": 1,
            "activation_time": 1757601213,
            "create_time": 1757578575,
            "creator": "admin",
            "expiry_time": 1757604813,
            "key": "FX2XSM1I0IJS5CWW5YTOS1458EFWL7HG",
            "note": "",
            "remaining_points": 100,
            "status": "used"
        },
        "machine_info": {
            "activation_ip": "127.0.0.1",
            "activation_time": 1757601213,
            "card_key_id": 5107,
            "first_login": false,
            "id": 2,
            "last_used_time": 1757601213,
            "machine_code": "test_machine",
            "status": "active"
        } 
    }
    字段说明:
    同卡密登录。

    3.3.7.消耗点数#

    operation_type#

    consume_points

    请求业务字段#

    {
        "consume_points":10
    }
    字段说明:
    字段名格式说明
    consume_pointsint要消耗的点数

    响应业务字段#

    {
        "remaining_points":100
    }
    字段说明:
    字段名格式说明
    remaining_pointsint剩余的点数

    3.3.8.拉黑#

    operation_type#

    add_black

    请求业务字段#

    {
        "block_card":true,
        "block_machine":true,
        "block_ip":true,
        "note":""
    }
    字段说明:
    字段名格式说明
    block_cardbool是否拉黑卡密
    block_machinebool是否拉黑机器码
    block_ipbool是否拉黑ip
    notestring拉黑原因

    响应业务字段#

    无,直接判断响应数据中的code

    3.3.9.执行插件#

    operation_type#

    exec_plugin

    请求业务字段#

    {
        "plugin_name":"",
        "plugin_input_value":""
    }
    字段说明:
    字段名格式说明
    plugin_namestring要执行的插件名
    plugin_input_valuestring输入的参数

    响应业务字段#

    {
        "output":"",
        "plugin_return_code":0
    }
    字段说明:
    字段名格式说明
    outputstring插件返回的数据
    plugin_return_codeint插件返回的错误码,自己写插件自己定义返回的错误码,对应dll插件接口的返回值

    3.3.10.下线#

    operation_type#

    logout

    请求业务字段#

    无

    响应业务字段#

    无

    4.业务请求示例#

    4.1.卡密登录示例#

    以卡密登录为例讲解下请求数据和响应数据处理过程,其他业务操作一致。

    请求#

    卡密登录的业务数据字段加上业务请求数据公共头组成下方json:
    {
        "card_key":"aaaaaaaa",
        "nonce":"123123",
        "timestamp":1234567890,
        "machine_code":"test",
        "token":""    
    }	
    将此json转为字符串后使用你对应的加密算法和密钥对其进行加密并BASE64编码,得到数据A,把数据A放到请求数据中组合成下方json:
    {
        "software_id": 1, 
        "crypt_type": 1,  
        "operation_type": "login", 
        "data": "数据A"   
    }
    将此json转成字符串后,使用你的hmac密钥用hmac-sha256算法对此字符串计算出签名并使用BASE64编码,得到数据B,最后将数据B放到上方的json中,如下:
    {
        "software_id": 1, 
        "crypt_type": 1,  
        "operation_type": "login", 
        "data": "数据A",
        "signature":"数据B"
    }
    最后将此json转为字符串,并使用BASE64编码得到数据C,然后发送http请求如下:
    http://ip:port/activate?data=数据C
    即可获取响应数据。

    响应#

    获得响应数据后,首先要检查signature,看看数据是否合法。合法的话再去检查code字段,只有当code为0时再去解密data数据,否则直接当做失败处理即可。
    假如收到的响应数据如下:
    {
        "code":0,
        "message":"成功",
        "data":"数据",  
        "signature":"aaaaaaaaaaaaa"
    }
    首先获取signature的值保存下来,然后将signature字段去除,得下如下json:
    {
        "code":0,
        "message":"成功",
        "data":"数据"
    }
    将此json转换为字符串后计算签名,然后再跟上一步获取的signature进行对比,如果相同则数据合法。接下来就可以判断code了。

    5.code列表#


    值说明
    0成功
    1解密失败
    2无效请求
    3禁用登录
    4无效参数
    5无效签名
    6不支持的加密类型
    7重复随机数
    8IP地址被列入黑名单
    9机器码被列入黑名单
    10机器码为空
    11机器被禁用
    12软件未找到
    13登录失败
    14代理账号不存在
    15代理账号已存在
    16代理密码错误
    17代理无权限
    18心跳失败
    19变量未找到
    20插件执行失败
    21黑名单添加失败
    22积分消费失败
    23请求超时
    24请求频率超出限制
    25未找到卡片
    26未找到卡片类型
    27生成 VMP 授权失败
    28未找到机器
    29机器数量达到上限
    30卡片已过期
    31卡片已禁用
    32机器已过期
    33卡片积分已耗尽
    34机器积分已耗尽
    35数据库错误
    36会话数量达到上限
    37黑名单已存在
    38IP 已存在,机器码加入成功
    39机器码已存在,ip加入成功
    40IP 加入失败,机器码加入成功
    41机器码加入失败,ip加入成功
    42未找到插件
    43无效令牌
    44令牌已过期
    45无效IP
    46其他错误
    47积分不足
    48未知错误
    修改于 2025-10-03 12:45:14
    上一页
    Sunny Pro 简介
    下一页
    购买方式
    Built with