本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
在H5頁面接入金融級實人認證方案時,開發者需要在后端服務器集成SDK,以便調用InitFaceVerify接口獲取用于瀏覽器進行實人認證的認證鏈接CertifyUrl。本文將詳細介紹服務端SDK的安裝方式、所調接口的參數說明以及實際調用接口示例說明。
集成須知
服務接入點
目前支持的接入地域如下表所示。
建議您參考本文示例代碼,配置主備地域Endpoint。在主Endpoint發生故障時可以自動切換到備用Endpoint,保證系統的持續可用性。
地域 | 服務地址 | VPC地址 | 全局接入地址 |
華東2(上海) | IPv4:cloudauth.cn-shanghai.aliyuncs.com | cloudauth-vpc.cn-shanghai.aliyuncs.com |
|
IPv6:cloudauth-dualstack.aliyuncs.com | |||
華北2(北京) | IPv4:cloudauth.cn-beijing.aliyuncs.com | cloudauth-vpc.cn-beijing.aliyuncs.com | |
IPv6:cloudauth-dualstack.cn-beijing.aliyuncs.com |
SDK安裝與源碼下載
您可根據業務實際的技術選型,選擇合適的SDK語言進行集成。
支持語言 | SDK下載地址 | Github源碼地址 |
Java | ||
Python | ||
Typescript | ||
Go | ||
PHP | ||
C# | ||
C++ |
QPS限量
API獨享QPS限量,詳情請參見服務端接口QPS限量說明。
服務端需要集成的兩個接口
InitFaceVerify-發起認證請求
每次開始認證前通過調用本接口獲取用于瀏覽器進行實人認證的認證鏈接CertifyUrl
和每次認證的唯一CertifyId
。
須將此接口的請求封裝為開始認證的業務接口,供網頁端調用。
請求參數
名稱 | 類型 | 是否必選 | 描述 | 示例值 |
SceneId | Long | 是 | 要接入的認證場景ID。該ID在控制臺創建認證場景后自動生成。關于如何創建認證場景,請參見添加認證場景。 | 1000000006 |
OuterOrderNo | String | 是 | 您自定義的業務唯一標識,用于后續定位和排查問題使用。 支持長度為32位的字母和數字組合,請確保唯一。 | e0c34a77f5ac40a5aa5e6ed20c353888 |
ProductCode | String | 是 | 要接入的認證方案。 唯一取值:ID_PRO。詳情方案說明,請參見H5網頁接入。 | ID_PRO |
Model | String | 是 | 要進行活體檢測的類型。 說明 活體檢測類型僅支持下列取值,暫不支持自定義動作或組合。
| PHOTINUS_LIVENESS |
CertType | String | 是 | 用戶證件類型。支持的證件類型,請參見使用限制。 不同證件類型,取值均為IDENTITY_CARD。 | IDENTITY_CARD |
CertName | String | 是 | 您的終端用戶的真實姓名。 | 張三 |
CertNo | String | 是 | 您的終端用戶的證件號碼。 | 330103xxxxxxxxxxxx |
ReturnUrl | String | 是 | 認證結束后回跳頁面的鏈接地址。 | https://www.aliyun.com |
MetaInfo | String | 是 | MetaInfo環境參數。實際環境需要通過JS文件,調用函數 |
警告 該示例僅供參考,實際集成中不能直接應用,否則會導致無法正常獲取到CertifyUrl。 |
Mobile | String | 否 | 您終端用戶的手機號碼。 | 130xxxxxxxx |
Ip | String | 否 | 您終端用戶的IP。 | 47.100.XX.XX |
UserId | String | 否 | 您自定義的用戶ID,請保持唯一。 | 123456789 |
CallbackUrl | String | 否 | 認證結果的回調通知地址,回調請求方式默認為GET,回調地址必須以 重要
| https://www.aliyun.com |
CallbackToken | CallbackToken | 否 | 安全Token,由您自行生成,用于防重復、防篡改校驗。 如果設置了該值,會在回調地址中顯示CallbackToken字段。 | NMjvQanQgplBSaEI0sL86WnQplB |
CertifyUrlType | String | 否 | Web SDK設備類型。取值WEB或者H5。 說明 只支持Web SDK設備類型。 | WEB |
CertifyUrlStyle | String | 否 | 返回CertifyUrl類型,包括:
| L |
AuthId | String | 否 | 用戶授權ID,最大長度為64位字符。 | 92d46b9e9e2d703f2897f350d5bd4149 |
EncryptType | String | 否 | 加密類型。為空表示不加密。 如開啟加密傳輸,需傳入加密算法。目前僅支持SM2國密算法。 如需傳入加密算法,需對CertName和CertNo進行加密,并傳入加密后的密文。有關參數加密的更多信息,請參見參數加密說明。 | SM2 |
ProcedurePriority | String | 否 | 移動端H5方式認證出現WebRTC或者Webassembly不兼容時的降級配置。 默認值為url。
| url |
FaceGuardOutput | String | 否 | 人臉保鏢標簽種類。 DeviceRisk:設備風險標簽。 說明
| DeviceRisk |
RarelyCharacters | String | 否 | 是否開啟生僻字模式:
| Y |
uiCustomUrl | String | 否 | UI配置文件URL。關于Web SDK自定義UI說明,請參見Web SDK UI自定義配置說明。 | www.aliyundoc.com |
VideoEvidence | String | 否 | 是否開啟視頻存證。
說明 因為視頻文件較大,當網絡不穩定時系統會丟棄視頻文件優先保障認證必要圖片傳輸,建議您業務上設置為弱依賴視頻。 | false |
返回數據
名稱 | 類型 | 描述 | 示例值 |
RequestId | String | 請求ID。 | 130A2C10-B9EE-4D84-88E3-5384FF039795 |
Message | String | 返回信息。 | success |
Code | String | 返回碼:200為成功,其他為失敗。 詳細說明,請參見返回Code和Message說明。 | 200 |
ResultObject.CertifyId | String | 實人認證唯一標識。 重要 CertifyId字段為計費統計字段,為了方便后續核對賬單,請您在本地留存該字段信息。 初始化接口返回的認證CertifyId在30分鐘有效且僅能認證提交一次,請您在有效期內使用,避免重復使用。 | 91707dc296d469ad38e4c5efa6a0f24b |
ResultObject.CertifyUrl | String | Web瀏覽器進行實人認證的URL,認證結束后根據入參ReturnUrl進行跳轉。 警告
| https://t.aliyun.com/**** |
DescribeFaceVerify-獲取認證詳細數據
當您收到回調通知之后,可以在服務端通過該接口獲取相應的認證狀態和認證資料。
雖然InitFaceVerify在認證結束后跳轉ReturnUrl時會攜帶認證結果,但考慮到瀏覽器的安全性,建議調用此接口進行認證結果的二次驗證。
請求參數
名稱 | 類型 | 是否必選 | 描述 | 示例值 |
SceneId | Long | 是 | 認證場景ID。 | 1000000006 |
CertifyId | String | 是 | 實人認證唯一標識。 | 91707dc296d469ad38e4c5efa6a0f24b |
返回數據
名稱 | 類型 | 描述 | 示例值 |
RequestId | String | 請求ID。 | 130A2C10-B9EE-4D84-88E3-5384FF039795 |
Message | String | 請求消息的響應信息。 | success |
Code | String | 返回碼,詳細說明,請參見返回Code和Message。 | 200 |
ResultObject.Passed | String | 認證結果:
重要 認證結果判定以此字段為準。 | T |
ResultObject.SubCode | String | 認證結果描述。詳情請參見返回Code和Message。 | 200 |
ResultObject.IdentityInfo | String | 認證的主體信息,一般的認證場景返回為空。 | null |
ResultObject.DeviceRisk | String | 設備風險標簽。 | VirtualBrowser 說明 多個設備風險標簽以半角逗號(,)分隔。如需了解更多設備風險標簽及其含義,請參見人臉保鏢標簽說明。 |
ResultObject.MaterialInfo | String | 認證主體附件信息,主要為圖片類材料。 | 示例見下文 |
ResultObject.UserInfo | String | 記錄在生僻字模式下用戶輸入的身份信息與對應編碼。返回數據為JSON格式字符串,姓名中無生僻字返回為空字符串。
|
|
判斷認證結果請以ResultObject.Passed字段為準。
返回示例詳述
ResultObject.MaterialInfo的JSON格式示例:
{ // 是否為攻擊:攻擊為T,非攻擊為F。 "faceAttack": "T", // 是否有臉部遮擋:有臉部遮擋為T,否則為F。 "faceOcclusion": "F", // 認證的照片信息。 "facialPictureFront": { //人臉攻擊分。 "faceAttackScore": 0.00008597839769208804, // 照片存放客戶上海區域的OSS里,此為照片的bucket名。 "ossBucketName": "cn-shanghai-aliyun-cloudauth-1260051251634779", // 照片存放客戶上海區域的OSS里,此為照片的文件名。 "ossObjectName": "verify/1260051251634779/03a081bd96328aedf83f635f39a50c57_0.jpeg", // 照片https地址,有效期15分鐘,從查詢時開始計時。 "pictureUrl": "http://cn-shanghai-aliyun-cloudauth-1260051251634779.oss-cn-shanghai.aliyuncs.com/verify/1260051251634779/03a081bd96328aedf83f635f39a50c57_0.jpeg?Expires=1625371140&OSSAccessKeyId=STS.NTX1ngfr6Acg2Pmnn2RYM****&Signature=Hw5BF9WxJs6wI68IxKs41cxCU8****&security-token=CAISjgJ1q6Ft5B2yfSjIr5ftetTTi60X9qGMMHbcim5nXtZhu7GT1Dz2IH1PdXFgA%2Bgds%2Fswmm5U7vgalrkqEcEdHRGdN5YpsM8LrlzwO1h2TGRsq%2B5qsoasPETOITyZtZagToeUZdfZfejXGDKgvyRvwLz8WCy%2FVli%2BS%2FOggoJmadJlNWvRL0AxZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO4gEWq4bHm5fCskKD1Qenk7FO%2B9uuc6LJNZc8YM1NNP6ux%2FFze6b71ypd1gNH7q8ejtYfpGyW5oHHWwIMvErYbbaMrIV1WwZ9Z7knHaVAq%2BXwnOBkuuXYnIns0BdLMuZOSD7YQI2wYWEwgBcxt78agAF%2FHZbelNLYWtipAu5X5oG1t22SqIr1p3TMK5FrjDIVeWOppcxeRXtU%2BjR7hGcwd25scGhiraoxTXV3sxw%2F6dhFSswQ37O4j%2B%2FrCPtiGauqn2ZMdMj%2FvYwKb6KmpQqa%2BtR%2F9cxhS6hoIQRq0SUIfyXl5ZUiZbTjW22iwuX%2BPwzVCw%3D%3D", // 視頻存放客戶上海區域的OSS里,此為視頻的文件名(僅當客戶端設置視頻參數時返回)。 "ossVerifyVideoObjectName": "verify/1260051251634779/03a081bd96328aedf83f635****_verifyvideo_dcb7.mov", // 視頻https或htttp地址,有效期15分鐘,從查詢時開始計時(僅當客戶端設置視頻參數時返回)。 "verifyVideoUrl": "http://cn-shanghai-aliyun-cloudauth-1260051251634779.oss-cn-shanghai.aliyuncs.com/verify/******? // 活體人臉質量分數。 "qualityScore": 99.93476867675781, // 人臉和公安比對分數,閾值可參考下表詳細說明。 "verifyScore": 57.678396649466755 // 降級標識字段(僅當deviceType是h5時返回)Keep-未降級;url-該筆認證用戶觸發了URL降級完成認證;video-該筆認證用戶觸發了視頻降級完成認證 "procedurePriorityResult":"keep" }, }
ResultObject.SubCode錯誤碼說明,請參見ResultObject.SubCode錯誤碼說明。
verifyScore閾值說明:
千分之一誤識率
萬分之五誤識率
萬分之一誤識率
十萬分之五誤識率
十萬分之一誤識率
70
71.5
75
76.5
80
說明如果您有個性化需求,您可以根據業務情況,參考返回的比對分和閾值,自定義認證結果。
返回Code和Message說明,請參見返回Code和Message。
SDK調用示例
阿里云提供了OpenAPI門戶,可以使用網頁或命令行方式預先驗證接口,您可以通過下面的鏈接進入調試:
在集成操作前,默認您已經開通了服務并獲取了AccessKey和認證場景ID,這兩個參數是調用接口所必需的。如果沒有,請參考前提條件獲取。
SDK集成
Java語言為例,要求JDK 1.8及以上版本。
在pom.xml中添加如下依賴,即可在Maven工程中使用SDK。
Java SDK依賴。以下依賴版本僅供參考,建議在實際配置時獲取最新依賴版本。
<dependency> <groupId>com.aliyun</groupId> <artifactId>cloudauth20190307</artifactId> <version>2.7.2</version> </dependency>
身份驗證依賴。請查看ChangeLog.txt獲取所有已發布的版本列表(建議使用最新的版本)。
<dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency>
說明本示例通過阿里云Credentials工具從環境變量中讀取AccessKey,來實現API訪問的身份驗證。您需要提前在系統配置環境變量,具體操作,請參見身份驗證配置。
接口調用示例。
重要調用示例中僅設定了必要參數,詳細參數請參見InitFaceVerify-發起認證請求和DescribeFaceVerify-獲取認證詳細數據。
import java.util.Arrays; import java.util.List; import com.aliyun.cloudauth20190307.Client; import com.aliyun.cloudauth20190307.models.*; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; public class InitFaceVerify { public static void main(String[] args) throws Exception { InitFaceVerifyRequest request = new InitFaceVerifyRequest(); // 場景ID+L。 request.setSceneId(100000xxxxL); // 設置商戶請求的唯一標識。 request.setOuterOrderNo("xxxx"); // 認證方案。 request.setProductCode("ID_PRO"); // 模式。 request.setModel("LIVENESS"); request.setCertType("IDENTITY_CARD"); request.setCertName("張先生"); request.setCertNo("xxxx"); // MetaInfo環境參數,此參數應由前端js獲取并傳入。 request.setMetaInfo("{}"); //業務頁面回跳的目標地址。 request.setReturnUrl("https://www.aliyundoc.com"); InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request); response.getBody().getRequestId(); response.getBody().getResultObject().getCertifyId(); System.out.println(response.getBody().getRequestId()); System.out.println(response.getBody().getCode()); System.out.println(response.getBody().getMessage()); System.out.println(response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getCertifyId()); } private static InitFaceVerifyResponse initFaceVerifyAutoRoute(InitFaceVerifyRequest request) { // 第一個為主區域Endpoint,第二個為備區域Endpoint。 List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com"); InitFaceVerifyResponse lastResponse = null; for (int i=0; i<endpoints.size(); i++) { try { InitFaceVerifyResponse response = initFaceVerify(endpoints.get(i), request); lastResponse = response; // 服務端錯誤,切換到下個區域調用。 if(response != null){ if(500 == response.getStatusCode()){ continue; } if(response.getBody() != null){ if("500".equals(response.getBody().getCode())){ continue; } } } // 正常返回 return lastResponse; }catch (Exception e) { e.printStackTrace(); if(i == endpoints.size()-1){ throw new RuntimeException(e); } } } return lastResponse; } private static InitFaceVerifyResponse initFaceVerify(String endpoint, InitFaceVerifyRequest request) throws Exception { // 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 // 強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 // 本示例通過阿里云Credentials工具從環境變量中讀取AccessKey,來實現API訪問的身份驗證。如何配置環境變量,請參見http://bestwisewords.com/document_detail/378657.html。 com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(); Config config = new Config(); config.setCredential(credentialClient); config.setEndpoint(endpoint); // 設置http代理。 //config.setHttpProxy("http://xx.xx.xx.xx:xxxx"); // 設置https代理。 //config.setHttpsProxy("https://xx.xx.xx.xx:xxxx"); Client client = new Client(config); // 創建RuntimeObject實例并設置運行參數。 RuntimeOptions runtime = new RuntimeOptions(); runtime.readTimeout = 10000; runtime.connectTimeout = 10000; return client.initFaceVerifyWithOptions(request, runtime); } }
import java.util.Arrays; import java.util.List; import com.aliyun.cloudauth20190307.Client; import com.aliyun.cloudauth20190307.models.DescribeFaceVerifyRequest; import com.aliyun.cloudauth20190307.models.DescribeFaceVerifyResponse; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; public class DescribeFaceVerify { public static void main(String[] args) throws Exception { // 創建API請求并設置參數。 DescribeFaceVerifyRequest request = new DescribeFaceVerifyRequest(); // 場景ID+L。 request.setSceneId(0L); // CertifyId在InitFaceVerify接口的返回值中。 request.setCertifyId("xxxx"); DescribeFaceVerifyResponse response = describeFaceVerifyAutoRoute(request); System.out.println(response.getBody().getRequestId()); System.out.println(response.getBody().getCode()); System.out.println(response.getBody().getMessage()); System.out.println( response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getPassed()); System.out.println( response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getSubCode()); System.out.println( response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getIdentityInfo()); System.out.println( response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getDeviceToken()); System.out.println( response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getMaterialInfo()); } private static DescribeFaceVerifyResponse describeFaceVerifyAutoRoute(DescribeFaceVerifyRequest request) { // 第一個為主區域Endpoint,第二個為備區域Endpoint。 List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com"); DescribeFaceVerifyResponse lastResponse = null; for (int i = 0; i < endpoints.size(); i++) { try { DescribeFaceVerifyResponse response = describeFaceVerify(endpoints.get(i), request); lastResponse = response; // 服務端錯誤,切換到下個區域調用。 if (response != null) { if (500 == response.getStatusCode()) { continue; } if (response.getBody() != null) { if ("500".equals(response.getBody().getCode())) { continue; } } } return lastResponse; } catch (Exception e) { if (i == endpoints.size() - 1) { throw new RuntimeException(e); } } } return lastResponse; } private static DescribeFaceVerifyResponse describeFaceVerify(String endpoint, DescribeFaceVerifyRequest request) throws Exception { // 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 // 強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 //本示例通過阿里云Credentials工具從環境變量中讀取AccessKey,來實現API訪問的身份驗證。如何配置環境變量,請參見http://bestwisewords.com/document_detail/378657.html。 com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(); Config config = new Config(); config.setCredential(credentialClient); config.setEndpoint(endpoint); Client client = new Client(config); RuntimeOptions runtime = new RuntimeOptions(); runtime.readTimeout = 10000; runtime.connectTimeout = 10000; return client.describeFaceVerifyWithOptions(request, runtime); } }