EsignHttpUtil.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. package com.kingdee.eas.custom.esign.util;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.google.common.collect.Maps;
  6. import com.kingdee.bos.BOSException;
  7. import com.kingdee.bos.Context;
  8. import com.kingdee.bos.dao.IObjectPK;
  9. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  10. import com.kingdee.bos.util.BOSUuid;
  11. import com.kingdee.eas.basedata.person.PersonInfo;
  12. import com.kingdee.eas.custom.esign.*;
  13. import com.kingdee.eas.custom.esign.bizEnum.EsignConfigEnum;
  14. import com.kingdee.eas.custom.esign.bizEnum.EsignStatusEnum;
  15. import com.kingdee.eas.custom.esign.bizEnum.SendStatusEnum;
  16. import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpHelper;
  17. import com.kingdee.eas.custom.esign.tsign.hz.comm.EsignHttpResponse;
  18. import com.kingdee.eas.custom.esign.tsign.hz.enums.EsignRequestType;
  19. import com.kingdee.eas.custom.esign.tsign.hz.exception.EsignException;
  20. import com.kingdee.eas.mobileaccess.hr.sHR.config.EASConfig;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.apache.http.client.utils.URIBuilder;
  23. import java.net.URI;
  24. import java.net.URISyntaxException;
  25. import java.text.MessageFormat;
  26. import java.util.List;
  27. import java.util.Locale;
  28. import java.util.Map;
  29. /**
  30. * description: EsignHttpUtil <br>
  31. * date: 17/11/2025 下午 4:26 <br>
  32. * author: lhbj <br>
  33. * version: 1.0 <br>
  34. */
  35. public class EsignHttpUtil {
  36. /**
  37. * 基础请求接口
  38. *
  39. * @param url 请求地址
  40. * @param jsonParm JSON字符串参数
  41. * @param requestType 请求类型 POST/GET
  42. * @param debug 输出日志
  43. * @param sourceId 来源id
  44. * @return
  45. * @throws EsignException
  46. */
  47. public static EsignHttpResponse doCommHttp(Context ctx, String url, String jsonParm, EsignRequestType requestType, Boolean debug, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  48. //
  49. //生成签名鉴权方式的的header
  50. Map<String, String> header = EsignHttpHelper.signAndBuildSignAndJsonHeader(EsignConfig.getInstance().getEsignAppId(),
  51. EsignConfig.getInstance().getEsignAppSecret(), jsonParm, requestType.name(), url, debug);
  52. EsignHttpResponse response = EsignHttpHelper.doCommHttp(EsignConfig.getInstance().getEsignHost(), url, requestType, jsonParm, header, debug);
  53. try {
  54. if (null == ctx) {
  55. return response;
  56. }
  57. if (null == ctx) {
  58. String currentSolutionName = EASConfig.getInstance().getSlnName();
  59. String currentDatabaseCenter = EASConfig.getInstance().getDcCode();
  60. ctx = new Context(new ObjectUuidPK(), currentSolutionName, currentDatabaseCenter, new Locale("l2"));
  61. }
  62. EsignLogInfo esignLogInfo = new EsignLogInfo();
  63. IEsignLog log = EsignLogFactory.getLocalInstance(ctx);
  64. esignLogInfo.setEsiginName(configEnum);
  65. esignLogInfo.setRequestState(String.valueOf(response.getStatus()));
  66. esignLogInfo.setUrl(url);
  67. esignLogInfo.setRequestData(jsonParm);
  68. esignLogInfo.setResponseData(response.getBody());
  69. esignLogInfo.setSource(sourceId);
  70. IObjectPK pk = log.addnew(esignLogInfo);
  71. response.setLogId(pk.toString());
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. } finally {
  75. }
  76. //发起接口请求
  77. return response;
  78. }
  79. /**
  80. * POST请求接口
  81. *
  82. * @param url 请求地址
  83. * @param jsonParm JSON字符串参数
  84. * @param debug 输出日志
  85. * @param sourceId 来源id
  86. * @return
  87. * @throws EsignException
  88. */
  89. public static EsignHttpResponse POST(Context ctx, String url, String jsonParm, Boolean debug, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  90. //请求方法
  91. EsignRequestType requestType = EsignRequestType.POST;
  92. return doCommHttp(ctx, url, jsonParm, requestType, debug, sourceId, configEnum);
  93. }
  94. public static EsignHttpResponse POST(Context ctx, String url, String jsonParm, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  95. return POST(ctx, url, jsonParm, false, sourceId, configEnum);
  96. }
  97. /**
  98. * GET请求接口
  99. *
  100. * @param url 请求地址
  101. * @param jsonParm JSON字符串参数
  102. * @param debug 输出日志
  103. * @param sourceId 来源id
  104. * @return
  105. * @throws EsignException
  106. */
  107. public static EsignHttpResponse GET(Context ctx, String url, String jsonParm, Boolean debug, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  108. //请求方法
  109. EsignRequestType requestType = EsignRequestType.GET;
  110. return doCommHttp(ctx, url, jsonParm, requestType, debug, sourceId, configEnum);
  111. }
  112. public static EsignHttpResponse GET(Context ctx, String url, String jsonParm, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  113. return GET(ctx, url, jsonParm, false, sourceId, configEnum);
  114. }
  115. public static EsignHttpResponse DELETE(Context ctx, String url, String jsonParm, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  116. return DELETE(ctx, url, jsonParm, false, sourceId, configEnum);
  117. }
  118. public static EsignHttpResponse DELETE(Context ctx, String url, String jsonParm, Boolean debug, String sourceId, EsignConfigEnum configEnum) throws EsignException {
  119. //请求方法
  120. EsignRequestType requestType = EsignRequestType.DELETE;
  121. return doCommHttp(ctx, url, jsonParm, requestType, debug, sourceId, configEnum);
  122. }
  123. public static EsignHttpResponse getDocTemplatesDetailById(Context ctx, String id) throws EsignException {
  124. return getDocTemplatesDetailById(ctx, id, null);
  125. }
  126. /**
  127. * 查询合同模板中控件详情
  128. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/aoq509
  129. * 接口地址:https://{host}/v3/doc-templates/{docTemplateId}
  130. * 请求方法:GET
  131. *
  132. * @param id 模板id
  133. * @param sourceId 来源id
  134. * @return
  135. * @throws EsignException
  136. */
  137. public static EsignHttpResponse getDocTemplatesDetailById(Context ctx, String id, String sourceId) throws EsignException {
  138. EsignConfigEnum configEnum = EsignConfigEnum.docTemplatesDetailById;
  139. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  140. apiaddr = MessageFormat.format(apiaddr, id);
  141. String jsonParm = null;
  142. return GET(ctx, apiaddr, jsonParm, sourceId, configEnum);
  143. }
  144. /**
  145. * 填写模板生成文件
  146. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/mv8a3i
  147. * 接口地址:https://{host}/v3/files/create-by-doc-template
  148. * 请求方法:POST
  149. * 注意事项:componentId与componentKey两个字段不能同时传值,只能一个有值
  150. *
  151. * @param json
  152. * @param sourceId 来源id
  153. * @return
  154. * @throws EsignException
  155. */
  156. public static EsignHttpResponse createByDocTemplate(Context ctx, String json, String sourceId) throws EsignException {
  157. EsignConfigEnum configEnum = EsignConfigEnum.createByDocTemplate;
  158. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  159. return POST(ctx, apiaddr, json, sourceId, configEnum);
  160. }
  161. public static EsignHttpResponse createBySignTemplate(Context ctx, String personId, String fileName, String operatorId, String efileId,
  162. String json) throws BOSException {
  163. EsignHttpResponse resp = createBySignTemplate(ctx, personId, fileName, operatorId, efileId, EsignStatusEnum.SIGNING, json);
  164. return resp;
  165. }
  166. /**
  167. * 通过流程模板创建合同拟定和签署流程
  168. * 参考文档:https://open.esign.cn/doc/opendoc/file-and-template3/megwsgkmpbg1tec1
  169. * 接口地址:https://{host}/v3/sign-flow/create-by-sign-template
  170. * 请求方法:POST
  171. * 注意事项:componentId与componentKey两个字段不能同时传值,只能一个有值
  172. *
  173. * @param ctx 上下文
  174. * @param personId 签署员工id
  175. * @param fileName 签署文件名称
  176. * @param operatorId 操作人
  177. * @param efileId 发起单据id
  178. * @param json 签署信息
  179. * @return
  180. * @throws EsignException
  181. */
  182. public static EsignHttpResponse createBySignTemplate(Context ctx, String personId, String fileName, String operatorId, String efileId,
  183. EsignStatusEnum esignStatus,
  184. String json) throws BOSException {
  185. EsignConfigEnum configEnum = EsignConfigEnum.createBySignTemplate;
  186. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  187. EsignHttpResponse resp = new EsignHttpResponse();
  188. resp.setStatus(500);
  189. /**
  190. * 发起签署前需要新增电子签全域状态总览表
  191. */
  192. IESignGlobalStatusOverview globalStatusOverview = ESignGlobalStatusOverviewFactory.getLocalInstance(ctx);
  193. ESignGlobalStatusOverviewInfo info = new ESignGlobalStatusOverviewInfo();
  194. // try {
  195. // String str = "select fid from CT_ESI_ESGSO where cfefileId=?";
  196. // IRowSet rs = DbUtil.executeQuery(ctx, str, new Object[]{efileId});
  197. // if (rs.next()) {
  198. // String fid = rs.getString("fid");
  199. // info = globalStatusOverview.getESignGlobalStatusOverviewInfo(new ObjectUuidPK(fid));
  200. // }
  201. // } catch (SQLException | EASBizException e) {
  202. // e.printStackTrace();
  203. // }
  204. info.setEsignStatus(EsignStatusEnum.DRAFT);
  205. info.setSendStatus(SendStatusEnum.FAILURE);
  206. if (StringUtils.isNotBlank(personId)) {
  207. PersonInfo personInfo = new PersonInfo();
  208. personInfo.setId(BOSUuid.read(personId));
  209. info.setPerson(personInfo);
  210. }
  211. if (StringUtils.isNotBlank(operatorId)) {
  212. PersonInfo operator = new PersonInfo();
  213. operator.setId(BOSUuid.read(operatorId));
  214. info.setOperator(operator);
  215. }
  216. info.setFileName(fileName);
  217. info.setEfileId(efileId);
  218. info.setRequestParams(json);
  219. StringBuilder cum = new StringBuilder();
  220. JSONObject jsonObject = JSON.parseObject(json);
  221. if(null!=jsonObject) {
  222. JSONArray participants = jsonObject.getJSONArray("participants");
  223. if (null!=participants){
  224. for(int i=0;i<participants.size();i++ ){
  225. JSONObject participant = participants.getJSONObject(i);
  226. String participantFlag = participant.getString("participantFlag");
  227. JSONObject orgParticipant = participant.getJSONObject("orgParticipant");
  228. if(null!=orgParticipant) {
  229. String orgName = orgParticipant.getString("orgName");
  230. JSONObject transactor=orgParticipant.getJSONObject("transactor");
  231. if(null!=transactor) {
  232. String psnAccount = transactor.getString("transactorPsnAccount");
  233. String transactorName = transactor.getString("transactorName");
  234. cum.append(participantFlag + ":" + transactorName + "(" + psnAccount + ");");
  235. }
  236. }
  237. JSONObject psnParticipant = participant.getJSONObject("psnParticipant");
  238. if(null!=psnParticipant) {
  239. String psnName = psnParticipant.getString("psnName");
  240. String psnAccount = psnParticipant.getString("psnAccount");
  241. cum.append(participantFlag+":"+psnName+"("+psnAccount+");");
  242. }
  243. }
  244. if(cum.length()>0) {
  245. cum.delete(cum.length() - 1, cum.length());
  246. }
  247. info.setDescription(cum.toString());
  248. }
  249. }
  250. info.setEsignName(configEnum);
  251. try {
  252. resp = POST(ctx, apiaddr, json, efileId, configEnum);
  253. if (resp.getStatus() >= 200 && resp.getStatus() < 300) {
  254. JSONObject object = JSON.parseObject(resp.getBody());
  255. if ("0".equals(String.valueOf(object.get("code")))) {
  256. JSONObject data = object.getJSONObject("data");
  257. info.setSignFlowId(data.getString("signFlowId"));
  258. info.setSendStatus(SendStatusEnum.SUCCESS);
  259. info.setEsignStatus(esignStatus);
  260. }
  261. }
  262. info.setSourceBillId(resp.getLogId());
  263. } catch (Exception e) {
  264. e.printStackTrace();
  265. info.setSendStatus(SendStatusEnum.FAILURE);
  266. } finally {
  267. try {
  268. globalStatusOverview.save(info);
  269. } catch (Exception e) {
  270. e.printStackTrace();
  271. }
  272. }
  273. return resp;
  274. }
  275. /**
  276. * 查询机构认证信息
  277. * 参考文档:https://open.esign.cn/doc/opendoc/auth3/xxz4tc
  278. * 接口地址:https://{host}/v3/organizations/identity-info
  279. * 请求方法:GET
  280. * 注意事项:
  281. * 入参中orgId、orgName和orgIDCardNum三个参数只选择一个传入即可查询机构认证信息。
  282. * 查询优先级为 orgId > orgName > orgIDCardNum。
  283. *
  284. * @param orgId
  285. * @param orgName
  286. * @param orgIDCardNum
  287. * @param orgIDCardType 组织机构证件类型(传orgIDCardNum时,该参数为必传)
  288. * CRED_ORG_USCC - 统一社会信用代码 * CRED_ORG_REGCODE - 工商注册号
  289. * @param sourceId 来源id
  290. * @return
  291. * @throws EsignException
  292. */
  293. public static EsignHttpResponse getOrgIdentity_info(Context ctx, String orgId, String orgName, String orgIDCardNum, String orgIDCardType, String sourceId) throws EsignException, URISyntaxException {
  294. EsignConfigEnum configEnum = EsignConfigEnum.organizations_identity_info;
  295. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  296. if (StringUtils.isBlank(orgId) && StringUtils.isBlank(orgName)) {
  297. if (StringUtils.isNotBlank(orgIDCardNum) && StringUtils.isBlank(orgIDCardType)) {
  298. throw new EsignException("传orgIDCardNum时,orgIDCardType参数为必传");
  299. } else {
  300. throw new EsignException("orgId与orgName与orgIDCardNum不能都为空");
  301. }
  302. }
  303. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  304. if (StringUtils.isNotBlank(orgId)) {
  305. //uriBuilder.queryParam("orgId", orgId);
  306. uriBuilder.addParameter("orgId", orgId);
  307. }
  308. if (StringUtils.isNotBlank(orgIDCardNum) && StringUtils.isNotBlank(orgIDCardType)) {
  309. uriBuilder.addParameter("orgIDCardNum", orgIDCardNum);
  310. uriBuilder.addParameter("orgIDCardType", orgIDCardType);
  311. }
  312. URI uri =uriBuilder.build();
  313. apiaddr = uri.toString();
  314. if (StringUtils.isNotBlank(orgName)) {
  315. if (apiaddr.indexOf("?")>0){
  316. apiaddr+="&orgName="+orgName;
  317. }else {
  318. apiaddr+="?orgName="+orgName;
  319. }
  320. }
  321. return GET(ctx, apiaddr, null, sourceId, configEnum);
  322. }
  323. public static EsignHttpResponse getOrgIdentity_infoByOrgId(Context ctx, String orgId) throws EsignException, URISyntaxException {
  324. return getOrgIdentity_info(ctx, orgId, null, null, null, null);
  325. }
  326. public static EsignHttpResponse getOrgIdentity_infoByOrgName(Context ctx, String orgName) throws EsignException, URISyntaxException {
  327. return getOrgIdentity_info(ctx, null, orgName, null, null, null);
  328. }
  329. public static EsignHttpResponse getOrgIdentity_infoByOrgIDCardNum(Context ctx, String orgIDCardNum, String orgIDCardType) throws EsignException, URISyntaxException {
  330. return getOrgIdentity_info(ctx, null, null, orgIDCardNum, orgIDCardType, null);
  331. }
  332. /**
  333. * 查询个人认证信息
  334. * 参考文档:https://open.esign.cn/doc/opendoc/auth3/xxz4tc
  335. * 接口地址:https://{host}/v3/persons/identity-info
  336. * 请求方法:GET
  337. * 注意事项:
  338. * 入参中psnId、psnAccount和psnIDCardNum三个参数只选择一个传入即可查询个人的认证信息。
  339. * 查询优先级为 psnId > psnAccount > psnIDCardNum
  340. *
  341. * @param psnId
  342. * @param psnAccount
  343. * @param psnIDCardNum
  344. * @param psnIDCardType 个人证件号类型 (传psnIDCardNum时,证件类型为必传项)
  345. * CRED_PSN_CH_IDCARD - 中国大陆居民身份证
  346. * CRED_PSN_CH_HONGKONG - 香港来往大陆通行证
  347. * CRED_PSN_CH_MACAO - 澳门来往大陆通行证
  348. * CRED_PSN_CH_TWCARD - 台湾来往大陆通行证
  349. * CRED_PSN_PASSPORT - 护照
  350. * @param sourceId 来源id
  351. * @return
  352. * @throws EsignException
  353. */
  354. public static EsignHttpResponse getPersonIdentity_info(Context ctx, String psnId, String psnAccount, String psnIDCardNum, String psnIDCardType, String sourceId) throws EsignException, URISyntaxException {
  355. EsignConfigEnum configEnum = EsignConfigEnum.persons_identity_info;
  356. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  357. if (StringUtils.isBlank(psnId) && StringUtils.isBlank(psnAccount)) {
  358. if (StringUtils.isNotBlank(psnIDCardNum) && StringUtils.isBlank(psnIDCardType)) {
  359. throw new EsignException("传orgIDCardNum时,psnIDCardType参数为必传");
  360. } else {
  361. throw new EsignException("orgId与orgName与orgIDCardNum不能都为空");
  362. }
  363. }
  364. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  365. if (StringUtils.isNotBlank(psnId)) {
  366. uriBuilder.addParameter("psnId", psnId);
  367. }
  368. if (StringUtils.isNotBlank(psnAccount)) {
  369. uriBuilder.addParameter("psnAccount", psnAccount);
  370. }
  371. if (StringUtils.isNotBlank(psnIDCardNum) && StringUtils.isNotBlank(psnIDCardType)) {
  372. uriBuilder.addParameter("psnIDCardNum", psnIDCardNum);
  373. uriBuilder.addParameter("psnIDCardType", psnIDCardType);
  374. }
  375. URI uri = uriBuilder.build(); // 自动编码
  376. apiaddr = uri.toString();
  377. return GET(ctx, apiaddr, null, sourceId, configEnum);
  378. }
  379. public static EsignHttpResponse getPersonIdentity_infoByPsnId(Context ctx, String psnId) throws EsignException, URISyntaxException {
  380. return getPersonIdentity_info(ctx, psnId, null, null, null, null);
  381. }
  382. public static EsignHttpResponse getPersonIdentity_infoByPsnAccount(Context ctx, String psnAccount) throws EsignException, URISyntaxException {
  383. return getPersonIdentity_info(ctx, null, psnAccount, null, null, null);
  384. }
  385. public static EsignHttpResponse getPersonIdentity_infoByOrgIDCardNum(Context ctx, String psnIDCardNum, String psnIDCardType) throws EsignException, URISyntaxException {
  386. return getPersonIdentity_info(ctx, null, null, psnIDCardNum, psnIDCardType, null);
  387. }
  388. /**
  389. * 查询签署流程详情
  390. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/xxk4q6
  391. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/detail
  392. * 请求方法:GET
  393. * 注意事项:
  394. *
  395. * @param signFlowId 签署流程ID
  396. * @param sourceId 来源id
  397. * @return
  398. */
  399. public static EsignHttpResponse getSign_fields(Context ctx, String signFlowId, String sourceId) throws EsignException {
  400. EsignConfigEnum configEnum = EsignConfigEnum.detail_sign_fields;
  401. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  402. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  403. return GET(ctx, apiaddr, null, sourceId, configEnum);
  404. }
  405. public static EsignHttpResponse getSign_fields(Context ctx, String signFlowId) throws EsignException {
  406. return getSign_fields(ctx, signFlowId, null);
  407. }
  408. /**
  409. * 追加签署区
  410. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/ohzup7
  411. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/signers/sign-fields
  412. * 请求方法:POST
  413. * 注意事项:在追加一个签署区时,请确保流程在开启之前已添加了该签署区所在的待签署文件,参考【追加待签文件】;
  414. * 流程在“草稿”和“签署中”状态时,允许向流程中再追加签署区;
  415. * 【基于文件发起签署】时设置了自动完结(autoFinish为 true)的流程不支持再添加签署区。
  416. *
  417. * @param signFlowId 签署流程ID
  418. * @param json 添加签署方信息
  419. * @param sourceId 来源id
  420. * @return
  421. */
  422. public static EsignHttpResponse addSign_fields(Context ctx, String signFlowId, String json, String sourceId) throws EsignException {
  423. EsignConfigEnum configEnum = EsignConfigEnum.add_sign_fields;
  424. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  425. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  426. return POST(ctx, apiaddr, json, sourceId, configEnum);
  427. }
  428. /**
  429. * 删除签署区
  430. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/ohzup7
  431. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/signers/sign-fields
  432. * 请求方法:POST
  433. * 注意事项:在追加一个签署区时,请确保流程在开启之前已添加了该签署区所在的待签署文件,参考【追加待签文件】;
  434. * 流程在“草稿”和“签署中”状态时,允许向流程中再追加签署区;
  435. * 【基于文件发起签署】时设置了自动完结(autoFinish为 true)的流程不支持再添加签署区。
  436. *
  437. * @param signFlowId 签署流程ID
  438. * @param signFieldIds 添加签署方信息
  439. * @param sourceId 来源id
  440. * @return
  441. */
  442. public static EsignHttpResponse delSign_fields(Context ctx, String signFlowId, String signFieldIds, String sourceId) throws EsignException, URISyntaxException {
  443. EsignConfigEnum configEnum = EsignConfigEnum.del_sign_fields;
  444. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  445. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  446. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  447. if (StringUtils.isNotBlank(signFieldIds)) {
  448. uriBuilder.addParameter("signFieldIds", signFieldIds);
  449. }
  450. URI uri = uriBuilder.build(); // 自动编码
  451. apiaddr = uri.toString();
  452. return DELETE(ctx, apiaddr, null, sourceId, configEnum);
  453. }
  454. /**
  455. * 添加抄送方信息
  456. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/ohzup7
  457. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/signers/sign-fields
  458. * 请求方法:POST
  459. * 注意事项:
  460. * “抄送方”的概念:
  461. * 指不参与签署文件的机构或个人,可以进行查看签署流程中的签署文件以及附属材料等信息,当流程中的签署方全部完成签署,抄送方也会收到签署完成的通知。
  462. * 接口注意事项:
  463. * 自动完结的流程(autoFinish设置为true)不支持添加抄送方,否则将会报错:“自动归档流程开启后,不允许添加签署区”。
  464. * 添加的抄送方不可与流程中已有的抄送方重复。。
  465. *
  466. * @param signFlowId 签署流程ID
  467. * @param json 添加抄送方信息
  468. * @param sourceId 来源id
  469. * @return
  470. */
  471. public static EsignHttpResponse addCopiers(Context ctx, String signFlowId, String json, String sourceId) throws EsignException {
  472. EsignConfigEnum configEnum = EsignConfigEnum.add_copiers;
  473. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  474. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  475. return POST(ctx, apiaddr, json, sourceId, configEnum);
  476. }
  477. /**
  478. * 删除抄送方信息
  479. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/bdn9yt
  480. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/copiers/delete
  481. * <p>
  482. * 请求方法:POST
  483. * 注意事项:流程若已开启,将不支持再删除抄送方信息。
  484. *
  485. * @param signFlowId 签署流程ID
  486. * @param json 删除抄送方信息
  487. * @param sourceId 来源id
  488. * @return
  489. */
  490. public static EsignHttpResponse delCopiers(Context ctx, String signFlowId, String json, String sourceId) throws EsignException {
  491. EsignConfigEnum configEnum = EsignConfigEnum.del_copiers;
  492. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  493. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  494. return POST(ctx, apiaddr, json, sourceId, configEnum);
  495. }
  496. /**
  497. * 基于文件发起签署
  498. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/su5g42
  499. * 接口地址:https://{host}/v3/sign-flow/create-by-file
  500. * 请求方法:POST
  501. * 注意事项:
  502. * 1. 单个签署流程中对签署文件(docs)要求如下:
  503. * 单个签署流程中所添加的文件个数不可超过50个。
  504. * 单个文件大小不可超过50MB。
  505. * 单个文件内单页大小不可超过20MB(文件内含图片时,需特别关注单页大小)。
  506. * 单个签署流程中所添加的文件大小总和不可超过500MB。
  507. * 2. 单个签署流程中一次性添加的签署方(signers)不要超过10个,如果超过10个后续可以用《追加签署区》接口追加,整个流程不能超过50个签署方。
  508. * 3. 单个签署流程中所添加的签署区(signFields)总和不要超过300个。
  509. * 4. 单个签署流程中对附属材料(attachments)要求如下:
  510. * 单个签署流程中所添加的附件个数不可超过50个。
  511. * 单个附件大小不可超过10MB。
  512. * 5. autoStart自动开启签署流程,默认值 true
  513. * true - 自动开启(发起签署流程,将直接进入“签署中”状态)
  514. * false - 非自动开启(发起“草稿”状态的签署流程,需调用【开启签署流程】接口后流程进入“签署中”状态)
  515. * 补充说明: 自动开启的流程不允许再追加待签署文件,点击这里了解更多流程状态说明。
  516. *
  517. * @param ctx 上下文
  518. * @param personId 签署员工id
  519. * @param fileName 签署文件名称
  520. * @param operatorId 操作人
  521. * @param efileId 发起单据id
  522. * @param json 签署信息
  523. * @return
  524. */
  525. public static EsignHttpResponse create_by_file(Context ctx, String personId, String fileName, String operatorId, String efileId,
  526. String json) throws BOSException {
  527. EsignHttpResponse resp = create_by_file(ctx, personId, fileName, operatorId, efileId, EsignStatusEnum.SIGNING, json);
  528. return resp;
  529. }
  530. public static EsignHttpResponse create_by_file(Context ctx, String personId, String fileName, String operatorId, String efileId,
  531. EsignStatusEnum esignStatus,
  532. String json) throws BOSException {
  533. EsignConfigEnum configEnum = EsignConfigEnum.create_by_file;
  534. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  535. EsignHttpResponse resp = new EsignHttpResponse();
  536. resp.setStatus(500);
  537. /**
  538. * 发起签署前需要新增电子签全域状态总览表
  539. */
  540. IESignGlobalStatusOverview globalStatusOverview = ESignGlobalStatusOverviewFactory.getLocalInstance(ctx);
  541. ESignGlobalStatusOverviewInfo info = new ESignGlobalStatusOverviewInfo();
  542. // try {
  543. // String str = "select fid from CT_ESI_ESGSO where cfefileId=?";
  544. // IRowSet rs = DbUtil.executeQuery(ctx, str, new Object[]{efileId});
  545. // if (rs.next()) {
  546. // String fid = rs.getString("fid");
  547. // info = globalStatusOverview.getESignGlobalStatusOverviewInfo(new ObjectUuidPK(fid));
  548. // }
  549. // } catch (SQLException | EASBizException e) {
  550. // e.printStackTrace();
  551. // }
  552. info.setEsignStatus(EsignStatusEnum.DRAFT);
  553. info.setSendStatus(SendStatusEnum.FAILURE);
  554. if (StringUtils.isNotBlank(personId)) {
  555. PersonInfo personInfo = new PersonInfo();
  556. personInfo.setId(BOSUuid.read(personId));
  557. info.setPerson(personInfo);
  558. }
  559. if (StringUtils.isNotBlank(operatorId)) {
  560. PersonInfo operator = new PersonInfo();
  561. operator.setId(BOSUuid.read(operatorId));
  562. info.setOperator(operator);
  563. }
  564. info.setFileName(fileName);
  565. StringBuilder cum = new StringBuilder();
  566. info.setEfileId(efileId);
  567. JSONObject jsonObject = JSON.parseObject(json);
  568. if(null!=jsonObject) {
  569. JSONArray participants = jsonObject.getJSONArray("participants");
  570. if (null!=participants){
  571. for(int i=0;i<participants.size();i++ ){
  572. JSONObject participant = participants.getJSONObject(i);
  573. String participantFlag = participant.getString("participantFlag");
  574. JSONObject orgParticipant = participant.getJSONObject("orgParticipant");
  575. if(null!=orgParticipant) {
  576. String orgName = orgParticipant.getString("orgName");
  577. JSONObject transactor=orgParticipant.getJSONObject("transactor");
  578. if(null!=transactor) {
  579. String psnAccount = orgParticipant.getString("transactorPsnAccount");
  580. String transactorName = orgParticipant.getString("transactorName");
  581. cum.append(participantFlag + ":" + transactorName + "(" + psnAccount + ");");
  582. }
  583. }
  584. JSONObject psnParticipant = participant.getJSONObject("psnParticipant");
  585. if(null!=psnParticipant) {
  586. String psnName = psnParticipant.getString("psnName");
  587. String psnAccount = psnParticipant.getString("psnAccount");
  588. cum.append(participantFlag+":"+psnName+"("+psnAccount+");");
  589. }
  590. }
  591. info.setDescription(cum.toString());
  592. }
  593. }
  594. info.setRequestParams(json);
  595. info.setEsignName(configEnum);
  596. try {
  597. resp = POST(ctx, apiaddr, json, efileId, configEnum);
  598. if (resp.getStatus() >= 200 && resp.getStatus() < 300) {
  599. JSONObject object = JSON.parseObject(resp.getBody());
  600. if ("0".equals(String.valueOf(object.get("code")))) {
  601. JSONObject data = object.getJSONObject("data");
  602. info.setSignFlowId(data.getString("signFlowId"));
  603. info.setSendStatus(SendStatusEnum.SUCCESS);
  604. info.setEsignStatus(esignStatus);
  605. }
  606. }
  607. info.setSourceBillId(resp.getLogId());
  608. } catch (Exception e) {
  609. e.printStackTrace();
  610. info.setSendStatus(SendStatusEnum.FAILURE);
  611. } finally {
  612. try {
  613. globalStatusOverview.save(info);
  614. } catch (Exception e) {
  615. e.printStackTrace();
  616. }
  617. }
  618. return resp;
  619. }
  620. /**
  621. * 开启签署流程
  622. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/bdn9yt
  623. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/start
  624. * <p>
  625. * 请求方法:POST
  626. * 注意事项:流程若已开启,将不支持再删除抄送方信息。
  627. *
  628. * @param signFlowId 签署流程ID
  629. * @param sourceId 来源id
  630. * @return
  631. */
  632. public static EsignHttpResponse start_by_file(Context ctx, String signFlowId, String sourceId) throws EsignException {
  633. EsignConfigEnum configEnum = EsignConfigEnum.start_by_file;
  634. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  635. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  636. return POST(ctx, apiaddr, null, sourceId, configEnum);
  637. }
  638. /**
  639. * 撤销签署流程
  640. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/klbicu
  641. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/revoke
  642. * <p>
  643. * 请求方法:POST
  644. * 注意事项:撤销签署中的流程,撤销后签署流程将终止,变为已撤销状态。
  645. *
  646. * @param signFlowId 签署流程ID
  647. * @param revokeReason 撤销原因 撤销原因最多50字
  648. * @param sourceId 来源id
  649. * @return
  650. */
  651. public static EsignHttpResponse revoke_by_file(Context ctx, String signFlowId, String revokeReason, String sourceId) throws EsignException {
  652. EsignConfigEnum configEnum = EsignConfigEnum.revoke_by_file;
  653. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  654. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  655. Map<String, String> jsonMap = Maps.newHashMap();
  656. jsonMap.put("revokeReason", (StringUtils.isNotBlank(revokeReason) ? revokeReason : ""));
  657. String json = JSON.toJSONString(jsonMap);
  658. return POST(ctx, apiaddr, json, sourceId, configEnum);
  659. }
  660. /**
  661. * 催签流程中签署人
  662. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/yws940
  663. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/urge
  664. * 请求方法:POST
  665. * 【注意事项】
  666. * 发起签署之后的前半小时不可进行催签;
  667. * 与上一次催签,请至少间隔十分钟再发起下一次催签提醒。
  668. *
  669. * @param signFlowId 签署流程ID
  670. * @param json 催签的签署人信息
  671. * @param sourceId 来源id
  672. * @return
  673. */
  674. public static EsignHttpResponse urge_by_file(Context ctx, String signFlowId, String json, String sourceId) throws EsignException {
  675. EsignConfigEnum configEnum = EsignConfigEnum.urge_by_file;
  676. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  677. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  678. return POST(ctx, apiaddr, json, sourceId, configEnum);
  679. }
  680. /**
  681. * 下载已签署文件及附属材料
  682. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/kczf8g
  683. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/file-download-url
  684. * 请求方法:GET
  685. * 【注意事项】
  686. * 未签署完成的流程,无法下载相关文件,否则会报错:"流程非签署完成状态,不允许下载文档"。
  687. *
  688. * @param signFlowId 签署流程ID
  689. * @param urlAvailableDate 下载链接有效期,单位:秒。默认:3600秒(60分钟)
  690. * 可传入:1-3600
  691. * 补充说明:
  692. * 为链接设置有效期是一项安全措施,旨在降低因无关人员访问而导致的信息泄露风险。
  693. * @param sourceId 来源id
  694. * @return
  695. */
  696. public static EsignHttpResponse getFile_download_url(Context ctx, String signFlowId, Integer urlAvailableDate, String sourceId) throws EsignException, URISyntaxException {
  697. EsignConfigEnum configEnum = EsignConfigEnum.file_download_url;
  698. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  699. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  700. if (null != urlAvailableDate && urlAvailableDate > 0 && urlAvailableDate <= 3600) {
  701. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  702. uriBuilder.addParameter("urlAvailableDate", String.valueOf(urlAvailableDate));
  703. URI uri = uriBuilder.build(); // 自动编码
  704. apiaddr = uri.toString();
  705. }
  706. return GET(ctx, apiaddr, null, sourceId, configEnum);
  707. }
  708. /**
  709. * 下载签署中文件
  710. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/gkgc4729sa67upfn
  711. * 接口地址:https://{host}/v3/sign-flow/{signFlowId}/preview-file-download-url
  712. * 请求方法:GET
  713. * 【注意事项】
  714. * 通过该接口可以下载流程正在签署中的文件进行预览查看,用于开发者内部系统展示合同内容。本接口下载的文件因为是过程中文件所以不支持验签和出证,并且文件中会带有“本文档仅供预览查看”的水印字样。
  715. *
  716. * @param signFlowId 签署流程ID
  717. * @param docFileId 本次签署流程中的文件ID【注】仅支持签署文件,不支持附件
  718. * 可传入:1-3600
  719. * 补充说明:
  720. * 为链接设置有效期是一项安全措施,旨在降低因无关人员访问而导致的信息泄露风险。
  721. * @param sourceId 来源id
  722. * @return
  723. */
  724. public static EsignHttpResponse getPreview_file_download_url(Context ctx, String signFlowId, String docFileId, String sourceId) throws EsignException, URISyntaxException {
  725. EsignConfigEnum configEnum = EsignConfigEnum.preview_file_download_url;
  726. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  727. apiaddr = MessageFormat.format(apiaddr, signFlowId);
  728. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  729. uriBuilder.addParameter("docFileId", docFileId);
  730. URI uri = uriBuilder.build(); // 自动编码
  731. apiaddr = uri.toString();
  732. return GET(ctx, apiaddr, null, sourceId, configEnum);
  733. }
  734. /**
  735. * 查询企业内部印章
  736. * 参考文档:https://open.esign.cn/doc/opendoc/seal3/ups6h1
  737. * 接口地址:https://{host}/v3/seals/org-own-seal-list?orgId=xx&pageNum=1&pageSize=20
  738. * 请求方法:GET
  739. * 【注意事项】
  740. * 查询 orgId (机构企业)名下自身创建的内部自有企业印章,包括印章的编号、名称、状态、印章业务类型、印章图片下载地址等信息。
  741. *
  742. * @param orgId 机构账号ID 【注】用户在e签宝注册实名后才有账号ID,账号ID获取方式请使用【查询机构认证信息】接口通过组织机构名称/组织机构证件号进行查询
  743. * @param pageNum 查询页码
  744. * @param pageSize 每页显示的数量,最大值:20
  745. * @param sealBizTypes 印章业务类型(多项可使用英文逗号分隔)
  746. * PUBLIC - 公章
  747. * CONTRACT - 合同专用章
  748. * FINANCE - 财务专用章
  749. * PERSONNEL - 人事专用章
  750. * LEGAL_PERSON - 法定代表人章
  751. * OMMON - 其他
  752. * @param revocationSeal 是否需要查询已吊销印章,默认不查询 【注】曾经有用印记录的印章删除后即为已吊销状态
  753. * false - 不查询已吊销印章
  754. * ture - 查询已吊销印章
  755. * @param sourceId 来源id
  756. * @return
  757. */
  758. public static EsignHttpResponse getOrg_own_seal_list(Context ctx, String orgId,
  759. Integer pageNum, Integer pageSize,
  760. String sealBizTypes, Boolean revocationSeal,
  761. String sourceId
  762. ) throws EsignException, URISyntaxException {
  763. EsignConfigEnum configEnum = EsignConfigEnum.org_own_seal_list;
  764. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  765. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  766. uriBuilder.addParameter("orgId", orgId);
  767. if(pageNum<0) {
  768. uriBuilder.addParameter("pageNum", String.valueOf(1));
  769. }else {
  770. uriBuilder.addParameter("pageNum", String.valueOf(pageNum));
  771. }
  772. if(pageSize<=0) {
  773. uriBuilder.addParameter("pageSize", String.valueOf(1));
  774. }else if(pageSize>20){
  775. uriBuilder.addParameter("pageSize", String.valueOf(20));
  776. }else {
  777. uriBuilder.addParameter("pageSize", String.valueOf(pageSize));
  778. }
  779. if(StringUtils.isNotBlank(sealBizTypes)){
  780. uriBuilder.addParameter("sealBizTypes", sealBizTypes);
  781. }
  782. if(null!=revocationSeal){
  783. uriBuilder.addParameter("revocationSeal", revocationSeal.toString());
  784. }
  785. URI uri = uriBuilder.build(); // 自动编码
  786. apiaddr = uri.toString();
  787. return GET(ctx, apiaddr, null, sourceId, configEnum);
  788. }
  789. /**
  790. * 查询文件上传状态
  791. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/qz4aip
  792. * 接口地址:https://{host}/v3/files/{fileId}
  793. * @param ctx
  794. * @param fileId
  795. * @param sourceId
  796. * 请求方法:GET
  797. */
  798. public static EsignHttpResponse getFileStatus(Context ctx,String fileId, String sourceId) throws EsignException {
  799. EsignConfigEnum configEnum = EsignConfigEnum.getFilesState;
  800. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  801. apiaddr = MessageFormat.format(apiaddr, fileId);
  802. //发起接口请求
  803. return GET(ctx, apiaddr, null, sourceId, configEnum);
  804. }
  805. /**
  806. * 检索文件关键字坐标
  807. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/ze0ahv
  808. * 接口地址:https://{host}/v3/files/{fileId}/keyword-positions
  809. * @param ctx
  810. * @param fileId
  811. * @param keywords
  812. * @param sourceId
  813. * 请求方法:GET
  814. */
  815. public static EsignHttpResponse keyword_positions(Context ctx,String fileId, List<String> keywords, String sourceId) throws EsignException {
  816. EsignConfigEnum configEnum = EsignConfigEnum.keyword_positions;
  817. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  818. apiaddr = MessageFormat.format(apiaddr, fileId);
  819. Map<String,List<String>> jsonMap = Maps.newHashMap();
  820. jsonMap.put("keywords",keywords);
  821. String json = JSON.toJSONString(jsonMap);
  822. //发起接口请求
  823. return POST(ctx, apiaddr, json, sourceId, configEnum);
  824. }
  825. /**
  826. * 获取拖章定位页面
  827. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/gw0r0w5qb5cx2ft6
  828. * 接口地址:https://{host}/v3/files/get-seal-position-url
  829. * @param ctx
  830. * @param fileId
  831. * @param signerRoles
  832. * @param sourceId
  833. * 请求方法:POST
  834. */
  835. public static EsignHttpResponse get_seal_position_url(Context ctx,String fileId,List<String> signerRoles, String sourceId) throws EsignException {
  836. EsignConfigEnum configEnum = EsignConfigEnum.get_seal_position_url;
  837. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  838. apiaddr = MessageFormat.format(apiaddr, fileId);
  839. Map<String,Object> jsonMap = Maps.newHashMap();
  840. jsonMap.put("customBizNum",System.currentTimeMillis());
  841. jsonMap.put("fileId",fileId);
  842. jsonMap.put("signerRoles",signerRoles);
  843. jsonMap.put("clientType","ALL");
  844. jsonMap.put("redirectUrl",EsignConfig.getInstance().get(EsignConfigEnum.NOTIFYURL_VALUE));
  845. String json = JSON.toJSONString(jsonMap);
  846. //发起接口请求
  847. return POST(ctx, apiaddr, json, sourceId, configEnum);
  848. }
  849. /**
  850. * 查询签署流程列表
  851. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/kq4b2e
  852. * 接口地址:https://{host}/v3/sign-flow/sign-flow-list
  853. * @param ctx
  854. * @param jsonMap
  855. * @param sourceId
  856. * 请求方法:GET
  857. */
  858. public static EsignHttpResponse sign_flow_list(Context ctx, Map<String,Object> jsonMap, String sourceId) throws EsignException {
  859. EsignConfigEnum configEnum = EsignConfigEnum.sign_flow_list;
  860. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  861. String json = JSON.toJSONString(jsonMap);
  862. //发起接口请求
  863. return POST(ctx, apiaddr, json, sourceId, configEnum);
  864. }
  865. /**
  866. * 查询流程模板详情
  867. * 参考文档:https://open.esign.cn/doc/opendoc/pdf-sign3/kq4b2e
  868. * 接口地址:https://{host}/v3/sign-templates/detail
  869. * @param ctx
  870. * @param signTemplateId
  871. * @param orgId
  872. * @param queryComponents
  873. * @param sourceId
  874. * 请求方法:GET
  875. */
  876. public static EsignHttpResponse getSign_templates_detail(Context ctx, String signTemplateId,String orgId,Boolean queryComponents, String sourceId) throws EsignException, URISyntaxException {
  877. EsignConfigEnum configEnum = EsignConfigEnum.sign_templates_detail;
  878. String apiaddr = EsignConfig.getInstance().get(configEnum.getValue());
  879. URIBuilder uriBuilder = new URIBuilder(apiaddr);
  880. uriBuilder.addParameter("signTemplateId", signTemplateId);
  881. uriBuilder.addParameter("orgId", orgId);
  882. if(null!=queryComponents) {
  883. uriBuilder.addParameter("queryComponents", queryComponents.toString());
  884. }
  885. URI uri = uriBuilder.build(); // 自动编码
  886. apiaddr = uri.toString();
  887. //发起接口请求
  888. return GET(ctx, apiaddr, null, sourceId, configEnum);
  889. }
  890. }