达观AI审查接口需用PHP cURL调用HTTP API,构造带SHA256签名的POST请求,传UTF-8纯文本至text字段,返回JSON格式风险点列表;签名基于app_key+timestamp+text拼接哈希,timestamp为秒级整数且偏差≤300秒,text须预处理清除零宽字符、统一空白符并确保无BOM。
达观数据的合同审查模型不提供公开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三个Headerapp_key + timestamp + text三者拼接后做SHA256哈希(注意:不是HMAC,没密钥)text长度建议控制在10000字符内,超长可能截断或报错"text_too_long"
签名错是调不通的最常见原因。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); }
成功响应的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),这些会导致签名计算结果与服务端不一致,或让模型漏识别。达观接口对输入干净度敏感,不是“尽力而为”型。
preg_replace('/[\x{200B}-\x{200D}\x{FEFF}]/u', '', $text)清除零宽字符preg_replace('/\s+/u', ' ', $text)
mb_trim(需自行实现)或trim + mb_convert_encoding确保末尾无BOMhtml_entity_decode,合同里一般没有HTML实体;但若从网页抓取,需先strip_tags