132 lines
3.9 KiB
JavaScript
132 lines
3.9 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const crypto = require('crypto')
|
|
|
|
// ==================== API配置 ====================
|
|
const ACCESS_ID = 'XXXXXXXXX' // 替换为您的ACCESS_ID
|
|
const APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXX' // 替换为您的app_secret
|
|
const BASE_URL = 'https://api.haiyudata.com'
|
|
|
|
// ==================== 测试参数 ====================
|
|
const API_CODE = 'FLXG0V4B' // 替换为您的API编号
|
|
|
|
const PARAMS = {
|
|
name: 'XXXX',
|
|
id_card: 'XXXXXXXXXXXXXXX',
|
|
auth_date: '20250722-20250923',
|
|
}
|
|
|
|
// ==================== 加密解密函数 ====================
|
|
function encrypt_data(data) {
|
|
const key = Buffer.from(APP_SECRET, 'hex')
|
|
const iv = crypto.randomBytes(16)
|
|
const cipher = crypto.createCipheriv('aes-128-cbc', key, iv)
|
|
cipher.setAutoPadding(true)
|
|
let encrypted = cipher.update(data, 'utf8')
|
|
encrypted = Buffer.concat([iv, encrypted, cipher.final()])
|
|
return encrypted.toString('base64')
|
|
}
|
|
|
|
function decrypt_data(encrypted_data) {
|
|
const key = Buffer.from(APP_SECRET, 'hex')
|
|
const encryptedBuffer = Buffer.from(encrypted_data, 'base64')
|
|
const iv = encryptedBuffer.slice(0, 16)
|
|
const ciphertext = encryptedBuffer.slice(16)
|
|
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv)
|
|
decipher.setAutoPadding(true)
|
|
let decrypted = decipher.update(ciphertext)
|
|
decrypted = Buffer.concat([decrypted, decipher.final()])
|
|
return decrypted.toString('utf8')
|
|
}
|
|
|
|
// ==================== 主测试函数 ====================
|
|
async function test_api() {
|
|
try {
|
|
console.log(`=== 测试API: ${API_CODE} ===`)
|
|
console.log(`请求参数: ${JSON.stringify(PARAMS, null, 2)}`)
|
|
|
|
// 加密参数
|
|
const params_json = JSON.stringify(PARAMS)
|
|
const encrypted_data = encrypt_data(params_json)
|
|
|
|
// 构建请求
|
|
const headers = {
|
|
'Content-Type': 'application/json',
|
|
'Access-Id': ACCESS_ID,
|
|
}
|
|
|
|
const url = `${BASE_URL}/api/v1/${API_CODE}`
|
|
const request_data = { data: encrypted_data, options: { json: true } }
|
|
|
|
console.log(`请求URL: ${url}`)
|
|
console.log(`请求头: ${JSON.stringify(headers, null, 2)}`)
|
|
|
|
// 发送请求
|
|
const start_time = Date.now()
|
|
const response = await fetch(url, {
|
|
method: 'POST',
|
|
headers: headers,
|
|
body: JSON.stringify(request_data),
|
|
signal: AbortSignal.timeout(30000), // 30秒超时
|
|
})
|
|
const elapsed_time = Date.now() - start_time
|
|
|
|
console.log(`\n=== 响应信息 ===`)
|
|
console.log(`状态码: ${response.status}`)
|
|
console.log(`耗时: ${elapsed_time}ms`)
|
|
|
|
if (response.status !== 200) {
|
|
console.log(`请求失败: ${response.status} ${response.statusText}`)
|
|
return
|
|
}
|
|
|
|
// 解析响应
|
|
try {
|
|
const response_json = await response.json()
|
|
console.log(`原始响应: ${JSON.stringify(response_json, null, 2)}`)
|
|
|
|
// 检查响应格式
|
|
if (!('code' in response_json)) {
|
|
console.log('直接返回业务数据')
|
|
return
|
|
}
|
|
|
|
// 标准格式处理
|
|
const api_code = response_json.code
|
|
const api_message = response_json.message || ''
|
|
const encrypted_response = response_json.data || ''
|
|
|
|
console.log(`API响应码: ${api_code}`)
|
|
console.log(`API消息: ${api_message}`)
|
|
|
|
if (api_code !== 0) {
|
|
console.log(`API错误: ${api_message}`)
|
|
return
|
|
}
|
|
|
|
if (!encrypted_response) {
|
|
console.log('无加密数据返回')
|
|
return
|
|
}
|
|
|
|
// 解密数据
|
|
try {
|
|
const decrypted_data = decrypt_data(encrypted_response)
|
|
const result_data = JSON.parse(decrypted_data)
|
|
|
|
console.log(`\n=== 解密后的数据 ===`)
|
|
console.log(JSON.stringify(result_data, null, 2))
|
|
} catch (e) {
|
|
console.log(`解密失败: ${e.message}`)
|
|
}
|
|
} catch (e) {
|
|
console.log(`响应不是JSON格式: ${e.message}`)
|
|
}
|
|
} catch (e) {
|
|
console.log(`测试异常: ${e.message}`)
|
|
}
|
|
}
|
|
|
|
// 运行测试
|
|
test_api()
|