package com.kingdee.eas.custom.esign.util;
import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpHelper;
import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpResponse;
import com.kingdee.eas.custom.esign.tsign.hz.enums.EsignRequestType;
import com.kingdee.eas.custom.esign.tsign.hz.exception.EsignException;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.URIBuilder;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Map;
/**
* description: EsignHttpUtil
* date: 17/11/2025 下午 4:26
* author: lhbj
* version: 1.0
*/
public class EsignHttpUtil {
/**
* 基础请求接口
*
* @param url 请求地址
* @param jsonParm JSON字符串参数
* @param requestType 请求类型 POST/GET
* @param debug 输出日志
* @return
* @throws EsignException
*/
public static EsignHttpResponse doCommHttp(String url, String jsonParm, EsignRequestType requestType, Boolean debug) throws EsignException {
//
//生成签名鉴权方式的的header
Map header = EsignHttpHelper.signAndBuildSignAndJsonHeader(EsignConfig.getInstance().getEsignAppId(),
EsignConfig.getInstance().getEsignAppSecret(), jsonParm, requestType.name(), url, debug);
//发起接口请求
return EsignHttpHelper.doCommHttp(EsignConfig.getInstance().getEsignHost(), url, requestType, jsonParm, header, debug);
}
/**
* POST请求接口
*
* @param url 请求地址
* @param jsonParm JSON字符串参数
* @param debug 输出日志
* @return
* @throws EsignException
*/
public static EsignHttpResponse POST(String url, String jsonParm, Boolean debug) throws EsignException {
//请求方法
EsignRequestType requestType = EsignRequestType.POST;
return doCommHttp(url, jsonParm, requestType, debug);
}
public static EsignHttpResponse POST(String url, String jsonParm) throws EsignException {
return POST(url, jsonParm, false);
}
/**
* GET请求接口
*
* @param url 请求地址
* @param jsonParm JSON字符串参数
* @param debug 输出日志
* @return
* @throws EsignException
*/
public static EsignHttpResponse GET(String url, String jsonParm, Boolean debug) throws EsignException {
//请求方法
EsignRequestType requestType = EsignRequestType.GET;
return doCommHttp(url, jsonParm, requestType, debug);
}
public static EsignHttpResponse GET(String url, String jsonParm) throws EsignException {
return GET(url, jsonParm, false);
}
/**
* 查询合同模板中控件详情
* 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/aoq509
* 接口地址:https://{host}/v3/doc-templates/{docTemplateId}
* 请求方法:GET
*
* @return
* @throws EsignException
*/
public static EsignHttpResponse getDocTemplatesDetailById(String id) throws EsignException {
String apiaddr = EsignConfig.getInstance().get("docTemplatesDetailById") + id;
String jsonParm = null;
return GET(apiaddr, jsonParm);
}
/**
* 填写模板生成文件
* 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/mv8a3i
* 接口地址:https://{host}/v3/files/create-by-doc-template
* 请求方法:POST
*
* @param json 注意事项:componentId与componentKey两个字段不能同时传值,只能一个有值
* @return
* @throws EsignException
*/
public static EsignHttpResponse createByDocTemplate(String json) throws EsignException {
String apiaddr = EsignConfig.getInstance().get("createByDocTemplate");
return POST(apiaddr, json);
}
/**
* 查询机构认证信息
* 参考文档:https://open.esign.cn/doc/opendoc/auth3/xxz4tc
* 接口地址:https://{host}/v3/organizations/identity-info
* 请求方法:GET
* 注意事项:
* 入参中orgId、orgName和orgIDCardNum三个参数只选择一个传入即可查询机构认证信息。
* 查询优先级为 orgId > orgName > orgIDCardNum。
*
* @param orgId
* @param orgName
* @param orgIDCardNum
* @param psnIDCardType 组织机构证件类型(传orgIDCardNum时,该参数为必传)
* CRED_ORG_USCC - 统一社会信用代码
* CRED_ORG_REGCODE - 工商注册号
* @return
* @throws EsignException
*/
public static EsignHttpResponse getOrgIdentity_info(String orgId, String orgName,String orgIDCardNum,String psnIDCardType) throws EsignException, URISyntaxException {
String apiaddr = EsignConfig.getInstance().get("organizations.identity-info");
if (StringUtils.isBlank(orgId)&&StringUtils.isBlank(orgName)) {
if (StringUtils.isNotBlank(orgIDCardNum)&&StringUtils.isBlank(psnIDCardType)) {
throw new EsignException("传orgIDCardNum时,psnIDCardType参数为必传");
}else {
throw new EsignException("orgId与orgName与orgIDCardNum不能都为空");
}
}
URIBuilder uriBuilder = new URIBuilder(apiaddr);
if (StringUtils.isNotBlank(orgId)) {
uriBuilder.addParameter("orgId", orgId);
}
if (StringUtils.isNotBlank(orgName)) {
uriBuilder.addParameter("orgName", orgName);
}
if (StringUtils.isNotBlank(orgIDCardNum)&&StringUtils.isNotBlank(psnIDCardType)) {
uriBuilder.addParameter("orgIDCardNum", orgIDCardNum);
uriBuilder.addParameter("psnIDCardType", psnIDCardType);
}
URI uri = uriBuilder.build(); // 自动编码
apiaddr = uri.toString();
return GET(apiaddr, null);
}
/**
* 查询个人认证信息
* 参考文档:https://open.esign.cn/doc/opendoc/auth3/xxz4tc
* 接口地址:https://{host}/v3/persons/identity-info
* 请求方法:GET
* 注意事项:
* 入参中psnId、psnAccount和psnIDCardNum三个参数只选择一个传入即可查询个人的认证信息。
* 查询优先级为 psnId > psnAccount > psnIDCardNum
* @param psnId
* @param psnAccount
* @param psnIDCardNum
* @param psnIDCardType 个人证件号类型 (传psnIDCardNum时,证件类型为必传项)
* CRED_PSN_CH_IDCARD - 中国大陆居民身份证
* CRED_PSN_CH_HONGKONG - 香港来往大陆通行证
* CRED_PSN_CH_MACAO - 澳门来往大陆通行证
* CRED_PSN_CH_TWCARD - 台湾来往大陆通行证
* CRED_PSN_PASSPORT - 护照
* @return
* @throws EsignException
*/
public static EsignHttpResponse getPersonIdentity_info(String psnId, String psnAccount,String psnIDCardNum,String psnIDCardType) throws EsignException, URISyntaxException {
String apiaddr = EsignConfig.getInstance().get("persons.identity-info");
if (StringUtils.isBlank(psnId)&&StringUtils.isBlank(psnAccount)) {
if (StringUtils.isNotBlank(psnIDCardNum)&&StringUtils.isBlank(psnIDCardType)) {
throw new EsignException("传orgIDCardNum时,psnIDCardType参数为必传");
}else {
throw new EsignException("orgId与orgName与orgIDCardNum不能都为空");
}
}
URIBuilder uriBuilder = new URIBuilder(apiaddr);
if (StringUtils.isNotBlank(psnId)) {
uriBuilder.addParameter("psnId", psnId);
}
if (StringUtils.isNotBlank(psnAccount)) {
uriBuilder.addParameter("psnAccount", psnAccount);
}
if (StringUtils.isNotBlank(psnIDCardNum)&&StringUtils.isNotBlank(psnIDCardType)) {
uriBuilder.addParameter("orgIDCardNum", psnIDCardNum);
uriBuilder.addParameter("psnIDCardType", psnIDCardType);
}
URI uri = uriBuilder.build(); // 自动编码
apiaddr = uri.toString();
return GET(apiaddr, null);
}
}