第一步:
maven 打包:fadada_api_sdk.jar 打成maven包
win 环境下,检查自己java环境和maven环境
具体配置maven环境见:https://jingyan.baidu.com/article/acf728fd68b4bef8e510a31c.html
准备就需后,在控制台输入命令mvn install:install-file -Dfile=C:\Users\Administrator\Desktop\fadada_api_sdk.jar -DgroupId=QRCode -DartifactId=fadada-api-sdk -Dversion=4.0 -Dpackaging=jar -DgeneratePom=true。
控制台执行成功后:pmo.xml 引入
<dependency>
<groupId>com.fadada</groupId>
<artifactId>fadada-api-sdk</artifactId>
<version>4.0.0</version>
</dependency>
注意jar网络请求会用到jar包:pmo.xml 引入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.9</version>
</dependency>
2.开始编写util类:
package com.xuejifen.common.utils.fadada;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fadada.sdk.client.FddClientBase;
import com.fadada.sdk.client.FddClientExtra;
import com.fadada.sdk.client.authForfadada.ApplyCert;
import com.fadada.sdk.client.authForfadada.FindCertInfo;
import com.fadada.sdk.client.authForfadada.GetCompanyVerifyUrl;
import com.fadada.sdk.client.authForfadada.GetPersonVerifyUrl;
import com.fadada.sdk.client.authForfadada.model.AgentInfoINO;
import com.fadada.sdk.client.authForfadada.model.BankInfoINO;
import com.fadada.sdk.client.authForfadada.model.CompanyInfoINO;
import com.fadada.sdk.client.authForfadada.model.LegalInfoINO;
import com.fadada.sdk.client.request.ExtsignReq;
import com.google.common.collect.Maps;
import com.xuejifen.common.config.Global;
import com.xuejifen.common.utils.GsonUtil;
import com.xuejifen.common.utils.StringUtils;
import com.xuejifen.modules.dict.fadada.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Map;
/**
* @author: raoBo
* @date: 2020/8/17 10:53
* @desc: 法大大工具类
* @version: 1.0
*/
@Slf4j
public class FadadaUtil {
private String APP_ID ;
private String APP_SECRET;
private String V;
private String HOST;
private String COMPANY_CODE;
/***
* 获取配置信息
*/
public FadadaUtil(){
this.APP_ID = Global.getConfig("fadada.app.id");
this.APP_SECRET = Global.getConfig("fadada.app.secret");
this.V = Global.getConfig("fadada.app.edition");
this.HOST = Global.getConfig("fadada.app.baseUrl");
this.COMPANY_CODE = Global.getConfig("adada.company.code");
}
/**
* 法大大注册用户
* @return 有值成功,null 失败
*/
public String regAccount(String open_id, AccountType accountType){
log.info("----法大大注册用户(regAccount)----{},{}",open_id,accountType.getMsg());
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String result = base.invokeregisterAccount(open_id,accountType.getValue());
log.info("----法大大注册用户(regAccount)----返回数据:{}",result);
JSONObject jsonObject = JSON.parseObject(result);
String data = jsonObject.getString("data");
if (StringUtils.isBlank(data)){
log.info("----法大大注册用户(regAccount)----注册法大大失败:{}",jsonObject.getString("msg"));
return null;
}
log.info("----法大大注册用户(regAccount)----注册法大大成功:{}",data);
return data;
}catch (Exception e){
e.printStackTrace();
log.error("---regAccount---注册法大大用户报错:{}",e.getMessage());
}
return null;
}
/**
* url内容处理
* @return
*/
private String decode(String bizContent) {
try {
bizContent = URLDecoder.decode(bizContent, "utf-8");
bizContent = new String(Base64.decodeBase64(bizContent.getBytes()));
} catch (UnsupportedEncodingException e) {
return "";
}
return bizContent;
}
/**
* 获取个人实名认证地址 TODO 返回数据处理
* @param customer_id 用户主id
* @param verifiedWay 实名认证套餐类型
* @param pageModify 是否允许用户页面修改
* @param notify_url 回调地址 TODO 接口未做
* @param return_url 同步通知url
* @param customer_name 姓名
* @param customerIdentType 证件类型
* @param customer_ident_no 证件号码
* @param mobile 手机号码
* @return
*/
public Map<String,Object> getAuthPersonUrl(String customer_id, VerifiedWay verifiedWay, PageModify pageModify,String notify_url,
String return_url,String customer_name,CustomerIdentType customerIdentType,String customer_ident_no,String mobile,OptionDict optionDict){
log.info("---getAuthPersonUrl---开始获取个人实名认证地址");
Map<String,Object> map = Maps.newHashMap();
try {
GetPersonVerifyUrl personverify = new GetPersonVerifyUrl(APP_ID,APP_SECRET,V,HOST);
String verifyed_way = verifiedWay.getValue();
String page_modify = pageModify.getValue();
String customer_ident_type = customerIdentType.getValue();
String result = personverify.invokePersonVerifyUrl(customer_id,verifyed_way,
page_modify,notify_url,return_url,customer_name,customer_ident_type,
customer_ident_no,mobile,null,"2","1",
"0",null,optionDict.getValue(),"0");
System.out.println(result);
log.info("---个人实名认证信息传递getAuthPersonUrl---返回数据:{}",result);
JSONObject jsonObject = JSON.parseObject(result);
String data = jsonObject.getString("data");
if (StringUtils.isBlank(data)){
map.put("success",false);
log.error("---getAuthPersonUrl---个人实名认证信息传递失败:{}",result);
return map;
}
String url = JSON.parseObject(data).getString("url");
url = decode(url);
map.put("success",true);
map.put("transactionNo",JSON.parseObject(data).getString("transactionNo"));
map.put("url",url);
log.info("---getAuthPersonUrl---个人实名认证信息传递成功:{}",map);
return map;
}catch (Exception e){
e.printStackTrace();
log.error("---getAuthPersonUrl---获取个人实名认证地址报错:{}",e.getMessage());
}
map.put("success",false);
return map;
}
/**
* 新增平台配置控制是否允许颁发实名证书 申请个人实名证书
* @param customer_id 客户编号
* @param verified_serialno 实名认证序列号
*/
public Boolean applyCert(String customer_id,String verified_serialno){
log.info("---applyCert---申请个人实名证书:{}",customer_id);
try {
ApplyCert applyCert = new ApplyCert(APP_ID,APP_SECRET,V,HOST);
String result = applyCert.invokeApplyCert(customer_id,verified_serialno);
log.info("---applyCert---申请个人实名证书返回数据:{}",result);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getIntValue("code") != 1){
log.error("--applyCert---申请个人实名证书失败code:{},msg:{}",jsonObject.getIntValue("code"),jsonObject.getString("msg"));
return false;
}
log.info("--applyCert---申请个人实名证书成功");
return true;
}catch (Exception e){
e.printStackTrace();
log.error("---getAuthPersonUrl---申请个人实名证书报错:{}",e.getMessage());
}
return false;
}
/**
* 查询个人实名认证结果
* @param transactionNo 法大大订单编号
* @param accountType 账号类型
* @return
*/
public Map<String,Object> findPersonCertInfo(String transactionNo,AccountType accountType){
log.info("---findPersonCertInfo--开始查询实名认证结果");
Map<String,Object> map = Maps.newHashMap();
try {
FindCertInfo personCertInfo = new FindCertInfo(APP_ID,APP_SECRET,V,HOST);
String result = personCertInfo.invokeFindPersonCert(transactionNo,
accountType.getValue());
log.info("----findPersonCertInfo----查询实名认证结果返回数据:{}",result);
JSONObject jsonObject = JSON.parseObject(result);
String data = jsonObject.getString("data");
if (StringUtils.isBlank(data)){
log.error("----findPersonCertInfo----查询实名认证结果失败");
map.put("success",false);
return map;
}
//用户信息
String person = JSON.parseObject(data).getString("person");
log.info("----findPersonCertInfo----查询实名认证结果返回数据:{}",person);
map = GsonUtil.fronJson2Map(person);
map.put("success",true);
return map;
}catch (Exception e){
e.printStackTrace();
log.error("---findPersonCertInfo---查询实名认证结果报错:{}",e.getMessage());
}
map.put("success",false);
return map;
}
/**
* 获取企业实名认证地址
* @param customer_id 客户编号
* @param companyInfo 企业信息 (agent_name 代理人姓名 agent_id 代理人证件号 agent_mobile 代理人手机号 agent_id_front_path 代理人证件正面照下载地址 bank_card_no 代理人银行卡号)
* @param bankInfo 对公账号信息 (bank_name 银行名称 bank_id 银行帐号 subbranch_name 开户支行名称)
* @param legalInfo 法人信息 companyPrincipalType 1 时 必选 (company_name 企业名称 credit_no 统一社会信用代码 credit_image_path 统一社会信用代码证件照路径)
* @param agentInfo 代理人信息 companyPrincipalType 2 时 必选 (legal_name 法人姓名 legal_id 法人证件号 legal_mobile 法人手机号(仅支持国内运营商) legal_id_front_path 法人证件正面照下载地址 bank_card_no 法人银行卡号)
* @param companyVerifiedWay 实名认证套餐类型: 0:标准方案(对公打款+纸 质审核+法人身份+法人授 权); 1:对公打款; 2:纸质审核; 3:法人身份(授权)认证
* @param verifiedWay 管理员认证套餐类型: 0:三要素标准方案; 1:三要素补充方案; 2:四要素标准方案; 3:四要素补充方案; 4:纯三要素方案; 5:纯四要素方案
* @param pageModify 是否允许用户页面修改 1允许 2不允许
* @param notify_url 回调地址
* @param return_url 同步通知url TODO 接口未做
* @param companyPrincipalType 企业负责人身份: 1. 法人 2. 代理人
* @param optionDict add(新增) modify(修改)
* @param certFlag 是否认证成功后自动申请实 名证书 参数值为“0”:不申请 参数值为“1”:自动申请
* @return
*/
public Map<String,Object> getAuthCompanyUrl(String customer_id, CompanyInfoINO companyInfo, BankInfoINO bankInfo, LegalInfoINO legalInfo,
AgentInfoINO agentInfo,CompanyVerifiedWay companyVerifiedWay, VerifiedWay verifiedWay,
PageModify pageModify, String notify_url, String return_url, CompanyPrincipalType companyPrincipalType,
OptionDict optionDict,CertFlag certFlag){
log.info("----getAuthCompanyUrl---开始获取企业实名认证地址:{}",legalInfo);
Map<String,Object> map = Maps.newHashMap();
try {
GetCompanyVerifyUrl comverify = new GetCompanyVerifyUrl(APP_ID,APP_SECRET,V,HOST);
String result_type = "2";//刷脸是否显示结果页面 参数值为“1”:直接跳转到 return_url或法大大指定页 面,参数值为“2”:需要用户点击 确认后跳转到return_url或 法大大指定页面
String result = comverify.invokeCompanyVerifyUrl(companyInfo,bankInfo,legalInfo
,agentInfo, customer_id,companyVerifiedWay.getValue(),verifiedWay.getValue(),pageModify.getValue(),
companyPrincipalType.getValue(),return_url,notify_url,result_type,certFlag.getValue(),
optionDict.getValue(),null,null);
log.info("----getAuthCompanyUrl---获取企业实名认证地址返回数据:{}",result);
System.out.println(result);
JSONObject jsonObject = JSON.parseObject(result);
String data = jsonObject.getString("data");
if (StringUtils.isBlank(data)){
log.error("---getAuthCompanyUrl---获取企业实名认证地址失败:{}",jsonObject.getString("msg"));
map.put("success",false);
return map;
}
String url = JSON.parseObject(data).getString("url");
url = decode(url);
map.put("success",true);
map.put("url",url);
map.put("transactionNo",JSON.parseObject(data).getString("transactionNo"));
log.error("---getAuthCompanyUrl---获取企业实名认证地址成功:{}",map);
return map;
}catch (Exception e){
e.printStackTrace();
log.error("---getAuthCompanyUrl---获取企业实名认证地址报错:{}",e.getMessage());
}
map.put("success",false);
return map;
}
/**
*查询企业实名认证结果
* @param transactionNo 编号
* @param accountType 账号类型
* @return 有值成功,null 失败
*/
public String findCompanyCertInfo(String transactionNo,AccountType accountType){
log.info("---findCompanyCertInfo--开始查询企业实名认证结果");
try {
FindCertInfo personCertInfo = new FindCertInfo(APP_ID,APP_SECRET,V,HOST);
String result = personCertInfo.invokeFindPersonCert(transactionNo,
accountType.getValue());
log.info("---findCompanyCertInfo--查询企业实名认证结果返回数据:{}",result);
String data = JSON.parseObject(result).getString("data");
if (StringUtils.isBlank(data)){
log.error("---getAuthCompanyUrl---获取企业实名认证地址失败:{}",JSON.parseObject(result).getString("msg"));
return null;
}
log.info("---findCompanyCertInfo--查询企业实名认证结果返回成功:{}",data);
return data;
}catch (Exception e){
e.printStackTrace();
log.error("---findCompanyCertInfo---查询企业实名认证结果报错:{}",e.getMessage());
}
return null;
}
/**
* 印章上传
* @param customer_id 用户编号
* @param imgUrl 公网地址
* @return 有值成功,null 失败
*/
public String addSignature(String customer_id,String imgUrl){
log.info("--addSignature--开始印章上传:用户:{},印章地址:{}",customer_id,imgUrl);
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String result = base.invokeaddSignature(customer_id,null,imgUrl);
log.info("--addSignature--印章上传返回结果:{}",result);
String data = JSON.parseObject(result).getString("data");
if (StringUtils.isBlank(data)){
log.error("---addSignature---印章上传失败:{}",JSON.parseObject(result).getString("msg"));
return null;
}
log.error("---addSignature---印章上传成功");
return JSON.parseObject(data).getString("signature_id");
}catch (Exception e){
e.printStackTrace();
log.error("---addSignature---印章上传报错:{}",e.getMessage());
}
return null;
}
/**
* 新增用户签章图片 V2
* @param customer_id 用户编号id
* @param content 签章内容
* @return 有值成功,null 失败
*/
public String customSignature(String customer_id,String content){
log.info("--customSignature--开始生成用户印章:用户:{},印章内容:{}",customer_id,content);
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String result = base.invokecustomSignature(customer_id,content);
log.info("--customSignature--生成用户印章返回结果:{}",result);
// TODO 要使用时返回结果处理
String data = JSON.parseObject(result).getString("data");
if (StringUtils.isBlank(data)){
log.error("---customSignature---生成用户印章失败:{}",JSON.parseObject(result).getString("msg"));
return null;
}
return JSON.parseObject(data).getString("signature_img_base64");
}catch (Exception e){
e.printStackTrace();
log.error("---customSignature---生成用户印章报错:{}",e.getMessage());
}
return null;
}
/**
* 印章上传 v2
* @param customer_id 用户编号id
* @param signature_img_base64 图片base64
* @return 有值成功,null 失败
*/
public String addSignature2(String customer_id,String signature_img_base64){
log.info("--addSignature2--上传用户印章:用户:{}",customer_id);
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String result = base.invokeaddSignature(customer_id,signature_img_base64);
String data = JSON.parseObject(result).getString("data");
if (StringUtils.isBlank(data)){
log.error("---addSignature2---上传用户印章失败:{}",JSON.parseObject(result).getString("msg"));
return null;
}
log.info("---addSignature2---上传用户印章成功");
return JSON.parseObject(data).getString("signature_id");
}catch (Exception e){
e.printStackTrace();
log.error("---addSignature2---上传用户印章报错:{}",e.getMessage());
}
return null;
}
/**
* 合同上传
* @param contract_id 自定义合同id
* @param doc_title 合同标题
* @param doc_url 文件网络地址
* @param doc_type 文件类型 .pdf 可为空
*/
public Boolean uploadContract(String contract_id,String doc_title,String doc_url,String doc_type) {
log.info("--uploadContract---开始上传合同");
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
if (StringUtils.isBlank(doc_type)){
doc_type = ".pdf";
}
String result = base.invokeUploadDocs(contract_id, doc_title, null, doc_url, doc_type);
log.info("--uploadContract---上传合同返回数据:{}",result);
// code 状态码 1000:操作成功
//2001:参数缺失或者不合法
//2002:业务异常,失败原因见msg
//2003:其他错误,请联系法大大
String code = JSON.parseObject(result).getString("code");
if (StringUtils.equals(code,"1000")){
log.info("--uploadContract---上传合同成功");
return true;
}
log.error("--uploadContract---上传合同失败:{}",JSON.parseObject(result).getString("msg"));
return false;
}catch (Exception e){
e.printStackTrace();
log.error("---uploadContract---上传合同报错:{}",e.getMessage());
}
return false;
}
/**
* 模版上传
* @param template_id 自定义模板id
* @param doc_url 文件网络地址 .pdf 后缀
* @return
*/
public Boolean uploadTemplate(String template_id,String doc_url) {
log.info("---uploadTemplate--开始模版上传");
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String result = base.invokeUploadTemplate(template_id, null, doc_url);
log.info("---uploadTemplate--模版上传返回结果:{}",result);
String code = JSON.parseObject(result).getString("code");
if (StringUtils.equals(code,"1")){
log.info("---uploadTemplate--模版上传成功");
return true;
}
log.error("---uploadTemplate--模版上传失败:{}",JSON.parseObject(result).getString("msg"));
return false;
}catch (Exception e){
e.printStackTrace();
log.error("---uploadTemplate---模版上传报错:{}",e.getMessage());
}
return false;
}
/**
* 模版填充
* @param doc_title 文档标题
* @param template_id 模板编号
* @param contract_id 合同编号
* @param parameter 填充内容
* @param dynamic 动态表格
* @param font_size 字体大小 10,12,12.5,14
* @param fontType 默认0-宋体;0-宋体;1-仿宋;2-黑体;3-楷体;4-微软雅黑
*/
public Map<String,Object> generateContract(String doc_title,String template_id,String contract_id,JSONObject parameter,JSONObject dynamic,
String font_size,FontType fontType) {
log.info("--generateContract---开始填充模版数据");
Map<String,Object> map = Maps.newHashMap();
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String parameter_map = "";
if (parameter != null){
parameter_map = parameter.toString();
}
String dynamic_tables = "";
if (dynamic != null){
dynamic_tables = dynamic.toString();
log.info("---generateContract---附件数据:{}",dynamic_tables);
}
String result = base.invokeGenerateContract(template_id, contract_id, doc_title, font_size, fontType.getValue(), parameter_map, dynamic_tables);
log.info("---generateContract---填充模版返回结果:{}",result);
//正例: {"code":"1000","download_url":"http:\/\/testapi.fadada.com............BQg==","ms g":"操作成功","result":"success","viewpdf_url":"http:\/\/testapi.fadada.com........BQg=="}
// 反例:{"code":"2002","download_url":null,"msg":"对不起,没有检索到模板文件!","result":"error","viewpdf_url":null}
JSONObject jsonObject = JSON.parseObject(result);
map = GsonUtil.fronJson2Map(result);
if (StringUtils.equals(jsonObject.getString("code"),"1000")){
map.put("success",true);
log.info("---generateContract---填充模版成功:{}",map);
return map;
}
map.put("success",false);
log.error("---generateContract---填充模版失败:{}",jsonObject.getString("msg"));
return map;
}catch (Exception e){
e.printStackTrace();
log.error("---generateContract---填充模版数据报错:{}",e.getMessage());
}
map.put("success",false);
return map;
}
/* 模版填充实例参数
private String getparamter() {
JSONObject paramter = new JSONObject();
paramter.put("platformName","√"); 平台
paramter.put("borrower","深圳法大大"); //作者
return paramter.toString();
}
//自动签署实例,附件
private String getdynamic_tables() {
JSONArray dynamic_tables = new JSONArray();
JSONObject dynamic2 = new JSONObject();
dynamic2.put("insertWay", 1);//动态表格插入方式 0:新建页面添加table(默认)1:在某个关键字后添加table
dynamic2.put("keyword", ""); //关键字方式插入动态表格 #1. 当insertWay为1时,必填#2. 要求该关键字后(当前页)必须不包含内容,否则会被覆盖#3. 若关键字为多个,则取第一个关键字,在此关键字后插入table
dynamic2.put("pageBegin", "1"); //表格需要插入的页数 1. 当insertWay为0时,必填#2. 表示从第几页开始插入表格,如要从末尾插入table,则pageBegin为pdf总页数加1#3. 多个表格指定相同pageBegin,则多个表格按顺序插入,一个表格新起一页#4. pageBegin为-1时,则从pdf 末尾插入table
dynamic2.put("borderFlag", true);//table是否有边框 true:有(默认)false:无边框
dynamic2.put("cellHeight", "16.0");// 正文行高(表头不受影响) 单位:pt,即point,等于1/72英寸
dynamic2.put("colWidthPercent", new int[] { 3, 4, 4, 4});//Table中每个单元的水平对齐方式 (0:居左;1:居中;2:居右)默认为0
dynamic2.put("theFirstHeader", "附二"); //表头上方的一级标题
dynamic2.put("cellHorizontalAlignment", "1"); //Table中每个单元的水平对齐方式 (0:居左;1:居中;2:居右)默认为0
dynamic2.put("cellVerticalAlignment", "5"); // Table中每个单元的垂直对齐方式 (4:居上;5:居中;6:居下)默认为4
dynamic2.put("headers", new String[] { "序号", "借款人", "贷款人", "金额" }); //表头信息
String row1[] = new String[] { "1", "小网", "小易", "1000" };
String row2[] = new String[] { "2", "小云", "小音", "2000" };
String row3[] = new String[] { "3", "小乐", "天马", "3000" };
dynamic2.put("datas", new String[][] { row1, row2, row3 }); // 正文 (外层表示行,内层表示列)
dynamic2.put("headersAlignment", "1"); // 表头对齐方式 (0居左;1居中;2居右) 默认0
dynamic2.put("tableWidthPercentage", 80);//table宽度的百分比
dynamic_tables.add(dynamic2);
System.out.println(dynamic_tables.toString());
return dynamic_tables.toString();
}*/
/**
* 自动签署 需先签署授权协议
* @param customer_id 客户编号
* @param transaction_id 交易号
* @param contract_id 合同编号
* @param doc_title 合同标题
* @param sign_keyword 关键字
* @param notify_url 如果指定,当签章完成后,法大大将向此URL发送签署结果 TODO 接口未写
* @return
*/
public Map<String,Object> autoSign(String customer_id,String transaction_id,String contract_id,
String doc_title,String sign_keyword,String notify_url){
log.info("---autoSign---开始获取自动签署数据");
Map<String,Object> map = Maps.newHashMap();
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
ExtsignReq req = getExtsignReq(customer_id,transaction_id,contract_id,doc_title,null,sign_keyword,notify_url);
String result = base.invokeExtSignAuto(req);
//code 返回 1000:操作成功2001:参数缺失或者不合法2002:业务异常,失败原因见msg 2003:其他错误,请联系法大大
//实例 正例: {"code":"1000","download_url":"http:\/\/testapi.fadada.com.....","msg":"文档签署成功","result":"success","viewpdf_url":"http:\/\/testapi.fadada.com....."}
// 反例: {"code":"2002","download_url":null,"msg":"对不起,签约关键字不能为空!","result":"error","viewpdf_url":null}
String code = JSON.parseObject(result).getString("code");
if (StringUtils.equals(code,"1000")){
log.info("---autoSign---自动签署");
map = GsonUtil.fronJson2Map(result);
map.put("success",true);
return map;
}
map.put("success",false);
log.error("---autoSign---自动签署失败:{}",JSON.parseObject(result).getString("msg"));
return map;
}catch (Exception e){
e.printStackTrace();
log.error("---autoSign---自动签署合同报错:{}",e.getMessage());
}
map.put("success",false);
return map;
}
/**
* 签署数据
* @param customer_id 客户编号
* @param transaction_id 交易号
* @param contract_id 合同编号
* @param doc_title 合同标题
* @param return_url 同步返回地址
* @param sign_keyword 关键字
* @param notify_url 如果指定,当签章完成后,法大大将向此URL发送签署结果
*/
private ExtsignReq getExtsignReq(String customer_id,String transaction_id,String contract_id,
String doc_title,String return_url,String sign_keyword,String notify_url){
ExtsignReq req = new ExtsignReq();
req.setCustomer_id(customer_id); //客户编号
req.setTransaction_id(transaction_id);//交易号
req.setContract_id(contract_id); //合同编号
req.setDoc_title(doc_title); // 合同标题
if (StringUtils.isNotBlank(return_url)){
req.setReturn_url(return_url);//同步返回地址
}
req.setNotify_url(notify_url); // 异步返回地址
req.setPosition_type("0"); // 0 关键字 1 坐标
req.setKeyword_strategy("2"); //关键字签章策略:0:所有关键字签章(默认);1:第一个关键字签章;2:最后一个关键字签章
req.setSign_keyword(sign_keyword);// 关键字
return req;
}
/**
* 手动签署
* @param customer_id 客户编号
* @param transaction_id 交易号
* @param contract_id 合同编号
* @param doc_title 合同标题
* @param return_url 同步返回地址
* @param sign_keyword 关键字
* @param notify_url 如果指定,当签章完成后,法大大将向此URL发送签署结果 TODO 接口未写
* @return 有值成功,null 失败
*/
public String manualSignature(String customer_id,String transaction_id,String contract_id,
String doc_title,String return_url,String sign_keyword,String notify_url){
log.info("--manualSignature---开始手动签署获取路径");
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
ExtsignReq req = getExtsignReq(customer_id,transaction_id,contract_id,doc_title,return_url,sign_keyword,notify_url);
// read_time 合同必读时间 0-60秒 mobile_sign_type 签章类型 0:全部;1:标准;2:手写 sign_verify_way 签署意愿方式 1:短信;3:人脸识别
// verify_way_flag 签署意愿方式选择人脸识别时,人脸识别失败后自动调整为短信 默认为00:不切换;1:切换
String sign_url = base.invokeExtSign(req);
log.info("--manualSignature---手动签署获取路径:{}",sign_url);
return sign_url;
}catch (Exception e){
e.printStackTrace();
log.error("---manualSignature---手动签署获取路径报错:{}",e.getMessage());
}
return null;
}
/**
* 获取查看合同路径
* @param contract_id 合同编号
* @return 合同查看路径
*/
public String viewContract(String contract_id) {
FddClientExtra extra = new FddClientExtra(APP_ID,APP_SECRET,V,HOST);
String view_url = extra.invokeViewPdfURL(contract_id);
log.info("--viewContract---获取合同获取路径:{}",view_url);
return view_url;
}
/**
* 合同下载路径
* @param contract_id 合同编号
* @return 合同下载路径
*/
public String downloadContract(String contract_id) {
log.info("---downloadContract--合同下载:{}",contract_id);
FddClientExtra extra = new FddClientExtra(APP_ID,APP_SECRET,V,HOST);
String download_url = extra.invokeDownloadPdf(contract_id);
log.info("--viewContract---合同下载路径:{}",download_url);
return download_url;
}
/**
* 合同归档
* @param contract_id 合同编号
* @return 归档是否成功
*/
public Boolean contractFiling(String contract_id) {
log.info("---contractFiling--开始合同归档:{}",contract_id);
try {
FddClientBase base = new FddClientBase(APP_ID,APP_SECRET,V,HOST);
String result = base.invokeContractFilling(contract_id);
//code 1000:操作成功2001:参数缺失或者不合法2002:业务异常,失败原因见msg 2003:其他错误,请联系法大大
log.info("---contractFiling--合同归档返回结果:{}",result);
String code = JSON.parseObject(result).getString("code");
if (StringUtils.equals(code,"1000")){
log.info("---contractFiling--合同归档成功");
return true;
}
log.info("---contractFiling--合同归档失败:{}",JSON.parseObject(result).getString("msg"));
return false;
}catch (Exception e){
e.printStackTrace();
log.error("---generateContract---合同归档报错:{}",e.getMessage());
}
return false;
}
/**
* 获取页面授权接口地址
* @param transaction_id 授权流水号(同时也是合同签署交易号)
* @param auth_type 授权类型 1:授权自动签(目前只能填1)
* @param contract_id 合同编号
* @param customer_id 客户编号
* @param return_url 页面跳转URL(签署结果同步通知)
* @param notify_url 签署结果异步通知URL
*/
public String beforeAuthSign(String transaction_id,String auth_type,String contract_id,String customer_id,String return_url,String notify_url){
log.info("---beforeAuthSign--开始获取页面授权接口地址");
try {
BeforeAuthSign sign = new BeforeAuthSign(APP_ID,APP_SECRET,V,HOST);
String result = sign.invokeBeforeAuthSign(transaction_id,auth_type,contract_id,customer_id,return_url,notify_url);
log.info("---beforeAuthSign--获取页面授权接口返回结果:{}",result);
return result;
}catch (Exception e){
e.printStackTrace();
log.error("---generateContract---获取页面授权接口地址报错:{}",e.getMessage());
}
return null;
}
/**
* 取消授权,获取访问地址
* @param customer_id 客户编号
* @param notify_url 异步通知地址 TODO 接口地址
* @param return_url 同步跳转地址
* @return 地址
*/
public String cancelExtSignAutoPage(String customer_id,String notify_url,String return_url){
log.info("---cancelExtSignAutoPage---开始获取取消授权地址");
CancelExtSignAutoPage autoPage = new CancelExtSignAutoPage(APP_ID,APP_SECRET,V,HOST);
String cancel_url = autoPage.cancelExtSignAutoPage(customer_id,notify_url,return_url);
log.info("---cancelExtSignAutoPage---获取取消授权地址成功:{}",cancel_url);
return cancel_url;
}
/**
* 查询授权结果
* @param customer_id
*/
public String getAuthStatus(String customer_id){
log.info("---getAuthStatus---开始查询授权:{}",customer_id);
try {
GetAuthStatus authStatus = new GetAuthStatus(APP_ID,APP_SECRET,V,HOST);
String result = authStatus.getAuthStatus(customer_id);
log.info("---getAuthStatus---查询授权结果:{}",result);
// {code:"",data:{
// status:1, 1已授权0未授权
// authType:1, 1-接口线上授权:调用授权自动签接口完成的授权2-线下管理员授权:线下提交材料人工审核授权
// transactionNo:124, 接口线上授权时才返
// contractId:"11" 授权合同编号
// },msg:""}
String data = JSON.parseObject(result).getString("data");
if (StringUtils.isNotBlank(data)){
String status = JSON.parseObject(data).getString("status");
log.info("---getAuthStatus---查询授权成功:{}",status);
return status;
}
log.info("---getAuthStatus--查询授权失败:{}",JSON.parseObject(result).getString("msg"));
return null;
}catch (Exception e){
e.printStackTrace();
log.error("---getAuthStatus---查询授权情况报错:{}",e.getMessage());
}
return null;
}
}
3.注意点:
1.里面定义很多枚举内,需要开发者自主开发。
2.日志可以自行更换。
3.很多异步通知很异步通知需要开发者根据接口文档进行编写。
4.这里引入的配置,需开发者从配置文件中读取。我这里是自己读取一种方式,方法都可写成静态。