package com.doumee.service.business.third; import cn.emay.sdk.client.SmsSDKClient; import cn.emay.sdk.util.exception.SDKParamsException; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.utils.Constants; import com.doumee.dao.business.model.InterfaceLog; import com.doumee.service.business.InterfaceLogService; import com.jzq.JzqHttpApiTool; import com.jzq.common.ResultInfo; import com.jzq.common.bean.sign.SignatoryReq; import com.jzq.common.http.HttpClientUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URL; import java.util.Date; import java.util.IdentityHashMap; import java.util.Map; import java.util.UUID; /** * * * @author yfx * @title 用于jzq的api服请求 */ @Slf4j @Service public class SignService { /** * 君子签测试环境key和接口地址: * appKey:dcb4bd535a09df3c * appSecret:b87c346edcb4bd535a09df3ca8c45d9a * services_url:https://api.sandbox.junziqian.com * 开发文档: https://s.junziqian.com/api_doc/index.html */ private static String SERVICE_URL="https://api.sandbox.junziqian.com"; private static String APP_KEY="dcb4bd535a09df3c"; private static String APP_SECRET="b87c346edcb4bd535a09df3ca8c45d9a"; @Autowired private SystemDictDataBiz systemDictDataBiz; @PostConstruct//启动初始化 public int initClient(){ SERVICE_URL = systemDictDataBiz.queryByCode(Constants.SIGN,Constants.SIGN_URL).getCode(); APP_KEY = systemDictDataBiz.queryByCode(Constants.SIGN,Constants.SIGN_APPKEY).getCode(); APP_SECRET = systemDictDataBiz.queryByCode(Constants.SIGN,Constants.SIGN_APPSECRET).getCode(); initParams(); return 0; } //请求的body内参数 private static Map bodyParams; @Autowired public InterfaceLogService interfaceLogService = null; private void saveInterfaceLog(String path,String name,String req ,String res) { if(interfaceLogService !=null){ InterfaceLog hkMonitoryLogDO=new InterfaceLog(); hkMonitoryLogDO.setType(0); hkMonitoryLogDO.setCreateDate(new Date()); hkMonitoryLogDO.setIsdeleted(0); hkMonitoryLogDO.setRequest(req); hkMonitoryLogDO.setRepose(res); hkMonitoryLogDO.setName(name); hkMonitoryLogDO.setUrl(path); interfaceLogService.create(hkMonitoryLogDO); } } public void initParams(){ long ts=System.currentTimeMillis()/1000; String nonce=DigestUtils.md5Hex(System.currentTimeMillis()+""); String sign=DigestUtils.sha256Hex("nonce"+nonce+"ts"+ts+"app_key"+APP_KEY+"app_secret"+APP_SECRET); bodyParams=new IdentityHashMap<>(); bodyParams.put("ts",System.currentTimeMillis()/1000); bodyParams.put("app_key",APP_KEY); bodyParams.put("sign",sign); bodyParams.put("nonce",nonce);//这只只是为了生成一个随机值 } /** * 1.ping服务 */ public boolean ping(){ try { Map params=bodyParams; String url=SERVICE_URL+"/v2/ping"; //所有参数装入了body中 String str= HttpClientUtils.init().getPost(url,null,params,false); log.info("返回结果为:"+str); ResultInfo ri= JSONObject.parseObject(str,ResultInfo.class); saveInterfaceLog(url,"【电子签】ping服务",JSONObject.toJSONString(params),str); return ri.isSuccess(); }catch (Exception e){ } return false; } /** * 发起企业认证申请 * @param fullname * @param creditCode * @param legalName * @param email * @param businessimgPath * @param notifyUrl * @return */ public boolean organizationCreate (String fullname,String creditCode,String legalName,String email,String businessimgPath, String notifyUrl){ try { initParams(); File businessimg =netFileToLoclFile(businessimgPath); if(businessimg == null || !businessimg.isFile() || !businessimg.exists()){ return false; } Map params=bodyParams; String url=SERVICE_URL+"/v2/user/organizationCreate"; params.put("name",fullname); params.put("identificationType",1); params.put("organizationRegNo",creditCode); params.put("organizationType",0); params.put("organizationCode",creditCode); params.put("organizationRegImg",businessimg); params.put("notifyUrl",notifyUrl); params.put("legalName",legalName); params.put("emailOrMobile",email); String str= HttpClientUtils.init().getPost(url,null,params,true); businessimg.delete(); saveInterfaceLog(url,"【电子签】发起企业认证申请",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return true; } System.out.println(str); }catch (Exception e){ e.printStackTrace(); } return false; } /** *重新发起企业认证申请 * @param fullname * @param creditCode * @param legalName * @param email * @param businessimgPath * @param notifyUrl * @return */ public boolean organizationReApply(String fullname,String creditCode,String legalName,String email,String businessimgPath,String notifyUrl){ try { File businessimg = new File(new URI(businessimgPath)); if(businessimg == null|| !businessimg.isFile() || !businessimg.exists()){ return false ; } initParams(); Map params=bodyParams; String url=SERVICE_URL+"/v2/user/organizationReapply"; params.put("name",fullname); params.put("identificationType",1); params.put("organizationRegNo",creditCode); params.put("organizationType",0); params.put("organizationCode",creditCode); params.put("organizationRegImg",businessimg); params.put("notifyUrl",notifyUrl); params.put("legalName",legalName); params.put("emailOrMobile",email); String str= HttpClientUtils.init().getPost(url,null,params,true); businessimg.delete(); saveInterfaceLog(url,"【电子签】重新发起企业认证申请",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return true; } System.out.println(str); }catch (Exception e){ e.printStackTrace(); } return false; } /** * 网络文件转本地临时文件 * @param fileUrl * @return */ public static File netFileToLoclFile(String fileUrl) { try { URL url = new URL(fileUrl); InputStream inputStream = url.openConnection().getInputStream(); File file = File.createTempFile( "temp",""+UUID.randomUUID().toString()+fileUrl.substring(fileUrl.lastIndexOf("."))); // 指定保存到本地的文件名及路径 OutputStream outputStream = new FileOutputStream(file); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); return file; }catch (Exception e){ } return null; } /** * 查询企业签约状态 审核状态,0正在申请1通过2驳回 * @param email * @return */ public int organizationAuditStatus (String email){ try { initParams(); Map params=bodyParams; String url=SERVICE_URL+"/v2/user/organizationAuditStatus"; params.put("emailOrMobile",email); String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】查询企业签约状态",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getJSONObject("data").getIntValue("status"); } }catch (Exception e){ e.printStackTrace(); } return -1;//查询失败 } /** * 发起签约 * @param name * @param fileUrl * @param fullname * @param creditCoe * @param email * @param postionJson */ public String applySign(String name,String fileUrl,String fullname,String creditCoe,String email,String postionJson,String singId,String notifyUrl){ try { initParams(); String url=SERVICE_URL+"/v2/sign/applySign"; Map params=bodyParams; params.put("contractName",name); //合同名称 params.put("serverCa",1); //使用云证书 // params.put("file",file); params.put("url",fileUrl); params.put("dealType",5); //指定合同文件签署方式 5 为部分自动签 // params.put("positionType",2); //指定通过表单域方式设置签字位置 params.put("positionType",0); //指定公章位置类型:0或null使用签字座标位置或不指定签字位置;1表单域定位(表单域如果上传为pdf时,需pdf自行定义好表单域,html及url及tmpl等需定义好input标签);2关键字定义 params.put("fileType",1); params.put("needQifengSign",1); params.put("notifyUrl",notifyUrl); JSONArray signatories=new JSONArray(); SignatoryReq sReq=new SignatoryReq(); sReq.setFullName(fullname); //企业姓名 sReq.setIdentityType(11); //证件类型 sReq.setIdentityCard(creditCoe);//营业执照号 sReq.setEmail(email); //在君子签注册认证的邮箱 // sReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.12,\"offsetY\":0.23}]},{\"page\":1,\"chaptes\":[{\"offsetX\":0.45,\"offsetY\":0.67}]}]"); // sReq.setChapteJson(postionJson);//表单域定位 对应positionType=1 // sReq.setSearchKey(postionJson);//关键字 对应positionType=2 sReq.setSignId(singId); sReq.setNoNeedVerify(1); signatories.add(sReq); params.put("signatories",signatories.toJSONString()); System.out.println("================"+JSONObject.toJSONString(params)); String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】发起签约",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getString("data"); } }catch (Exception e){ } return null; } /** * 发起签约 * @param name * @param file * @param creditCoe * @param email * @param postionJson */ public String applySignLocalFile(String name,String fullname,String file,String creditCoe,String email,String postionJson,String singId,String notifyUrl){ try { initParams(); String url=SERVICE_URL+"/v2/sign/applySign"; Map params=bodyParams; params.put("contractName",name); //合同名称 params.put("serverCa",1); //使用云证书 params.put("file",new File(file)); params.put("dealType",5); //指定合同文件签署方式 5 为部分自动签 params.put("positionType",0); //指定通过表单域方式设置签字位置 params.put("fileType",0); params.put("needQifengSign",1); params.put("notifyUrl",notifyUrl); JSONArray signatories=new JSONArray(); SignatoryReq sReq=new SignatoryReq(); sReq.setFullName(fullname); //企业姓名 sReq.setIdentityType(11); //证件类型 sReq.setIdentityCard(creditCoe);//营业执照号 sReq.setEmail(email); //在君子签注册认证的邮箱 // sReq.setChapteJson("[{\"page\":0,\"chaptes\":[{\"offsetX\":0.12,\"offsetY\":0.23}]},{\"page\":1,\"chaptes\":[{\"offsetX\":0.45,\"offsetY\":0.67}]}]"); // sReq.setChapteJson(postionJson); // sReq.setSearchKey(postionJson); sReq.setSignId(singId); sReq.setSearchConvertExtend("{\"fixX\":-80,\"fixY\":-80}"); sReq.setNoNeedVerify(1); signatories.add(sReq); params.put("signatories",signatories.toJSONString()); System.out.println(signatories.toJSONString()); String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】发起签约",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getString("data"); } }catch (Exception e){ } return null; } /** * 获取签署链接地址(签署页面地址) * @param applyNo * @param name * @param creditCode */ public String signLink(String applyNo,String name,String creditCode) { try { //延迟2秒 // Thread.sleep(2*1000); initParams(); Map params = bodyParams; String url = SERVICE_URL + "/v2/sign/link"; params.put("applyNo",applyNo); //发起合同签署接口返回的APL编号 params.put("fullName",name); //发起合同签署接口需要手动签署对象的姓名 params.put("identityCard",creditCode); //发起合同签署接口中需要手动签署对象的证件号 params.put("identityType",11); //证件类型,个人1 ,企业11 String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】获取签署链接地址",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getString("data"); } }catch (Exception e){ e.printStackTrace(); } return null; } /** * 获取签署链接地址(返回文件地址,签署后才是文件地址,否则跳转到签署页面) * @param applyNo */ public String linkFileStatus(String applyNo) { try { initParams(); Map params = bodyParams; String url = SERVICE_URL + "/v2/sign/status"; //构建请求参数 params.put("applyNo",applyNo); //发起合同签署接口返回的APL编号 // params.put("fullName",fullName); //签约人名称 // params.put("identityCard",identityCard); //签约人证件号 // params.put("identityType",12); //证件类型 1身份证, 2护照, 3台胞证, 4港澳居民来往内地通行证, 11营业执照, 12统一社会信用代码, 20子账号, 99其他 String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】签约状态查询",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ //0 :未签 1 :已签 2:拒签 3:已保全 return json.getString("data"); } }catch (Exception e){ e.printStackTrace(); } return null; } /** * 获取签署链接地址(返回文件地址,签署后才是文件地址,否则跳转到签署页面) * @param applyNo */ public String linkFile(String applyNo) { try { initParams(); Map params = bodyParams; String url = SERVICE_URL + "/v2/sign/linkFile"; //构建请求参数 params.put("applyNo",applyNo); //发起合同签署接口返回的APL编号 String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】获取签署链接地址",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getString("data"); } }catch (Exception e){ e.printStackTrace(); } return null; } /** * 上传企业自定义印章(返回印章ID) * @param signName * @param path */ public String uploadEntSign(String signName,String path,String email ) { try { initParams(); File signImgFile =netFileToLoclFile(path); Map params = bodyParams; String url = SERVICE_URL + "/v2/user/uploadEntSign"; //构建请求参数 params.put("signName",signName); params.put("signImgFile",signImgFile); params.put("email",email); String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】上传企业自定义印章",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getString("data"); } }catch (Exception e){ e.printStackTrace(); } return null; } /** * 删除企业自定义印章 * @param signId */ public boolean deleteEntSign(String signId ) { try { initParams(); Map params = bodyParams; String url = SERVICE_URL + "/v2/user/deleteEntSign"; //构建请求参数 params.put("signId",signId); String str= HttpClientUtils.init().getPost(url,null,params,true); System.out.println(str); saveInterfaceLog(url,"【电子签】删除企业自定义印章",JSONObject.toJSONString(params),str); JSONObject json = JSONObject.parseObject(str); if(json!=null && json.getBoolean("success")){ return json.getBoolean("success"); } }catch (Exception e){ e.printStackTrace(); } return false; } }