达观AI审查接口需用PHP cURL调用HTTP API,构造带SHA256签名的POST请求,传UTF-8纯文本至text字段,返回JSON格式风险点列表;签名基于app_key+timestamp+text拼接哈希,timestamp为秒级整数且偏差≤300秒,text须预处理清除零宽字符、统一空白符并确保无BOM。

达观AI审查接口怎么调用(PHP cURL版)
达观数据的合同审查模型不提供公开SDK,必须走HTTP API。核心是构造带签名的POST请求,传text字段(纯文本,非PDF/Word),返回JSON格式的风险点列表。别指望直接扔个文件路径进去——它只认UTF-8编码的字符串。
- 接口地址形如
https://api.datagrand.com/v1/contract/risk(以你拿到的正式环境URL为准) - 必须携带
X-Datagrand-Signature、X-Datagrand-Timestamp、X-Datagrand-App-Key三个Header - 签名算法是:对
app_key + timestamp + text三者拼接后做SHA256哈希(注意:不是HMAC,没密钥) -
text长度建议控制在10000字符内,超长可能截断或报错"text_too_long"
PHP签名生成和请求封装要注意什么
签名错是调不通的最常见原因。PHP里容易踩坑的是字符编码和拼接顺序——text必须是原始传入的UTF-8字符串,不能经过urlencode或json_encode再参与签名;timestamp必须是秒级整数(不是毫秒),且与服务器时间差不能超过300秒。
function callDaGuanRiskApi($appKey, $text) {
$timestamp = time();
$signature = hash('sha256', $appKey . $timestamp . $text);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.datagrand.com/v1/contract/risk');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['text' => $text], JSON_UNESCAPED_UNICODE));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-Datagrand-App-Key: ' . $appKey,
'X-Datagrand-Timestamp: ' . $timestamp,
'X-Datagrand-Signature: ' . $signature
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
返回的risk字段结构怎么解析
成功响应的data.risks是个数组,每个元素含type(风险类型,如"payment_term")、content(触发该风险的原文片段)、position(在原文中的起始字节偏移)。注意:position是字节偏移,不是字符位置——中文占3字节,别直接用substr切,得用mb_substr配合mb_strlen换算。
- 常见
type值:"liability_limit"(责任限制)、"termination_condition"(解约条件)、"governing_law"(管辖法律) - 若返回
"code": 4001,大概率是签名错误或timestamp超时 - 若
risks为空数组,不代表没风险,可能是模型未覆盖该条款类型,也可能是文本预处理时被过滤(比如含大量乱码或不可见控制字符)
合同文本预处理不能跳过
直接把Word复制粘贴过来的文本常含制表符、全角空格、零宽空格(\xe2\x80\x8b),这些会导致签名计算结果与服务端不一致,或让模型漏识别。达观接口对输入干净度敏感,不是“尽力而为”型。
立即学习“PHP免费学习笔记(深入)”;
- 用
preg_replace('/[\x{200B}-\x{200D}\x{FEFF}]/u', '', $text)清除零宽字符 - 把连续空白(包括换行、制表、全角空格)统一替换成单个半角空格:
preg_replace('/\s+/u', ' ', $text) - 用
mb_trim(需自行实现)或trim+mb_convert_encoding确保末尾无BOM - 别用
html_entity_decode,合同里一般没有HTML实体;但若从网页抓取,需先strip_tags











