Appearance
完整伪代码示例
以「单码卡密登录」接口为例,展示一次完整的 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 快速接入 进行对接。