176 lines
4.9 KiB
PHP
176 lines
4.9 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* AES CBC 加密函数,返回 Base64
|
|||
|
|
* @param string $plainText 要加密的明文
|
|||
|
|
* @param string $key 16进制密钥
|
|||
|
|
* @return string 加密后的Base64字符串
|
|||
|
|
*/
|
|||
|
|
function aesEncrypt($plainText, $key) {
|
|||
|
|
// 将16进制的密钥转换为二进制
|
|||
|
|
$keyBin = hex2bin($key);
|
|||
|
|
|
|||
|
|
// 生成随机IV
|
|||
|
|
$blockSize = 16; // AES 块大小
|
|||
|
|
$iv = openssl_random_pseudo_bytes($blockSize);
|
|||
|
|
|
|||
|
|
// 加密
|
|||
|
|
$encrypted = openssl_encrypt(
|
|||
|
|
$plainText,
|
|||
|
|
'AES-128-CBC',
|
|||
|
|
$keyBin,
|
|||
|
|
OPENSSL_RAW_DATA,
|
|||
|
|
$iv
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 将IV和加密数据拼接后进行Base64编码
|
|||
|
|
return base64_encode($iv . $encrypted);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* AES CBC 解密函数,返回解密后的明文
|
|||
|
|
* @param string $encryptedText Base64编码的加密文本
|
|||
|
|
* @param string $key 16进制密钥
|
|||
|
|
* @return string 解密后的明文
|
|||
|
|
*/
|
|||
|
|
function aesDecrypt($encryptedText, $key) {
|
|||
|
|
// 将16进制的密钥转换为二进制
|
|||
|
|
$keyBin = hex2bin($key);
|
|||
|
|
|
|||
|
|
// 解码Base64
|
|||
|
|
$encryptedBin = base64_decode($encryptedText);
|
|||
|
|
|
|||
|
|
// 提取IV和加密数据
|
|||
|
|
$blockSize = 16;
|
|||
|
|
$iv = substr($encryptedBin, 0, $blockSize);
|
|||
|
|
$encryptedData = substr($encryptedBin, $blockSize);
|
|||
|
|
|
|||
|
|
// 解密
|
|||
|
|
$decrypted = openssl_decrypt(
|
|||
|
|
$encryptedData,
|
|||
|
|
'AES-128-CBC',
|
|||
|
|
$keyBin,
|
|||
|
|
OPENSSL_RAW_DATA,
|
|||
|
|
$iv
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
return $decrypted;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 调用API函数
|
|||
|
|
*/
|
|||
|
|
function callApi($name, $id_card, $mobile_no, $auth_date) {
|
|||
|
|
// API相关配置
|
|||
|
|
$interface_name = "XXXXXXXX"; // 接口编号
|
|||
|
|
$access_id = "XXXXXXXXXXX";
|
|||
|
|
$key = "XXXXXXXXXXXXXXXXXXXXX";
|
|||
|
|
$url = "https://api.tianyuanapi.com/api/v1/{$interface_name}";
|
|||
|
|
|
|||
|
|
// 构建请求参数
|
|||
|
|
$params = array(
|
|||
|
|
"mobile_no" => $mobile_no,
|
|||
|
|
"id_card" => $id_card,
|
|||
|
|
"auth_date" => $auth_date,
|
|||
|
|
"name" => $name
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 将参数转换为JSON字符串并加密
|
|||
|
|
$json_str = json_encode($params, JSON_UNESCAPED_UNICODE);
|
|||
|
|
echo "请求参数: {$json_str}\n";
|
|||
|
|
$encrypted_data = aesEncrypt($json_str, $key);
|
|||
|
|
echo "加密后的数据: {$encrypted_data}\n";
|
|||
|
|
|
|||
|
|
// 发送请求
|
|||
|
|
$headers = array(
|
|||
|
|
"Access-Id: {$access_id}",
|
|||
|
|
"Content-Type: application/json"
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
$payload = array(
|
|||
|
|
"data" => $encrypted_data
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
echo "发送请求到: {$url}\n";
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 使用PHP原生HTTP请求方式
|
|||
|
|
$context = stream_context_create(array(
|
|||
|
|
'http' => array(
|
|||
|
|
'method' => 'POST',
|
|||
|
|
'header' => implode("\r\n", $headers),
|
|||
|
|
'content' => json_encode($payload),
|
|||
|
|
'timeout' => 30
|
|||
|
|
)
|
|||
|
|
));
|
|||
|
|
|
|||
|
|
$response = file_get_contents($url, false, $context);
|
|||
|
|
|
|||
|
|
if ($response === false) {
|
|||
|
|
throw new Exception("HTTP请求失败");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$response_data = json_decode($response, true);
|
|||
|
|
echo "API响应: " . json_encode($response_data, JSON_UNESCAPED_UNICODE) . "\n";
|
|||
|
|
|
|||
|
|
// 处理响应
|
|||
|
|
$code = $response_data['code'] ?? null;
|
|||
|
|
$message = $response_data['message'] ?? '';
|
|||
|
|
$encrypted_response_data = $response_data['data'] ?? '';
|
|||
|
|
|
|||
|
|
$result = array(
|
|||
|
|
"code" => $code,
|
|||
|
|
"success" => $code == 0,
|
|||
|
|
"message" => $message,
|
|||
|
|
"encrypted_response" => $encrypted_response_data
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 如果有返回data,尝试解密
|
|||
|
|
if ($encrypted_response_data) {
|
|||
|
|
try {
|
|||
|
|
$decrypted_data = aesDecrypt($encrypted_response_data, $key);
|
|||
|
|
$result["decrypted_response"] = json_decode($decrypted_data, true);
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo "解密响应数据失败: {$e->getMessage()}\n";
|
|||
|
|
$result["decrypted_response"] = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $result;
|
|||
|
|
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo "请求失败: {$e->getMessage()}\n";
|
|||
|
|
return array("success" => false, "message" => "请求失败: {$e->getMessage()}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 主函数
|
|||
|
|
*/
|
|||
|
|
function main() {
|
|||
|
|
echo "===== 个人涉诉详版 =====\n";
|
|||
|
|
|
|||
|
|
// 直接设置手机号和姓名
|
|||
|
|
$name = "XXXXXXXX";
|
|||
|
|
$id_card = "XXXXXXXXXXXXX";
|
|||
|
|
$mobile_no = "XXXXXXXXXXXXXXXXXXXX";
|
|||
|
|
$auth_date = "20250318-20270318";
|
|||
|
|
|
|||
|
|
$result = callApi($name, $id_card, $mobile_no, $auth_date);
|
|||
|
|
|
|||
|
|
echo "\n===== 结果 =====\n";
|
|||
|
|
if ($result["success"]) {
|
|||
|
|
echo "请求成功!\n";
|
|||
|
|
if (isset($result["decrypted_response"])) {
|
|||
|
|
echo "解密后的响应: " . json_encode($result['decrypted_response'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . "\n";
|
|||
|
|
} else {
|
|||
|
|
echo "未能获取或解密响应数据\n";
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
echo "请求失败: " . ($result['message'] ?? '未知错误') . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 运行主函数
|
|||
|
|
main();
|
|||
|
|
?>
|