整体流程
根据如下步骤操作,可以快速完成从0到1接口调通的全部过程。


准备ICC环境

1.ICC环境一般是部署在现场客户服务器上,由区域同事安装部署
2.ICC平台地址是https://平台ip:端口默认443,用户密码由区域同事提供,访问凭证可由区域同事/客户(知晓超级管理员用户/密码的人员)申请
3.客户无ICC环境需提前对接,可使用我方提供的第三方联调环境,联调环境信息可通过点击icc开放平台右下角在线客服->右侧常见问题:ICC联调环境(线上测试环境)信息下载获取,我方联调环境已提前申请访问凭证,无需申请访问凭证

申请访问凭证

1.使用 [system] 用户 登录ICC管理控制台

2.点击右上角 OpenAPI 按钮

3.点击最下面 申请访问凭证 按钮

4.自己填写clientId,生成 clientSecret凭证

clientId:凭证id,自定义,建议有业务标识,格式:数字、字母,长度不超过128;
clientSecret:凭证密钥,点击下图“申请凭证”按钮生成,再点击“复制”按钮,存入程序中;一个clientId多次申请,clientSecret不变

申请时报“自定义异常”时刷新平台首页或重新登录ICC平台,再次点击“OpenAPI”申请

申请OpenAPI用户
1.使用平台用户登录ICC管理控制台,例如:system用户

2.创建角色(赋予已存在角色,可跳过此步骤)

2.1 搜索角色管理

2.2 进入角色管理,添加角色

部门权限配置

组织权限与资源权限

2.3 点击保存,角色创建成功

3.创建用户

3.1 搜索用户管理

3.2 进入用户管理,添加用户

3.3 添加用户

4.修改OpenAPI用户密码(初始密码:123456)
请仔细阅读协议,并同意

设置密保问题,推荐设置,可跳过

设置新密码

以上工作完成以后,开发者就可以通过OpenAPI用户进行业务对接

鉴权认证
  1. 鉴权SDK内部集成了ICC鉴权逻辑,可以让用户不用复杂编程就可以调用ICC开放接口,java 集成方式见下面章节,c++集成请下载程序包(ICC安全认证SDK-C++(Win64)版 V1.0.0),并参照说明文档使用。
  2. 如果上述方式不能满足您的需要,也可以根据协议鉴权中的说明,自己实现鉴权逻辑。
前置要求
  1. 使用ICC Java SDK,需要按照上述步骤完成访问凭证及openAPI用户相关操作。

  2. ICC Java SDK支持JDK 1.8+

安装依赖
通过Maven(推荐)

这里以java-sdk-oauth 1.0.13.10 版本为例

<dependency>
  <groupId>com.dahuatech.icc</groupId>
  <artifactId>java-sdk-oauth</artifactId>
  <version>1.0.13.10</version>
</dependency>
快速使用

以下这个代码示例向您展示了调用 ICC SDK for Java 的3个主要步骤:

  1. 创建 OauthConfigUserPwdInfo 实例并初始化。
  2. 创建API请求并设置参数。
  3. 发起请求并处理应答或异常。

这里强调,使用SDK调用接口,无需关心token有效时间,保活等

import com.dahuatech.hutool.http.Method;
import com.dahuatech.icc.config.OauthConfigUtil;
import com.dahuatech.icc.exception.ClientException;
import com.dahuatech.icc.oauth.model.v202010.GeneralResponse;
import com.dahuatech.icc.oauth.model.v202010.OauthConfigUserPwdInfo;
import com.dahuatech.icc.oauth.utils.HttpUtils;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
	/**
     * HTTP POST请求示例
     */
    public void testHTTPPost() throws ClientException {
        String host = "平台IP";
        String clientId = "凭证id";
        String clientSecret = "凭证密钥";
        String userName = "平台用户名";
        String password = "平台用户密码";
        boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
        String port = "443";//默认是443
        OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
        oauthConfig.getHttpConfigInfo().setReadTimeout(-1l);//设置读取超时时间,单位毫秒,默认-1
        oauthConfig.getHttpConfigInfo().setConnectionTimeout(-1l);//设置连接超时,单位毫秒,默认-1
        //设置请求体
        Map body = new HashMap<>();
        body.put("key", "value");
        //设置请求头
        Map header = new HashMap<>();
        header.put("key", "value");
        //执行请求
        GeneralResponse response = HttpUtils.executeJson("/evo-apigw/evo-xxx/pathxxx", body, header, Method.POST, oauthConfig, GeneralResponse.class);
    }
    /**
     * 发送HTTP 上传文件示例
     */
    public void testHTTPPostFormData() throws ClientException {
        String host = "平台IP";
        String clientId = "凭证id";
        String clientSecret = "凭证密钥";
        String userName = "平台用户名";
        String password = "平台用户密码";
        boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
        String port = "443";//默认是443
        OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
        //设置请求体
        Map body = new HashMap<>();
        String filePath = "文件路径";
        //请求参数为文件
        File file = new File(filePath);
        body.put("file",file);
        //设置请求头
        Map header = new HashMap<>();
        header.put("key","value");
        //执行请求
        GeneralResponse response = HttpUtils.executeForm("/evo-apigw/evo-xxx/pathxxx", body, header, Method.POST , oauthConfig, GeneralResponse.class);
    }
    /**
     * 发送HTTP GET请求示例
     */
    public void testHTTPGET() throws ClientException {
        String host = "平台IP";
        String clientId = "凭证id";
        String clientSecret = "凭证密钥";
        String userName = "平台用户名";
        String password = "平台用户密码";
        boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
        String port = "443";//默认是443
        OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
        //执行请求
        GeneralResponse response = HttpUtils.executeForm("/evo-apigw/evo-brm/1.0.0/person/subsystem/get-by-paper-number?paperNumber=112233445566", null,null, Method.GET, oauthConfig,GeneralResponse.class);
    }
    /**
     * 获取鉴权token
     */
    public void testGetToken() throws ClientException {
        String host = "平台IP";
        String clientId = "凭证id";
        String clientSecret = "凭证密钥";
        String userName = "平台用户名";
        String password = "平台用户密码";
        boolean isHttp = false;//是否使用http,http需运维中心开启http调试模式支持,开启后端口固定是83
        String port = "443";//默认是443
        OauthConfigUserPwdInfo oauthConfig = new OauthConfigUserPwdInfo(host, clientId, clientSecret, userName, password, isHttp, port);
        HttpUtils.getToken(oauthConfig).getAccess_token();
    }
示例工程

点击下载

协议鉴权

如果使用上述SDK的方式调用ICC接口,可以不用关注此章节

鉴权接口的access_token有效期2h,权限与鉴权用户的组织、部门权限保持一致

获取公钥

例如:
ICC平台ip是:10.80.3.101
则接口完整地址:https://10.80.3.101:443/evo-apigw/evo-oauth/1.0.0/oauth/public-key

GET /evo-apigw/evo-oauth/1.0.0/oauth/public-key HTTP/1.1
Host: 10.80.3.101
RSA加密密码

以下是java RSA加密示例,其他语言参考RSA加密demo

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;

public class RSAUtil {

    /**
     * 基于原生RSA公钥加密
     * @param password 用户密码
     * @param publicKey 公钥
     * @return
     * @throws Exception
     */
    public static String encrypt(String password, String publicKey) throws Exception {
        //base64编码的公钥
        byte[] decoded = java.util.Base64.getDecoder().decode(publicKey);
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        //RSA加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        String outStr;
        byte[] inputArray = password.getBytes("UTF-8");
        int inputLength = inputArray.length;
        // 最大加密字节数,超出最大字节数需要分组加密
        int MAX_ENCRYPT_BLOCK = 117;
        // 标识
        int offSet = 0;
        byte[] resultBytes = {};
        byte[] cache = {};
        while (inputLength - offSet > 0) {
            if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {
                cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);
                offSet += MAX_ENCRYPT_BLOCK;
            } else {
                cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);
                offSet = inputLength;
            }
            resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);
            System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);
        }
        outStr = java.util.Base64.getEncoder().encodeToString(resultBytes);
        return outStr;
    }

}
认证

访问凭证client_id与client_secret必须和在ICC平台上申请的client_id与client_secret保持一致,详见申请访问凭证

access_token有效期2h

例如:
ICC平台ip是:10.80.3.101
则接口完整地址:https://10.80.3.101:443/evo-apigw/evo-oauth/1.0.0/oauth/extend/token

POST /evo-apigw/evo-oauth/1.0.0/oauth/extend/token HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: 10.80.3.101:443

{
    "grant_type":"password",
    "username":"用户账号",
    "password":"RSA加密后的密码",
    "client_id":"申请的clientId",
    "client_secret":"申请的clientSecret",
    "public_key":"获取的公钥"
}
---------------------------------------------------------------------
{
  "success": true,
  "data": {
    "access_token": "10000:5cb47cd80-35d9-406d-a8d3-d87dd672d5d3",
    "token_type": "bearer",
    "refresh_token": "b83403e1-5ea1-41fd-81fc-e86fe5252c93",
    "expires_in": 86399,
    "scope": "*",
    "userId": "10000",
    "magicId": "1868a7db-adeb-42de-8064-43b3706ae407"
  },
  "code": "0",
  "errMsg": ""
}
请求头设置鉴权码

调业务接口、保活与刷新token接口均需设置鉴权码

头部参数解释
Authorization格式:token_type + 空格 + access_token, token_type一般为固定值bearer
示例:bearer 1:bb951116-d963-4528-80e1-91c2e94c3e75