Skip to content

完整伪代码示例

以「单码卡密登录」接口为例,展示一次完整的 API 请求流程。

前提条件

本示例假设后台开启了以下安全配置:

配置项
加密算法RC4
请求值加密开启,HEX 编码
返回值加密开启
时间戳验证开启
签名验证请求签名模式

以下常量贯穿整个流程:

python
API_URL = "http://api.example.com/login"
APPKEY  = "e10adc3949ba59abbe56e057f20f883e"
RC4_KEY = "my_rc4_key"

第一步:准备明文参数

python
kami      = "ABCD1234567890"       # 卡密值
imei      = "DEVICE_UNIQUE_ID"     # 设备机器码
timestamp = str(int(time.time()))   # 秒级 Unix 时间戳(10位)
safe_code = "verify_123"           # 数据验证码(可选)

第二步:加密参数值

对每个参数值执行 RC4 加密 → HEX 编码

python
kami_enc      = rc4(kami, RC4_KEY).hex()
imei_enc      = rc4(imei, RC4_KEY).hex()
timestamp_enc = rc4(timestamp, RC4_KEY).hex()
safe_code_enc = rc4(safe_code, RC4_KEY).hex()

提示

加密后的值为十六进制字符串,例如 "ABCD1234567890" 加密后变成 "a3f2b1c9e8d7..." 形式。

第三步:计算签名

将加密编码后的参数按顺序拼接,末尾追加 APPKEY,取 MD5:

python
sign_str = (
    f"kami={kami_enc}"
    f"&imei={imei_enc}"
    f"&t={timestamp_enc}"
    f"&safe_code={safe_code_enc}"
    f"&{APPKEY}"
)
s = hashlib.md5(sign_str.encode()).hexdigest()

签名规则

  • 排除 s 参数本身,只对业务参数签名
  • 参数拼接顺序必须与实际发送顺序一致
  • 时间戳必须是秒级(10 位),不能是毫秒

第四步:加密签名值

签名本身也需要加密编码后再发送:

python
s_enc = rc4(s, RC4_KEY).hex()

第五步:发送请求

python
params = {
    "kami":      kami_enc,
    "imei":      imei_enc,
    "t":         timestamp_enc,
    "safe_code": safe_code_enc,
    "s":         s_enc,
}
response = requests.post(API_URL, data=params)

第六步:解密响应

python
decrypted = rc4(bytes.fromhex(response.text), RC4_KEY)
data = json.loads(decrypted)

解密后得到 JSON 结构:

jsonc
{
  "code": "200",
  "msg": "登录成功",
  "id": 12345,
  "end_time": "2026-12-31 23:59:59",
  "statecode": "a1b2c3d4e5f6...",
  "token": "d41d8cd98f00b204...",
  "date": "202603121200"
}

第七步:Token 校验(可选)

通过本地重算 Token 并比对,验证响应数据未被篡改:

python
expected = hashlib.md5(
    (str(data['id']) + APPKEY + data['end_time'] + data['date']).encode()
).hexdigest()

if expected == data['token']:
    print("校验通过,数据可信")
else:
    print("校验失败,响应可能被篡改")

Token 计算公式取决于签名模式:

签名模式计算公式
请求签名md5(ID + APPKEY + 到期时间 + 日期分钟)
双向签名md5(ID + APPKEY + 签名原文 + 到期时间 + 日期分钟)

使用 SDK 的简化版

上面的 7 个步骤(约 40 行代码)使用 SDK 可简化为几行:

python
from t3sdk.t3sdk import T3Verify, get_machine_code

verify = T3Verify()
verify.init(
    login_code='你的登录调用码',
    appkey='你的APPKEY',
    rsa_public_key='-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----',
    encode_type='rsa',
)

result = verify.login('ABCD1234567890', get_machine_code())
if result['success']:
    print(f"登录成功!到期时间:{result['end_time']}")
javascript
const { T3Verify, getMachineCode } = require('./t3sdk/t3sdk');

const verify = new T3Verify();
verify.init({
    loginCode: '你的登录调用码',
    appkey: '你的APPKEY',
    rsaPublicKey: `-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----`,
    encodeType: 'rsa',
});

const result = await verify.login('ABCD1234567890', getMachineCode());
if (result.success) console.log(`到期时间:${result.end_time}`);
java
T3Verify verify = new T3Verify();
verify.initRsa("登录调用码", "...", "...", "...", "APPKEY",
    "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----");

var result = verify.login("ABCD1234567890", T3Verify.getMachineCode());
if (result.success) System.out.println("到期时间:" + result.endTime);

提示

SDK 内部自动处理了加密、签名、编码、解密和 Token 校验。建议使用 SDK 快速接入 进行对接。

T3 网络验证 WebAPI 开发文档