在汽车金融和保险行业,核实申请人名下真实车辆资产一直是风控环节中最具挑战性的部分。传统的人工查验方式不仅耗时费力(单次核验通常需要1-3个工作日),而且存在证件伪造、信息滞后等风险。根据某头部汽车金融公司的内部数据,采用纯人工审核的坏账率要比数字化核验高出37%。
天远名下车辆数量查询API的出现,彻底改变了这一局面。这个接口通过"姓名+身份证+手机号"三要素验证,能在毫秒级别返回用户车辆资产详情,包括:
重要提示:由于涉及敏感个人信息,该API强制使用AES-128-CBC加密传输,开发者需要特别注意数据安全合规问题。
该API采用双重安全验证:
Access-Id识别调用方身份加密流程示例:
python复制from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import os
def encrypt_data(plain_text, key):
iv = os.urandom(16) # 生成随机IV
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(plain_text.encode(), AES.block_size))
return base64.b64encode(iv + ciphertext).decode()
def decrypt_data(cipher_text, key):
data = base64.b64decode(cipher_text)
iv = data[:16]
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
return unpad(cipher.decrypt(data[16:]), AES.block_size).decode()
下面是一个增强版的实现,包含重试机制和更完善的错误处理:
python复制import requests
import json
import time
from retrying import retry
class VehicleQueryService:
def __init__(self, access_id, access_key):
self.base_url = "https://api.tianyuanapi.com/api/v1/QCXG4T6Q"
self.access_id = access_id
self.access_key = access_key
self.timeout = 5
self.max_retries = 3
@retry(stop_max_attempt_number=3, wait_exponential_multiplier=1000)
def query_vehicles(self, name, id_card, mobile):
timestamp = int(time.time() * 1000)
request_url = f"{self.base_url}?t={timestamp}"
payload = {
"name": name.strip(),
"id_card": id_card.strip(),
"mobile_no": mobile.strip()
}
try:
encrypted_data = self._encrypt_payload(json.dumps(payload))
headers = {
"Access-Id": self.access_id,
"Content-Type": "application/json",
"X-Request-ID": str(timestamp) # 添加请求追踪ID
}
response = requests.post(
request_url,
json={"data": encrypted_data},
headers=headers,
timeout=self.timeout
)
response.raise_for_status()
res_json = response.json()
if res_json.get("code") != 0:
raise ValueError(f"API Error [{res_json.get('code')}]: {res_json.get('message')}")
return self._decrypt_response(res_json.get("data"))
except requests.exceptions.RequestException as e:
print(f"请求失败: {str(e)}")
raise
except Exception as e:
print(f"处理错误: {str(e)}")
raise
python复制session = requests.Session()
adapter = requests.adapters.HTTPAdapter(
pool_connections=10,
pool_maxsize=50,
max_retries=3
)
session.mount('https://', adapter)
python复制import aiohttp
import asyncio
async def async_query(session, payload):
async with session.post(API_URL, json=payload) as resp:
return await resp.json()
基于API返回数据,可以构建多层级风控规则:
python复制def risk_evaluation(vehicle_data):
risk_score = 0
alerts = []
# 规则1:无车直接高风险
if vehicle_data['vehicleCount'] == '0':
risk_score += 80
alerts.append("无车辆资产")
# 规则2:货车类型风险调整
for vehicle in vehicle_data.get('list', []):
if vehicle['vehicleType'] in [11, 12]: # 货车类型
risk_score += 20
alerts.append(f"货车类型风险: {vehicle['vehicleType']}")
# 规则3:新能源车加分项
if vehicle['plateColor'] == 11: # 新能源
risk_score -= 10
return {
"risk_score": min(max(risk_score, 0), 100),
"alerts": alerts,
"vehicle_count": vehicle_data['vehicleCount']
}
建立完整的车辆类型映射表:
python复制VEHICLE_TYPE_MAP = {
1: "小型客车",
2: "大型客车",
11: "轻型货车",
12: "重型货车",
21: "出租车",
22: "网约车",
# ...其他类型
}
PLATE_COLOR_MAP = {
0: "蓝色",
1: "黄色",
2: "黑色",
11: "新能源绿牌",
# ...其他颜色
}
def translate_vehicle_info(raw_data):
return {
"plate_num": raw_data['plateNum'],
"plate_color": PLATE_COLOR_MAP.get(raw_data['plateColor'], "未知"),
"vehicle_type": VEHICLE_TYPE_MAP.get(raw_data['vehicleType'], "未知")
}
python复制import hashlib
def safe_logging(id_card):
# 只记录脱敏信息
return f"{id_card[:6]}****{id_card[-4:]}"
建议监控以下关键指标:
使用Prometheus示例:
python复制from prometheus_client import Counter, Histogram
API_CALLS = Counter('api_calls_total', 'Total API calls')
API_ERRORS = Counter('api_errors_total', 'Total API errors')
API_DURATION = Histogram('api_duration_seconds', 'API response time')
@API_DURATION.time()
def query_api():
API_CALLS.inc()
try:
# 调用代码
except:
API_ERRORS.inc()
raise
python复制from cachetools import TTLCache
cache = TTLCache(maxsize=1000, ttl=3600) # 1小时缓存
def get_cached_query(id_card):
if id_card in cache:
return cache[id_card]
# ...正常查询并填充缓存
python复制from pybreaker import CircuitBreaker
breaker = CircuitBreaker(fail_max=5, reset_timeout=60)
@breaker
def protected_query():
return query_vehicles(...)
python复制def auto_approval(application):
vehicle_data = query_vehicles(
application['name'],
application['id_card'],
application['mobile']
)
risk = risk_evaluation(vehicle_data)
if risk['risk_score'] > 70:
return {"approved": False, "reason": "高风险"}
elif risk['risk_score'] > 30:
return {"approved": True, "limit": "标准额度的50%"}
else:
return {"approved": True, "limit": "全额"}
python复制def driver_verification(driver_info):
result = {
"passed": False,
"requirements": []
}
vehicle_data = query_vehicles(...)
# 检查至少有一辆合规车辆
for vehicle in vehicle_data.get('list', []):
if vehicle['vehicleType'] in [1, 2]: # 客车类型
if vehicle['plateColor'] != 2: # 排除黑牌
result['passed'] = True
result['vehicle'] = translate_vehicle_info(vehicle)
break
if not result['passed']:
result['requirements'].append("需要自有合规载客车辆")
return result
python复制import unittest
from unittest.mock import patch
class TestVehicleAPI(unittest.TestCase):
@patch('requests.post')
def test_success_response(self, mock_post):
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = {
"code": 0,
"data": "加密的测试数据"
}
service = VehicleQueryService("test", "test")
result = service.query_vehicles("测试", "123456", "13800000000")
self.assertIsNotNone(result)
def test_risk_evaluation(self):
test_data = {
"vehicleCount": "1",
"list": [{"vehicleType": 11, "plateColor": 0}]
}
result = risk_evaluation(test_data)
self.assertTrue(result['risk_score'] > 0)
使用locust进行负载测试:
python复制from locust import HttpUser, task, between
class ApiUser(HttpUser):
wait_time = between(1, 5)
@task
def query_vehicle(self):
encrypted_data = encrypt_test_data()
self.client.post("/api/v1/QCXG4T6Q",
json={"data": encrypted_data},
headers={"Access-Id": "test"}
)
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 1001 | 参数缺失 | 检查三要素是否全部传入 |
| 1003 | 解密失败 | 验证加密算法和密钥是否正确 |
| 2001 | 查无数据 | 确认用户信息准确性 |
| 5001 | 系统繁忙 | 稍后重试,检查服务状态 |
python复制import urllib3
urllib3.util.connection.HAS_IPV6 = False # 禁用IPv6可能提升速度
对于企业级应用,推荐采用如下架构:
code复制客户端APP → API网关 → 风控引擎 → 天远API
↑ ↓
缓存层 规则数据库
关键组件:
python复制def calculate_premium(vehicle_data):
base_rate = 1000
for vehicle in vehicle_data.get('list', []):
if vehicle['vehicleType'] == 1: # 家用车
if vehicle['plateColor'] == 11: # 新能源
return base_rate * 0.9
return base_rate
python复制def adjust_valuation(plate_num, original_price):
# 调用车辆详情接口获取更多信息
details = get_vehicle_details(plate_num)
if details['register_year'] < 2010:
return original_price * 0.7
# 其他修正规则...
在实际项目中,我们通过这套系统将车贷审批时间从平均3天缩短到15分钟,同时将欺诈识别率提升了40%。关键在于不仅要正确调用API,更要深度结合业务场景设计决策规则。