智能合同模板
https://antchain.antgroup.com/docs/11/424446
这个蚂蚁链是制作合同模板的文档,官方文档
控制层代码
//续租合同
@RequestMapping("/continueCreateContract")
public ResData createContinueContract(@RequestParam("id") Long id) {
if (this.isNotId(id)) {
return this.error("参数错误");
}
RLock lock = redissonClient.getLock("order:created:contract:" + id);
try {
lock.lock();
OrderRelet relet = orderReletService.findById(id);//获取到续租合同信息
OrderMaster detail = orderMasterService.findById(relet.getOrderMasterId());//获取到ordermaster信息
if (detail == null) {
return this.error("参数ID错误");
}
if (Utils.incloud(new int[]{OrderStatus.NEW.getCode(), OrderStatus.RETURN.getCode(), OrderStatus.CANCEL.getCode()}, detail.getStatus())) {
return this.error("订单状态错误,无法生成合同");
}
if (StringUtils.isNotBlank(detail.getContractFlowId())) {
return this.error("已创建合同,无需重复创建");
}
User user = userService.findById(detail.getUserId());
detail.setItems(orderItemService.findByOrderMasterId(detail.getId()));
detail.setStages(orderStagesService.findByOrderMasterId(detail.getId()));
List<OrderStages> stages = orderStagesService.findByOrderMasterId(detail.getId());
relet.setContinueNumber(DateUtils.format(new Date(), "yyyyMMddHHmm") + relet.getId());
String flowId = antCloudContractService.createOrderRetContract(detail, user, stages, relet);
OrderRelet update = new OrderRelet();
update.setContractId(flowId);//更新数据库里order_relet表的智能合同id
update.setContinueNumber("R"+relet.getContinueNumber());
orderReletService.update(relet.getId(), update);
return this.success(flowId);
} catch (Exception e) {
logger.error("错误", e);
return this.error("智能合同生成失败:msg=" + e.getMessage());
} finally {
lock.unlock();
}
}
控制层的话就是返回了flowId,success就是封装好的给前端的响应
我其实就做了下修改,新增了一个续租合同的模板地址方法,并将一些字段修改了下,新增了个接口
智能合同区块链代码(重点是map键值对)
AntCloudContractService
键是合同模板里面你填的key,值就是对应的要变化的数值啦
package com.zhiwei.rent.service.blockchain;
import cn.com.antcloud.api.twc.v1_0_0.response.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.model.merchant.Merchant;
import com.zhiwei.rent.model.order.OrderItem;
import com.zhiwei.rent.model.order.OrderMaster;
import com.zhiwei.rent.model.order.OrderRelet;
import com.zhiwei.rent.model.order.OrderStages;
import com.zhiwei.rent.model.product.Product;
import com.zhiwei.rent.model.product.ProductSku;
import com.zhiwei.rent.model.product.SkuAttribute;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.BaseService;
import com.zhiwei.rent.service.blockchain.vo.AntOrgInfo;
import com.zhiwei.rent.service.merchant.MerchantService;
import com.zhiwei.rent.service.order.OrderItemService;
import com.zhiwei.rent.service.order.OrderStagesService;
import com.zhiwei.rent.service.product.ProductBomService;
import com.zhiwei.rent.service.product.ProductService;
import com.zhiwei.rent.service.product.ProductSkuService;
import com.zhiwei.rent.service.sys.BrandService;
import com.zhiwei.rent.util.DateUtils;
import com.zhiwei.rent.util.MoneyUtil;
import com.zhiwei.rent.util.OrderUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class AntCloudContractService extends BaseService {
private final Logger logger = LoggerFactory.getLogger(AntCloudContractService.class);
@Autowired
private AntCloudService antCloudService;
@Autowired
private OrderItemService orderItemService;
@Autowired
private OrderStagesService orderStagesService;
@Autowired
private ProductService productService;
@Autowired
private BrandService brandService;
@Autowired
private ProductSkuService productSkuService;
@Autowired
private MerchantService merchantService;
@Autowired
private ProductBomService productBomService;
@Autowired
private AntCloudAccountService antCloudAccountService;
@Autowired
private AntUploadContractTemplateService antUploadContractTemplateService;
public String createContract(OrderMaster orderMaster, User user) throws Exception{
// 签署流程ID
String flowId;
// 电子合同文档ID
String fileId;
Merchant merchant = merchantService.findById(orderMaster.getMerchantId());
if(merchant == null){
throw new Exception("商户信息获取错误");
}
AntOrgInfo platform = antCloudAccountService.getAccountByType(null,Constants.LEGAL_PERSON,Constants.LEGAL_ID_CARD_NO,Constants.COMPANY_PHONE_NUMBER);
if(platform == null){
throw new Exception("电子合同平台方注册失败");
}
AntOrgInfo jf = antCloudAccountService.getAccountByType(merchant,merchant.getLegalPerson(),merchant.getLegalPersonIdNo(),merchant.getPhone());
if(jf == null){
throw new Exception("电子合同甲方注册失败");
}
AntOrgInfo userInfo = antCloudAccountService.getUserAccountInfo(user);
if(userInfo == null){
throw new Exception("电子合同用户注册失败");
}
// 创建电子合同签署流程
CreateContractFlowResponse createContractFlowResponse = antCloudService.twcNotaryContractFlowCreate( platform.getAccountId(),platform.getOrgId());
if (createContractFlowResponse != null) {
if ("200".equals(createContractFlowResponse.getResultCode())) {
flowId = createContractFlowResponse.getFlowId();
} else {
throw new Exception(String.format("创建电子合同签署流程失败:%s", createContractFlowResponse.getResultMsg()));
}
} else {
throw new Exception("创建电子合同签署流程失败");
}
// 合同文件
String templateId = antUploadContractTemplateService.getTemplateId();
// StringBuilder pb = new StringBuilder(); // 品牌
StringBuilder xh = new StringBuilder(); // 型号
StringBuilder cs = new StringBuilder(); // 成色
StringBuilder sp = new StringBuilder(); // 商品
// StringBuilder pj = new StringBuilder(); // 配件
double depositMoney = 0; // 押金
double allActMoney = 0D; // 总的买断金额
Long allNum = 0L; // 数量
if(orderMaster.getItems() == null){
orderMaster.setItems(orderItemService.findByOrderMasterId(orderMaster.getId()));
}
if(orderMaster.getStages() == null){
orderMaster.setStages(orderStagesService.findByOrderMasterId(orderMaster.getId()));
}
StringBuilder imei = new StringBuilder();
if(orderMaster.getItems() != null && orderMaster.getItems().size() > 0){
for(OrderItem item : orderMaster.getItems()){
sp.append(item.getProductName());
if(item.getImei() != null) {
imei.append(item.getImei()).append(",");
}
allNum += item.getNum();
depositMoney += (item.getPledge() * item.getNum());
Product product = productService.findById(item.getProductId());
if(product != null) {
/*Brand brand = brandService.findById(product.getBrandId());
if(brand != null){
pb.append(brand.getName()).append("\n");
}*/
cs.append(product.getQuality() >= 100 ? "全新" : "二手");
}
if(item.getActualMoney() != null && item.getActualMoney() > 0) {
allActMoney += item.getActualMoney() * item.getNum();
}
ProductSku sku = productSkuService.findById(item.getSkuId());
if(sku != null){
try {
List<SkuAttribute> attrs = JSONArray.parseArray(sku.getAttributes(), SkuAttribute.class);
if(CollectionUtils.isNotEmpty(attrs)){
for(SkuAttribute att : attrs){
xh.append(att.getValue()).append("/");
}
xh.deleteCharAt(xh.length() - 1);
}
}catch (Exception e){
logger.error("SkuAttribute={}转换错误:",sku.getAttributes(),e);
}
}
/*List<ProductBom> boms = productBomService.findByProductId(item.getProductId());
if(CollectionUtils.isNotEmpty(boms)){
for(ProductBom bom : boms){
pj.append(bom.getName());
}
}*/
}
}
String deliverAddress = orderMaster.getDeliveryProvinceName()+orderMaster.getDeliveryCityName()+orderMaster.getDeliveryCountyName()+orderMaster.getDeliveryDetailAddress();
String sign_date = DateUtils.format(new Date(), "yyyy-MM-dd");
Double allRentMoney = OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(orderMaster);
// 电子合同模板添加文档
Map<String, String> templateParams = new HashMap<>();
// 甲方也就是出租方
templateParams.put("mname",merchant.getLicenseName());
templateParams.put("maddress",merchant.getProvinceName()+merchant.getCityName()+merchant.getCountyName()+merchant.getDetailAddress());
templateParams.put("mmobile",merchant.getPhone());
templateParams.put("memail","");
templateParams.put("pname",Constants.COMPANY_NAME);
templateParams.put("uname",user.getTrueName());
templateParams.put("umobile",user.getMobile());
templateParams.put("uidcardno",user.getIdCardNum());
templateParams.put("uemail",user.getEmail());
templateParams.put("deliveraddress",deliverAddress);
templateParams.put("uproduct",sp.toString());
templateParams.put("ordernumber",orderMaster.getOrderNumber());
templateParams.put("delivername",orderMaster.getDeliveryUsername());
templateParams.put("delivermobile",orderMaster.getDeliveryMobile());
templateParams.put("tname",xh.toString());
templateParams.put("pnum",allNum.toString());
templateParams.put("imei",imei.toString());
templateParams.put("quality",cs.toString());
templateParams.put("ordertimelen",DateUtils.format(orderMaster.getBeginDate(),"yyyy-MM-dd")+" 至 "+DateUtils.format(orderMaster.getEndDate(),"yyyy-MM-dd") +" 共 "+ orderMaster.getDay()+"天");
templateParams.put("unitmoney",String.valueOf(MoneyUtil.round(allRentMoney/orderMaster.getDay())));
templateParams.put("day",orderMaster.getDay().toString());
templateParams.put("allmoney",String.valueOf(MoneyUtil.round(allRentMoney))); // 总租金
templateParams.put("allactmoney",MoneyUtil.round(allActMoney).toString()); // 买断金额
templateParams.put("depositmoney",MoneyUtil.round(depositMoney).toString()); // 押金
templateParams.put("alldepositmoney",MoneyUtil.round(depositMoney).toString()); // 设备和配件总价
templateParams.put("insurancemoney",MoneyUtil.round(orderMaster.getAllInsuranceMoney()).toString()); // 保险
templateParams.put("firstpay","1"); // 首付期数
templateParams.put("signtime",sign_date);
List<OrderStages> stages = orderMaster.getStages();
if(CollectionUtils.isEmpty(stages)){
stages = orderStagesService.findByOrderMasterId(orderMaster.getId());
}
if(CollectionUtils.isNotEmpty(stages)){
for(OrderStages item : stages){
templateParams.put("paydate_"+item.getSort(),DateUtils.format(item.getRefundDate(),"yyyy-MM-dd"));
templateParams.put("paymoney_"+item.getSort(),MoneyUtil.round(item.getMoney()).toString());
}
}
logger.info("合同内容txt={}", JSON.toJSONString(templateParams));
AddContractFileResponse addContractFileResponse = antCloudService.twcNotaryContractFileAdd(templateId,templateParams);
if (addContractFileResponse != null) {
if ("200".equals(addContractFileResponse.getResultCode())) {
fileId = addContractFileResponse.getFileId();
} else {
logger.error("errorjson={}",JSON.toJSONString(addContractFileResponse));
throw new Exception(String.format("电子合同模板添加文档失败:%s", addContractFileResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同模板添加文档失败");
}
// 电子合同签署流程中添加待签署文档
AddContractDocumentResponse addContractDocumentResponse = antCloudService.twcNotaryContractDocumentAdd(flowId, fileId);
if (addContractDocumentResponse != null) {
if (!"200".equals(addContractDocumentResponse.getResultCode())) {
throw new Exception(String.format("电子合同签署流程中添加待签署文档失败:%s", addContractDocumentResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同签署流程中添加待签署文档失败");
}
// 添加电子合同签署方自动盖章签署区
AddContractSignfieldResponse addContractSignfieldResponse = antCloudService.twcNotaryContractSignfieldAdd( flowId,fileId,platform,jf,userInfo);
if (addContractSignfieldResponse != null) {
if (!"200".equals(addContractSignfieldResponse.getResultCode())) {
logger.error("添加电子合同签署方自动盖章签署区失败,msg={}",JSON.toJSONString(addContractSignfieldResponse));
throw new Exception(String.format("添加电子合同签署方自动盖章签署区失败:%s", addContractSignfieldResponse.getResultMsg()));
}
} else {
throw new Exception("添加电子合同签署方自动盖章签署区失败");
}
// 电子合同签署流程开启
StartContractFlowResponse startContractFlowResponse = antCloudService.twcNotaryContractFlowStart(flowId);
if (startContractFlowResponse != null) {
if (!"200".equals(startContractFlowResponse.getResultCode())) {
throw new Exception(String.format("电子合同签署流程开启失败:%s", startContractFlowResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同签署流程开启失败");
}
return flowId;
}
//续租合同
public String createOrderRetContract(OrderMaster orderMaster, User user, List<OrderStages> stages, OrderRelet relet) throws Exception{
// 签署流程ID
String flowId;
// 电子合同文档ID
String fileId;
Merchant merchant = merchantService.findById(orderMaster.getMerchantId());
if(merchant == null){
throw new Exception("商户信息获取错误");
}
AntOrgInfo platform = antCloudAccountService.getAccountByType(null,Constants.LEGAL_PERSON,Constants.LEGAL_ID_CARD_NO,Constants.COMPANY_PHONE_NUMBER);
if(platform == null){
throw new Exception("电子合同平台方注册失败");
}
AntOrgInfo jf = antCloudAccountService.getAccountByType(merchant,merchant.getLegalPerson(),merchant.getLegalPersonIdNo(),merchant.getPhone());
if(jf == null){
throw new Exception("电子合同甲方注册失败");
}
AntOrgInfo userInfo = antCloudAccountService.getUserAccountInfo(user);
if(userInfo == null){
throw new Exception("电子合同用户注册失败");
}
// 创建电子合同签署流程
CreateContractFlowResponse createContractFlowResponse = antCloudService.twcNotaryContractFlowCreate( platform.getAccountId(),platform.getOrgId());
if (createContractFlowResponse != null) {
if ("200".equals(createContractFlowResponse.getResultCode())) {
flowId = createContractFlowResponse.getFlowId();
} else {
throw new Exception(String.format("创建电子合同签署流程失败:%s", createContractFlowResponse.getResultMsg()));
}
} else {
throw new Exception("创建电子合同签署流程失败");
}
// 合同文件
String templateId = antUploadContractTemplateService.getContinueTemplateId();
// StringBuilder pb = new StringBuilder(); // 品牌
StringBuilder xh = new StringBuilder(); // 型号
StringBuilder cs = new StringBuilder(); // 成色
StringBuilder sp = new StringBuilder(); // 商品
StringBuilder continueNumber = new StringBuilder();//合同编号
// StringBuilder pj = new StringBuilder(); // 配件
double depositMoney = 0; // 押金
double allActMoney = 0D; // 总的买断金额
Long allNum = 0L; // 数量
if(orderMaster.getItems() == null){
orderMaster.setItems(orderItemService.findByOrderMasterId(orderMaster.getId()));
}
StringBuilder imei = new StringBuilder();
if(orderMaster.getItems() != null && orderMaster.getItems().size() > 0){
for(OrderItem item : orderMaster.getItems()){
sp.append(item.getProductName());
if(item.getImei() != null) {
imei.append(item.getImei()).append(",");
}
allNum += item.getNum();
depositMoney += (item.getPledge() * item.getNum());
Product product = productService.findById(item.getProductId());
if(product != null) {
/*Brand brand = brandService.findById(product.getBrandId());
if(brand != null){
pb.append(brand.getName()).append("\n");
}*/
cs.append(product.getQuality() >= 100 ? "全新" : "二手");
}
if(item.getActualMoney() != null && item.getActualMoney() > 0) {
allActMoney += item.getActualMoney() * item.getNum();
}
ProductSku sku = productSkuService.findById(item.getSkuId());
if(sku != null){
try {
List<SkuAttribute> attrs = JSONArray.parseArray(sku.getAttributes(), SkuAttribute.class);
if(CollectionUtils.isNotEmpty(attrs)){
for(SkuAttribute att : attrs){
xh.append(att.getValue()).append("/");
}
xh.deleteCharAt(xh.length() - 1);
}
}catch (Exception e){
logger.error("SkuAttribute={}转换错误:",sku.getAttributes(),e);
}
}
/*List<ProductBom> boms = productBomService.findByProductId(item.getProductId());
if(CollectionUtils.isNotEmpty(boms)){
for(ProductBom bom : boms){
pj.append(bom.getName());
}
}*/
}
}
String deliverAddress = orderMaster.getDeliveryProvinceName()+orderMaster.getDeliveryCityName()+orderMaster.getDeliveryCountyName()+orderMaster.getDeliveryDetailAddress();
String sign_date = DateUtils.format(new Date(), "yyyy-MM-dd");
Double allRentMoney = OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(orderMaster);
// 电子合同模板添加文档
Map<String, String> templateParams = new HashMap<>();
// 甲方也就是出租方
templateParams.put("mname",merchant.getLicenseName());//出租人
templateParams.put("maddress",merchant.getProvinceName()+merchant.getCityName()+merchant.getCountyName()+merchant.getDetailAddress());//出租人联系地址
templateParams.put("mmobile",merchant.getPhone());//出租人联系电话
templateParams.put("memail","");
templateParams.put("pname",Constants.COMPANY_NAME);
templateParams.put("uname",user.getTrueName());//承租人
templateParams.put("umobile",user.getMobile());
templateParams.put("uidcardno",user.getIdCardNum());//承租人身份证
templateParams.put("uemail",user.getEmail());
templateParams.put("deliveraddress",deliverAddress);
templateParams.put("uproduct",sp.toString());//商品名称
templateParams.put("ordernumber",orderMaster.getOrderNumber());//首租合同编号
templateParams.put("delivername",orderMaster.getDeliveryUsername());
templateParams.put("delivermobile",orderMaster.getDeliveryMobile());
templateParams.put("tname",xh.toString());//型号
// templateParams.put("pnum",allNum.toString());
templateParams.put("imei",imei.toString());//imei
templateParams.put("quality",cs.toString());//成色
// templateParams.put("ordertimelen",DateUtils.format(orderMaster.getBeginDate(),"yyyy-MM-dd")+" 至 "+DateUtils.format(orderMaster.getEndDate(),"yyyy-MM-dd") +" 共 "+ orderMaster.getDay()+"天");
templateParams.put("unitmoney",String.valueOf(MoneyUtil.round(allRentMoney/orderMaster.getDay()))); //租金额,也就是每一期所还的金额
templateParams.put("day",orderMaster.getDay().toString());//期数,就是你的租金分几期
templateParams.put("allmoney",String.valueOf(MoneyUtil.round(allRentMoney))); // 总租金
templateParams.put("allactmoney",MoneyUtil.round(allActMoney).toString()); // 买断金额
templateParams.put("depositmoney",MoneyUtil.round(depositMoney).toString()); // 押金
templateParams.put("alldepositmoney",MoneyUtil.round(depositMoney).toString()); // 设备和配件总价
// templateParams.put("insurancemoney",MoneyUtil.round(orderMaster.getAllInsuranceMoney()).toString()); // 保险
// templateParams.put("firstpay","1"); // 首付期数
templateParams.put("signtime",sign_date);//签订日期
templateParams.put("paytype", orderMaster.getPayType());//支付方式
templateParams.put("continuenumber", relet.getContinueNumber());//续租订单编号
templateParams.put("allpledge",String.valueOf(orderMaster.getAllPledge()));//官网价
if(CollectionUtils.isNotEmpty(stages)){//账单日和租金额
int sort = 1;
for(OrderStages item : stages){
templateParams.put("paydate_"+sort,DateUtils.format(item.getRefundDate(),"yyyy-MM-dd"));
templateParams.put("paymoney_"+sort,MoneyUtil.round(item.getMoney()).toString());
sort ++;
}
}
logger.info("合同内容txt={}", JSON.toJSONString(templateParams));
AddContractFileResponse addContractFileResponse = antCloudService.twcNotaryContractFileAdd(templateId,templateParams);
if (addContractFileResponse != null) {
if ("200".equals(addContractFileResponse.getResultCode())) {
fileId = addContractFileResponse.getFileId();
} else {
logger.error("errorjson={}",JSON.toJSONString(addContractFileResponse));
throw new Exception(String.format("电子合同模板添加文档失败:%s", addContractFileResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同模板添加文档失败");
}
// 电子合同签署流程中添加待签署文档
AddContractDocumentResponse addContractDocumentResponse = antCloudService.twcNotaryContractDocumentAdd(flowId, fileId);
if (addContractDocumentResponse != null) {
if (!"200".equals(addContractDocumentResponse.getResultCode())) {
throw new Exception(String.format("电子合同签署流程中添加待签署文档失败:%s", addContractDocumentResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同签署流程中添加待签署文档失败");
}
// 添加电子合同签署方自动盖章签署区
AddContractSignfieldResponse addContractSignfieldResponse = antCloudService.twcNotaryContractSignfieldAdd( flowId,fileId,platform,jf,userInfo);
if (addContractSignfieldResponse != null) {
if (!"200".equals(addContractSignfieldResponse.getResultCode())) {
logger.error("添加电子合同签署方自动盖章签署区失败,msg={}",JSON.toJSONString(addContractSignfieldResponse));
throw new Exception(String.format("添加电子合同签署方自动盖章签署区失败:%s", addContractSignfieldResponse.getResultMsg()));
}
} else {
throw new Exception("添加电子合同签署方自动盖章签署区失败");
}
// 电子合同签署流程开启
StartContractFlowResponse startContractFlowResponse = antCloudService.twcNotaryContractFlowStart(flowId);
if (startContractFlowResponse != null) {
if (!"200".equals(startContractFlowResponse.getResultCode())) {
throw new Exception(String.format("电子合同签署流程开启失败:%s", startContractFlowResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同签署流程开启失败");
}
return flowId;
}
}
不重要的代码(区块链等技术)
AntBlockChainService
package com.zhiwei.rent.service.blockchain;
import cn.com.antcloud.api.AntFinTechApiClient;
import cn.com.antcloud.api.AntFinTechProfile;
import cn.com.antcloud.api.product.AntCloudProdClient;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.antgroup.antchain.openapi.bot.Client;
import com.antgroup.antchain.openapi.bot.models.*;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.config.AntBlockChainConfig;
import com.zhiwei.rent.config.ProjectConfig;
import com.zhiwei.rent.controller.web.user.vo.ValicationIdVo;
import com.zhiwei.rent.service.blockchain.vo.LeaseRiskVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* 蚂蚁区块链
*/
@Service
@Slf4j
public class AntBlockChainService {
@Autowired
private AntBlockChainConfig antBlockChainConfig;
@Autowired
private ProjectConfig projectConfig;
@Autowired
private AntCloudService antCloudService;
private static final String ENDPOINT = "https://prodapigw.xxx.com/gateway.do";
// private static final String sceneId = "805000070";
private AntCloudProdClient clientV2;
@PostConstruct
private void init(){
clientV2 = AntCloudProdClient.newBuilder()
.setEndpoint(ENDPOINT)
.setAccess(antBlockChainConfig.getAccessKey(), antBlockChainConfig.getSecret())
.build();
}
public AntCloudProdClient getClient(){
return clientV2;
}
/**
* 身份认证初始化
*/
public ValicationIdVo valicationIdCard(String reqId,String name, String idCard){
CreateLeaseRealpersonRequest request = new CreateLeaseRealpersonRequest();
request.setCertType("IDENTITY_CARD");
request.setIdentityType("CERT_INFO");
request.setCertName(name.trim());
request.setCertNo(idCard.trim());
request.setOuterOrderNo(reqId);
request.setReturnUrl("/");
request.setProductInstanceId(Constants.ALIPAY_RISK_PRODUCT_ID);
try {
CreateLeaseRealpersonResponse response = this.getAntBotClient().createLeaseRealperson(request);
log.info("请求实人认证接口返回body={}",JSON.toJSONString(response));
if (!"OK".equals(response.getResultCode())) {
return null;
}
JSONObject body = JSON.parseObject(response.getData());
ValicationIdVo vo = new ValicationIdVo();
vo.setCertifyId(body.getString("certifyId"));
vo.setUrl(body.getString("certifyUrl"));
vo.setIdCardNo(idCard);
vo.setName(name);
vo.setRequestNo(reqId);
return vo;
}catch (Exception e){
log.error("实人认证接口错误:{},{},{}",reqId,name,idCard,e);
}
return null;
}
public boolean queryValidationIdCard(String certifyId,String requestNo){
if (StringUtils.isBlank(certifyId) || StringUtils.isBlank(requestNo)) {
return false;
}
QueryLeaseRealpersonRequest queryLeaseRealpersonRequest = new QueryLeaseRealpersonRequest()
.setCertifyId(certifyId)
.setOuterOrderNo(requestNo);
try {
QueryLeaseRealpersonResponse response = this.getAntBotClient().queryLeaseRealperson(queryLeaseRealpersonRequest);
log.info("实人认证结果查询返回body={}",JSON.toJSONString(response));
if(!"OK".equals(response.getResultCode())){
return false;
}
JSONObject body = JSON.parseObject(response.getData());
return "T".equals(body.getString("passed"));
}catch (Exception e){
log.error("查询实人认证错误,certifyId={}", certifyId, e);
}
return false;
}
/**
* 蚁盾风险决策查询
*/
/*public Proposal riskplusSecurityPolicyQuery(String zfbUserId,String mobile,String username,String idcardNumber) {
Proposal proposal = null;
String EVENT_DATA_TYPE_PROD = "prod";
try {
HttpServletRequest request = ControllerContent.getRequest();
Binding binding = new Binding(antBlockChainConfig.getAccessKey(), antBlockChainConfig.getSecret(), EVENT_DATA_TYPE_PROD);
RiskService riskService = LocateService.lookUp(RiskService.class);
riskService.bind(binding);
// 构造事件信息
Knowledge knowledge = new Knowledge("EC_APPLY");
knowledge.getEvent()
.set("gmt_occur", DateUtils.format(new Date()))
.set("user_id", zfbUserId)
.set("user_name",username)
.set("ip", RequestUtils.getIp(request))
.set("mobile",mobile)
.set("cert_no",idcardNumber);
proposal = riskService.assess(knowledge);
} catch (Exception e) {
e.printStackTrace();
}
return proposal;
}*/
public LeaseRiskVo riskV2(String zfbUserId, String mobile, String username, String idCardNumber, String ip) {
// 构建请求
cn.com.antcloud.api.bot.v1_0_0.request.QueryLeaseRiskRequest request = new cn.com.antcloud.api.bot.v1_0_0.request.QueryLeaseRiskRequest();
request.setUserId(zfbUserId);
request.setUserName(username);
request.setCertNo(idCardNumber);
request.setMobile(mobile);
request.setIp(ip);
request.setProductInstanceId(Constants.ALIPAY_RISK_PRODUCT_ID);
request.setRegionName(Constants.ALIPAY_REGION_NAME);
try {
// 发送请求,并且获取响应结果
cn.com.antcloud.api.bot.v1_0_0.response.QueryLeaseRiskResponse response = this.getAntFinApiClient().execute(request);
log.info("蚁盾V2返回{},{},{},{},{},{}",zfbUserId,mobile,username,idCardNumber,ip,JSONObject.toJSONString(response));
if(StringUtils.isNotBlank(response.getData())){
return JSON.parseObject(response.getData(),LeaseRiskVo.class);
}
}catch (Exception e){
log.error("蚁盾V2查询报错{},{},{},{},{}",zfbUserId,mobile,username,idCardNumber,ip,e);
}
return null;
}
private AntFinTechApiClient getAntFinApiClient(){
AntFinTechProfile profile = AntFinTechProfile.getProfile(
"https://openapi.xxx.com",
antBlockChainConfig.getAccessKey(),
antBlockChainConfig.getSecret());
return new AntFinTechApiClient(profile);
}
private Client getAntBotClient() throws Exception{
Config config = new Config();
// 您的AccessKey ID
config.accessKeyId = antBlockChainConfig.getAccessKey();
// 您的AccessKey Secret
config.accessKeySecret = antBlockChainConfig.getSecret();
return new Client(config);
}
}
AntCloudHashService
package com.zhiwei.rent.service.blockchain;
import cn.com.antcloud.api.twc.v1_0_0.response.CreateLeaseBizResponse;
import cn.com.antcloud.api.twc.v1_0_0.response.DownloadContractDocumentResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.rent.common.*;
import com.zhiwei.rent.config.AntBlockChainConfig;
import com.zhiwei.rent.config.ProjectConfig;
import com.zhiwei.rent.model.merchant.Merchant;
import com.zhiwei.rent.model.order.*;
import com.zhiwei.rent.model.product.Product;
import com.zhiwei.rent.model.product.ProductSku;
import com.zhiwei.rent.model.sys.Brand;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.BaseService;
import com.zhiwei.rent.service.FileuploadService;
import com.zhiwei.rent.service.HttpUtilService;
import com.zhiwei.rent.service.blockchain.vo.LeaseRiskVo;
import com.zhiwei.rent.service.blockchain.vo.OrderHashContext;
import com.zhiwei.rent.service.common.AliyunKuaidiService;
import com.zhiwei.rent.service.order.OrderItemService;
import com.zhiwei.rent.service.order.OrderStagesService;
import com.zhiwei.rent.service.order.OrderSupplementService;
import com.zhiwei.rent.service.product.ProductService;
import com.zhiwei.rent.service.product.ProductSkuService;
import com.zhiwei.rent.service.sys.BrandService;
import com.zhiwei.rent.service.user.UserService;
import com.zhiwei.rent.service.zfb.ZfbService;
import com.zhiwei.rent.util.DateUtils;
import com.zhiwei.rent.util.MD5Utils;
import com.zhiwei.rent.util.OrderUtils;
import com.zhiwei.rent.util.Utils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @date 2020年12月27日11时38分
*/
@Service
@Slf4j
public class AntCloudHashService extends BaseService {
@Autowired
private AntCloudService antCloudService;
@Autowired
private BrandService brandService;
@Autowired
private ProjectConfig projectConfig;
@Autowired
private AntBlockChainConfig chainConfig;
@Autowired
private ProductSkuService productSkuService;
@Autowired
private ZfbService zfbService;
@Autowired
private ProductService productService;
@Autowired
private OrderItemService orderItemService;
@Autowired
private HttpUtilService httpUtilService;
@Autowired
private FileuploadService fileuploadService;
@Autowired
private OrderStagesService orderStagesService;
@Autowired
private UserService userService;
@Autowired
private AliyunKuaidiService aliyunKuaidiService;
@Autowired
private AntBlockHashService antBlockHashService;
@Autowired
private OrderSupplementService orderSupplementService;
/**
* 发货时同步 - 因为需要发货时的 imei
*/
public void allHash(OrderHashContext context){
// 订单未添加智能合同
/*if(StringUtils.isBlank(context.getOrderMaster().getContractFlowId())){
return ;
}*/
List<OrderItem> items = context.getOrderMaster().getItems();
if(items == null){
items = orderItemService.findByOrderMasterId(context.getOrderMaster().getId());
context.getOrderMaster().setItems(items);
}
this.forEach(items,(index,item)->{
ProductSku sku = productSkuService.findById(item.getSkuId());
String hash = this.productHash(context.getOrderMaster().getId(), sku, context.getMerchant());
antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),hash,"商品["+item.getProductName()+"]HASH");
});
// 用户信息 hash
antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),this.userHash(context),"用户信息hash");
// 订单信息 hash 在订单后面
ContractOss oss = this.ossUrl(context.getOrderMaster(),context.getMerchant());
if(oss != null){
antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),oss.getHash(),"智能合同存证HASH");
String orderHash = this.orderHash(context,oss.getHash(),oss.getOssUrl());
antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),orderHash,"订单HASH");
}
List<OrderStages> stages = context.getOrderMaster().getStages();
if(stages == null){
stages = orderStagesService.findByOrderMasterId(context.getOrderMaster().getId());
}
// 用户订单承诺
String promise = this.userPromise(context.getOrderMaster(),stages,context.getOrderMaster().getAllInsuranceMoney());
antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),promise,"用户承诺HASH");
// 订单商品 hash
String orderProductHash = this.orderProduct(context);
antBlockHashService.saveOrderHash(context.getOrderMaster().getId(),orderProductHash,"订单商品HASH");
// 第一期订单履约 - 在用户支付金额,并且到账后同步
/*int lasNumber = 0; // 剩余期数
ZfbYsqType payType = ZfbYsqType.PAY;
if(OrderUtils.isStages(context.getOrderMaster())){ // 月租订单
payType = ZfbYsqType.STAGES;
lasNumber = stages == null ? 0 : stages.size() - 1;
}
ZfbYsqRecord record = zfbYsqRecordService.findByOrderMasterIdAndType(context.getOrderMaster().getId(),payType);
String rental = this.orderRental(context.getOrderMaster(),1,lasNumber, record);
JSONArray array = new JSONArray();
array.add(rental);
ret.put("rental",array);*/
}
/**
* 用户确认收货
*/
public void userConfirm(OrderMaster master){
this.orderWl(master);
}
public String orderHash(OrderHashContext context,String hash,String ossUrl){
// 总租金 - 总的保险金额,保险金额不算
Double allRentMoney = OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(context.getOrderMaster())
- context.getOrderMaster().getAllInsuranceMoney();
// 总押金
Long money = this.getMoneyLi(context.getOrderMaster().getAllPledge());
// 单价
Long unitMoney = this.getMoneyLi(allRentMoney/context.getOrderMaster().getDay());
JSONObject order = new JSONObject();
order.put("orderId",context.getOrderMaster().getId());
order.put("orderCreateTime",this.getDate(context.getOrderMaster().getCreateDate()) );
order.put("orderPayTime",this.getDate(context.getOrderMaster().getPayDate()));
order.put("orderPayId",context.getOrderMaster().getId());
order.put("orderPayType","1");
order.put("depositFree",money); //
order.put("acutalPreAuthFree",money);
order.put("rentTerm",this.getUnitDay(context.getOrderMaster())); // 单位
order.put("rentPricePerMonth",unitMoney); // 月租金
order.put("buyOutPrice",money); // 买断价格
order.put("leaseServiceFileHash",hash);
order.put("leaseServiceFileTxHash",hash);
order.put("leaseContractUrl",ossUrl);
order.put("dueMode","1");
order.put("totalRentMoney",this.getMoneyLi(allRentMoney));
OrderSupplement supplement = orderSupplementService.findByOrderId(context.getOrderMaster().getId());
if(supplement != null){
LeaseRiskVo yd = Utils.parseJson(supplement.getYdTxt(),LeaseRiskVo.class);
if(yd != null){
Double scors = CollectionUtils.isEmpty(yd.getModels()) ? null : NumberUtils.toDouble(yd.getModels().get(0).getScore());
if(scors != null && scors > 0){
order.put("yidunScore",scors.intValue());
}
}
}
String address = context.getOrderMaster().getDeliveryDetailAddress();
if(StringUtils.isBlank(address)){
address = "自提";
}
order.put("userAddress",address);
order.put("provinceCode",context.getOrderMaster().getDeliveryProvinceId()); //
order.put("cityCode",context.getOrderMaster().getDeliveryCityId());
order.put("districtCode",context.getOrderMaster().getDeliveryCountyId());
order.put("storeType","1");
return this.getHash(antCloudService.orderHash(order, AntLeaseType.order));
}
private String userHash(OrderHashContext context){
User user = context.getUser();
String userImageHash = user.getIdCardFrontHash();
User update = new User();
if(StringUtils.isBlank(userImageHash)){
userImageHash = MD5Utils.md5(fileuploadService.download(user.getIdCardFrontUrl()));
this.fileHash(userImageHash);
update.setIdCardFrontHash(userImageHash);
}
String userBackImageHash = user.getIdCardBackHash();
if(StringUtils.isBlank(userBackImageHash)){
userBackImageHash = MD5Utils.md5(fileuploadService.download(user.getIdCardBackUrl()));
this.fileHash(userBackImageHash);
update.setIdCardBackHash(userBackImageHash);
}
if(StringUtils.isNotBlank(update.getIdCardBackHash()) || StringUtils.isNotBlank(update.getIdCardFrontHash())){
userService.update(user.getId(),update);
userService.clearUserinfo(new UserAuthorization(user));
}
Merchant merchant = context.getMerchant();
JSONObject hash = new JSONObject();
hash.put("orderId",context.getOrderMaster().getId());
hash.put("loginId",context.getOrderMaster().getUserId());
hash.put("loginType","1");
hash.put("loginTime",this.getDate(new Date()));
hash.put("userName",user.getTrueName());
hash.put("userId",user.getIdCardNum());
hash.put("userImageHash",userImageHash); //
hash.put("userBackImageHash",userBackImageHash); //
hash.put("userPhoneNumber",user.getMobile());
hash.put("userType","3");
hash.put("alipayUID",user.getZfbUserId());
hash.put("leaseCorpName",merchant.getName());
hash.put("leaseCorpId",merchant.getTaxNumber());
hash.put("leaseCorpOwnerName",merchant.getLegalPerson());
hash.put("lesseeType","2");
hash.put("leasedEnterprise",merchant.getName());
hash.put("userImageUrl",user.getIdCardFrontUrl());
hash.put("userBackImageUrl",user.getIdCardBackUrl());
return this.getHash(antCloudService.orderHash(hash, AntLeaseType.user));
}
private String productHash(Long orderMasterId,ProductSku sku,Merchant merchant){
StringBuilder xh = new StringBuilder();
JSONArray xhjson = JSONArray.parseArray(sku.getAttributes());
for(int i = 0 ; i < xhjson.size(); i ++){
JSONObject xhobj = xhjson.getJSONObject(i);
xh.append(xhobj.getString("value")).append("/");
}
String xhTxt = xh.toString();
if(xhTxt.length() > 30){
xhTxt = xh.substring(0,30);
}
Product product = productService.findById(sku.getProductId());
Brand brand = brandService.findById(product.getBrandId());
JSONObject obj = new JSONObject();
obj.put("productId",this.getProdudId(sku.getProductId(),sku.getId()));
obj.put("productVersion",orderMasterId);
obj.put("productName",product.getName());
obj.put("productPrice",this.getMoneyLi(sku.getDeposit()));
obj.put("mainClass","3C");
obj.put("subClass","3c_other");
obj.put("supplierName",merchant.getName());
obj.put("supplierId",merchant.getId());
obj.put("installPrice","0"); // 安装服务费
obj.put("productOrigin","1"); // 供应商
obj.put("realStock","1"); // 库存
obj.put("estimatedShipment","1"); // 实际出货量
obj.put("productDetailInfo",product.getContentUrl()); // 商品详情
obj.put("productUrl",projectConfig.getDomain()+"/product/detail.json?id="+product.getId());
obj.put("productBrand",brand == null ? "未知":brand.getName()); // 品牌
obj.put("productModel",xhTxt); // 商品型号
obj.put("depositPrice",this.getMoneyLi(sku.getDeposit()));
return this.getHash(antCloudService.orderHash(obj, AntLeaseType.product));
}
private String orderProduct(OrderHashContext context){
JSONObject json = new JSONObject();
json.put("leaseId",chainConfig.getTenantId());
json.put("orderId",context.getOrderMaster().getId());
JSONArray productInfo = new JSONArray();
for(OrderItem item : context.getOrderMaster().getItems()){
JSONObject obj = new JSONObject();
obj.put("productId",this.getProdudId(item.getProductId(),item.getSkuId()));
obj.put("productName",this.getStringMaxLen(item.getProductName(),49));
obj.put("productNumber",item.getNum());
List<String> imeiTxt = this.getImei(String.valueOf(item.getId()),item.getImei(),item.getNum());
obj.put("productImeiId",Utils.listJoin(imeiTxt,","));
obj.put("productVersion",context.getOrderMaster().getId());
// this.getMoneyLi(item.getMoney() * item.getNum() * context.getOrderMaster().getDay())
// 调整为押金
obj.put("productPrice",this.getMoneyLi(item.getPledge() * item.getNum()));
obj.put("supplierId",chainConfig.getTenantId());
productInfo.add(obj);
}
json.put("productInfo",productInfo);
return this.getHash(antCloudService.orderHash(json,AntLeaseType.orderProduct));
}
/**
* 订单履约
*/
public void orderRental(OrderMaster orderMaster,int number,int lasNumber, ZfbYsqRecord record,RentalType type){
JSONObject json = new JSONObject();
json.put("orderId",orderMaster.getId());
json.put("leaseTermIndex",number);
json.put("rentalReturnState",type.getCode());
json.put("rentalMoney",record == null ? 0 : this.getMoneyLi(record.getMoney()));
json.put("returnTime",DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
json.put("returnWay",type.getWay()); // 归还方式,1预授权代扣,2支付宝代扣,3主动还款,4其他
json.put("returnVoucherType",type.getVoucher()); // 还款凭证类型,1支付宝,2平台代收(客户主动还款),3其他
json.put("returnVoucherSerial",record == null ? "qt" : record.getPayId());
json.put("charge",0);
json.put("remainTerm", Math.max(lasNumber, 0));
String hash = this.getHash(antCloudService.orderHash(json,AntLeaseType.rental));
antBlockHashService.saveOrderHash(orderMaster.getId(),hash,"订单履约HASH");
}
/**
* 物流信息
*/
public boolean orderWl(OrderMaster orderMaster){
JSONObject json = new JSONObject();
json.put("orderId",orderMaster.getId());
json.put("leaseId",chainConfig.getTenantId());
json.put("arriveConfirmUrl",projectConfig.getDomain()+"/common/expressQuery.json?com="+orderMaster.getGoExpress()+"&num="+orderMaster.getGoExpressNumber()+"&id="+orderMaster.getId()+"&type=order");
JSONObject tx = this.getWlTxt(orderMaster);
if(tx == null){
return false; // 快递错误
}
String ossUrl = fileuploadService.uploadText(tx.toJSONString());
String hash = MD5Utils.md5(tx.toJSONString());
this.fileHash(hash);
json.put("arriveConfirmTxHash",hash);
json.put("arriveConfirmHash",hash);
json.put("logisticStatus",3);
json.put("arriveConfirmTime",DateUtils.format(new Date()));
json.put("logisticCompanyName",aliyunKuaidiService.getExpressName(orderMaster.getGoExpress()));
json.put("leaseStatus",1);
json.put("logisticsOrderId",orderMaster.getId());
json.put("deliverTime",orderMaster.getGoExpressDate());
JSONObject extraInfo = new JSONObject();
extraInfo.put("wlinfo",ossUrl); // 其他信息
json.put("extraInfo",extraInfo.toJSONString());
String retHash = this.getHash(antCloudService.orderHash(json,AntLeaseType.logistic));
if(StringUtils.isBlank(retHash)){
return false;
}
return antBlockHashService.saveOrderHash(orderMaster.getId(),hash,AntLeaseType.logistic.getDesc());
}
private JSONObject getWlTxt(OrderMaster master){
if(Constants.WU_EXPRESS.equals(master.getGoExpress())){ // 无物流
JSONObject json = new JSONObject();
json.put("state",5);
json.put("comName","无物流-自取");
json.put("info", master.getGoExpressDate() +" 无物流自取");
return json;
}
return aliyunKuaidiService.query(master.getGoExpress(),master.getGoExpressNumber(),master.getDeliveryMobile());
}
public String userPromise(OrderMaster orderMaster, List<OrderStages> stages,Double allInsuranceMoney){
// 日租订单
if(this.isEmpty(stages) && RentType.day.name().equals(orderMaster.getRentType())){
stages = new ArrayList<>();
OrderStages item = new OrderStages();
item.setRefundDate(orderMaster.getBeginDate());
item.setMoney(OrderUtils.getAllRentMoneyAndExcludeDiscountMoney(orderMaster));
stages.add(item);
}
JSONObject json = new JSONObject();
json.put("orderId",orderMaster.getId());
json.put("limit",0);
JSONArray payDateList = new JSONArray();
JSONArray payMoneyList = new JSONArray();
for(OrderStages item : stages){
payDateList.add(DateFormatUtils.format(item.getRefundDate(),"yyyy-MM-dd HH:mm:ss"));
Double money = item.getMoney();
if(item.getSort() == 1){ // 第一期需要扣减保险上链金额
money = money - (allInsuranceMoney == null ? 0 : allInsuranceMoney);
}
payMoneyList.add(this.getMoneyLi(money));
}
json.put("payDateList",payDateList);
json.put("payPeriod",this.getUnitDay(orderMaster));
json.put("payMoneyList",payMoneyList);
AppletIdEnum appletIdEnum = AppletIdEnum.get(orderMaster.getAppletSource());
json.put("leaseAlipayUid",zfbService.getPid(appletIdEnum.getAppid()));
return this.getHash(antCloudService.orderHash(json,AntLeaseType.leasePromise));
}
/**
* 文件 hash
*/
public String fileHash(String hash){
boolean res = antCloudService.leaseBiznotary(hash, Constants.COMPANY_CODE,Constants.COMPANY_NAME,Constants.LEGAL_PERSON);
return res?hash:"";
}
public ContractOss ossUrl(OrderMaster master,Merchant merchant){
String url = this.getContractUrl(master.getContractFlowId());
if (StringUtils.isNotBlank(url)) {
byte[] data = httpUtilService.donwnloadFile(url);
String hash = MD5Utils.md5(data);
String key = (projectConfig.getApiDebug() ? "test/" : "") + "contract/" + master.getOrderNumber() + ".pdf";
String ossUrl = fileuploadService.uploadAndKey(new ByteArrayInputStream(data), key);
boolean hashRes = antCloudService.leaseBiznotary(hash,merchant.getTaxNumber(),merchant.getName(),merchant.getLegalPerson());
if (hashRes) {
return new ContractOss(hash,ossUrl);
}
}
return null;
}
@Data
private class ContractOss{
public ContractOss(String hash,String ossUrl){
this.hash = hash;
this.ossUrl = ossUrl;
}
private String hash;
private String ossUrl;
}
private String getContractUrl(String flowId) {
try {
DownloadContractDocumentResponse response = antCloudService.twcNotaryContractDocumentDownload(flowId);
if (response.getDocs() != null && response.getDocs().size() > 0) {
return response.getDocs().get(0).getFileUrl();
}
log.error("获取合同下载地址返回 flowId = {},body={}", flowId, JSON.toJSONString(response));
} catch (Exception e) {
log.error("获取只能合同错误,flowId={}", flowId, e);
}
return "";
}
private List<String> getImei(String orderItemId,String imeiTxt,int len){
String [] imei = StringUtils.isBlank(imeiTxt) ? null : StringUtils.split(imeiTxt,",");
List<String> list = new ArrayList<>();
int jsonLen = imei == null ? 0 : imei.length;
for (int i = 0; i < len; i++) {
list.add(i + orderItemId+":"+(i < jsonLen ? imei[i] : ""));
}
return list;
}
private String getHash(CreateLeaseBizResponse res){
return res == null ? "" : res.getResponseData();
}
private String getDate(Date date){
return DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss");
}
private Long getMoneyLi(Double money){
return Double.valueOf(money * 10000).longValue();
}
private String getProdudId(Long productId, Long skuId){
return productId+":"+skuId;
}
private String getStringMaxLen(String str,int len){
if(str == null){
return null;
}
if(len >= str.length()){
return str;
}
return str.substring(0,len);
}
private int getUnitDay(OrderMaster orderMaster){
if(RentType.day.name().equals(orderMaster.getRentType())){
return 1; // 日租订单只有一个月
}
return OrderUtils.getMonthLen(orderMaster.getDay());
}
/**
* 用户的履约状态
*/
public enum RentalType{
ZEGH(1,1,1,"足额归还"),
OFFLINE(1,4,3,"足额归还"), // 线下支付
BFGH(2,1,1,"部分归还"),
WGH(3,4,3,"未归还"),
TZ(4,4,3,"退租"),
YWJ(5,1,1,"已完结")
;
RentalType(int code,int way,int voucher,String name){
this.code = code;
this.way = way;
this.voucher = voucher;
this.name = name;
}
private final int code; // 租金归还状态,1足额归还,2部分归还,3未归还,4退租,5该订单整个生命周期已完结
private final int way; // 归还方式,1预授权代扣,2支付宝代扣,3主动还款,4其他
private final int voucher; // 还款凭证类型,1支付宝,2平台代收(客户主动还款),3其他
private final String name;
public int getCode() {
return code;
}
public String getName() {
return name;
}
public int getWay() {
return way;
}
public int getVoucher() {
return voucher;
}
}
}
AntUploadContractTemplateService
package com.zhiwei.rent.service.blockchain;
import cn.com.antcloud.api.twc.v1_0_0.response.CreateContractTemplateResponse;
import com.zhiwei.rent.service.CacheService;
import com.zhiwei.rent.util.CacheKeysUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
@Service
public class AntUploadContractTemplateService {
@Autowired
private CacheService cacheService;
@Autowired
private AntCloudService antCloudService;
public String getContinueTemplateId() throws Exception{
CacheKeysUtils.CacheKey key = CacheKeysUtils.getContractTemplateId();
String templateId = cacheService.get(key.getKey());
if(StringUtils.isNotBlank(templateId)){
return templateId;
}
// 获取合同模版文件
byte [] contractTemplateFile = antCloudService.getContinueContractTemplateFileByte();
String uploadUrl = "";
// 通过文件上传方式创建电子合同签署模板
CreateContractTemplateResponse createContractTemplateResponse = antCloudService.twcNotaryContractTemplateCreate(contractTemplateFile);
if (createContractTemplateResponse != null) {
if ("200".equals(createContractTemplateResponse.getResultCode())) {
templateId = createContractTemplateResponse.getTemplateId();
uploadUrl = createContractTemplateResponse.getUploadUrl();
} else {
throw new Exception(String.format("创建电子合同签署模板失败:%s", createContractTemplateResponse.getResultMsg()));
}
} else {
throw new Exception("创建电子合同签署模板失败");
}
// 上传电子合同模板
try {
boolean isSuccess = antCloudService.twcNotaryContractPlatformTemplateUpload(uploadUrl, contractTemplateFile);
if (!isSuccess) {
throw new Exception("上传电子合同模板失败");
}
} catch (IOException e) {
e.printStackTrace();
throw new Exception("上传电子合同模板失败",e);
}
cacheService.set(key,templateId);
return templateId;
}
public String getTemplateId() throws Exception{
CacheKeysUtils.CacheKey key = CacheKeysUtils.getContractTemplateId();
String templateId = cacheService.get(key.getKey());
if(StringUtils.isNotBlank(templateId)){
return templateId;
}
// 获取合同模版文件
byte [] contractTemplateFile = antCloudService.getContractTemplateFileByte();
String uploadUrl = "";
// 通过文件上传方式创建电子合同签署模板
CreateContractTemplateResponse createContractTemplateResponse = antCloudService.twcNotaryContractTemplateCreate(contractTemplateFile);
if (createContractTemplateResponse != null) {
if ("200".equals(createContractTemplateResponse.getResultCode())) {
templateId = createContractTemplateResponse.getTemplateId();
uploadUrl = createContractTemplateResponse.getUploadUrl();
} else {
throw new Exception(String.format("创建电子合同签署模板失败:%s", createContractTemplateResponse.getResultMsg()));
}
} else {
throw new Exception("创建电子合同签署模板失败");
}
// 上传电子合同模板
try {
boolean isSuccess = antCloudService.twcNotaryContractPlatformTemplateUpload(uploadUrl, contractTemplateFile);
if (!isSuccess) {
throw new Exception("上传电子合同模板失败");
}
} catch (IOException e) {
e.printStackTrace();
throw new Exception("上传电子合同模板失败",e);
}
cacheService.set(key,templateId);
return templateId;
}
}
AntCloudAccountService
package com.zhiwei.rent.service.blockchain;
import cn.com.antcloud.api.twc.v1_0_0.response.*;
import com.alibaba.fastjson.JSON;
import com.zhiwei.rent.common.CommonException;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.model.merchant.Merchant;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.CacheService;
import com.zhiwei.rent.service.blockchain.vo.AntOrgInfo;
import com.zhiwei.rent.service.blockchain.vo.OrgInfo;
import com.zhiwei.rent.service.user.UserService;
import com.zhiwei.rent.util.CacheKeysUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @date 2020年09月03日19时59分
*/
@Service
public class AntCloudAccountService {
private final Logger logger = LoggerFactory.getLogger(AntCloudAccountService.class);
@Autowired
private CacheService cacheService;
@Autowired
private AntCloudService antCloudService;
@Autowired
private UserService userService;
private OrgInfo getOrgInfo(Merchant merchant){
OrgInfo info = new OrgInfo();
if(merchant == null){
info.setCompanyName(Constants.COMPANY_NAME);
info.setCompanyCode(Constants.COMPANY_CODE);
info.setLegalPerson(Constants.LEGAL_PERSON);
info.setLegalPersonIdCardNo(Constants.LEGAL_ID_CARD_NO);
return info;
}
info.setCompanyName(merchant.getLicenseName());
info.setCompanyCode(merchant.getTaxNumber());
info.setLegalPerson(merchant.getLegalPerson());
info.setLegalPersonIdCardNo(merchant.getLegalPersonIdNo());
return info;
}
public AntOrgInfo getAccountByType(Merchant merchant, String username, String idCardNo, String mobile) throws Exception{
OrgInfo info = this.getOrgInfo(merchant);
Long id = merchant == null ? 0L: merchant.getId();
// 获取合同签署平台方个人账号ID
CacheKeysUtils.CacheKey contractPlatformAccountIdCacheKey = CacheKeysUtils.getContractPlatformAccountId(id);
String platformAccountId = cacheService.get(contractPlatformAccountIdCacheKey,()->{
CreateContractAccountResponse createContractAccountResponse = antCloudService.twcNotaryContractAccountCreate(username,idCardNo,mobile);
if (createContractAccountResponse != null) {
if ("200".equals(createContractAccountResponse.getResultCode())) {
return createContractAccountResponse.getAccountId();
}
logger.error("电子合同平台方个人账号注册失败,username={},idcardNo={},mobile={},msg={}",username,idCardNo,mobile,JSON.toJSONString(createContractAccountResponse));
}
return null;
});
// 判断账号是否存在,不存在则注册
if (StringUtils.isBlank(platformAccountId)) {// 平台方个人账号注册
throw new Exception("电子合同平台方个人账号注册失败");
}
// 获取合同签署平台方企业账号ID
CacheKeysUtils.CacheKey contractPlatformOrgIdCacheKey = CacheKeysUtils.getContractPlatformOrgId(id);
String platformOrgId = cacheService.get(contractPlatformOrgIdCacheKey,()->{
CreateContractOrganizationResponse createContractOrganizationResponse = antCloudService.twcNotaryContractOrganizationCreate(platformAccountId,info);
if (createContractOrganizationResponse != null) {
logger.info(JSON.toJSONString(createContractOrganizationResponse));
if ("200".equals(createContractOrganizationResponse.getResultCode())) {
return createContractOrganizationResponse.getOrgId();
}
logger.error("orgInfo={},username={},idCardNo={},mobile={},msg={}",JSON.toJSONString(info),username,idCardNo,mobile,JSON.toJSONString(createContractOrganizationResponse));
}
return null;
});
// 判断账号是否存在,不存在则注册
if (StringUtils.isBlank(platformOrgId)) {// 平台方企业账号注册
throw new Exception("电子合同平台方企业账号注册失败");
}
// 获取平台企业账号印章ID
CacheKeysUtils.CacheKey contractPlatformOrgSealIdCacheKey = CacheKeysUtils.getContractPlatformOrgSealId(id);
String platformOrgSealId = cacheService.get(contractPlatformOrgSealIdCacheKey,()->{
CreateContractOrgsealResponse createContractOrgsealResponse = antCloudService.twcNotaryContractOrgsealCreate(platformOrgId);
if (createContractOrgsealResponse != null) {
if ("200".equals(createContractOrgsealResponse.getResultCode())) {
return createContractOrgsealResponse.getSealId();
}
logger.error("获取平台企业账号印章ID:{},{},{},{}",username,idCardNo,mobile,JSON.toJSONString(createContractOrgsealResponse));
}
return null;
});
// 判断印章是否存在,不存在则创建
if (StringUtils.isBlank(platformOrgSealId)) {// 平台方企业印章创建
throw new Exception("电子合同平台方企业账号印章创建失败");
}
// 平台方自动签署授权
AuthContractSignResponse platformAuthContractSignResponse = antCloudService.twcNotaryContractSignAuth(platformOrgId);
if (platformAuthContractSignResponse != null) {
logger.info("reqBody={}", JSON.toJSONString(platformAuthContractSignResponse));
if (!"200".equals(platformAuthContractSignResponse.getResultCode()) || !platformAuthContractSignResponse.getAccepted()) {
throw new Exception(String.format("平台方自动签署授权失败:%s,ID=%s", platformAuthContractSignResponse.getResultMsg(),id));
}
} else {
throw new Exception("平台方自动签署授权失败,ID="+id);
}
AntOrgInfo ret = new AntOrgInfo();
ret.setAccountId(platformAccountId);
ret.setOrgId(platformOrgId);
ret.setOrgSealId(platformOrgSealId);
return ret;
}
public AntOrgInfo getUserAccountInfo(User user) throws Exception{
String userAccountId;
// 判断合同签署用户方个人账号是否存在,不存在则注册
if (StringUtils.isBlank(user.getContractUserId())) {
// 用户方个人账号注册
CreateContractAccountResponse createContractAccountResponse = antCloudService.twcNotaryContractAccountCreate(user.getTrueName(),user.getIdCardNum(),user.getMobile());
if (createContractAccountResponse != null) {
if ("200".equals(createContractAccountResponse.getResultCode())) {
userAccountId = createContractAccountResponse.getAccountId();
// 更新用户信息
userService.update(user.getId(), new User() {{
setContractUserId(userAccountId);
}});
} else {
throw new Exception(String.format("电子合同用户方个人账号注册失败:%s", createContractAccountResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同用户方个人账号注册失败");
}
} else {
userAccountId = user.getContractUserId();
}
String userSealId;
// 判断合同签署用户方个人账号印章是否存在,不存在则创建
if (StringUtils.isBlank(user.getContractSealId())) {
// 用户方个人印章创建
CreateContractAccountsealResponse createContractAccountsealResponse = antCloudService.twcNotaryContractSccountsealCreate( userAccountId);
if (createContractAccountsealResponse != null) {
if ("200".equals(createContractAccountsealResponse.getResultCode())) {
userSealId = createContractAccountsealResponse.getSealId();
// 更新用户信息
userService.update(user.getId(), new User() {{
setContractSealId(userSealId);
}});
} else {
throw new Exception(String.format("电子合同用户方个人账号印章创建失败:%s", createContractAccountsealResponse.getResultMsg()));
}
} else {
throw new Exception("电子合同用户方个人账号印章创建失败");
}
} else {
userSealId = user.getContractSealId();
}
// 用户方自动签署授权
AuthContractSignResponse userAuthContractSignResponse = antCloudService.twcNotaryContractSignAuth(userAccountId);
if (userAuthContractSignResponse != null) {
if (!"200".equals(userAuthContractSignResponse.getResultCode()) || !userAuthContractSignResponse.getAccepted()) {
throw new CommonException(String.format("用户方自动签署授权失败:%s,ID=%s", userAuthContractSignResponse.getResultMsg(),user.getId()));
}
} else {
throw new Exception("用户方自动签署授权失败"+user.getId());
}
AntOrgInfo info = new AntOrgInfo();
info.setAccountId(userAccountId);
info.setOrgSealId(userSealId);
return info;
}
}
AntCloudService
package com.zhiwei.rent.service.blockchain;
import cn.com.antcloud.api.AntFinTechApiClient;
import cn.com.antcloud.api.AntFinTechProfile;
import cn.com.antcloud.api.twc.v1_0_0.model.*;
import cn.com.antcloud.api.twc.v1_0_0.request.*;
import cn.com.antcloud.api.twc.v1_0_0.response.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhiwei.rent.common.AntLeaseType;
import com.zhiwei.rent.common.Constants;
import com.zhiwei.rent.config.AntBlockChainConfig;
import com.zhiwei.rent.config.ProjectConfig;
import com.zhiwei.rent.model.user.User;
import com.zhiwei.rent.service.FileuploadService;
import com.zhiwei.rent.service.blockchain.vo.AntOrgInfo;
import com.zhiwei.rent.service.blockchain.vo.OrgInfo;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.*;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class AntCloudService {//区块链技术
private final Logger logger = LoggerFactory.getLogger(AntCloudService.class);
@Autowired
private AntBlockChainConfig antBlockChainConfig;
@Autowired
private ProjectConfig projectConfig;
@Autowired
private FileuploadService fileuploadService;
private static final String fileName = "contract-template.pdf"; // 文件名
public AntFinTechApiClient getClient(){
AntFinTechProfile profile = AntFinTechProfile.getProfile(
"https://prodapigw.cloud.alipay.com",
antBlockChainConfig.getAccessKey(), // AccessKey
antBlockChainConfig.getSecret() // SecretKey
);
return new AntFinTechApiClient(profile);
}
public String getProductInstanceId(){
if(projectConfig.getApiDebug()){
return "notary-api-test";
}
return "notary-api-prod";
}
public byte [] getContractTemplateFileByte(){
return fileuploadService.download("xxxxx");
}
//续租合同
public byte[] getContinueContractTemplateFileByte(){
return fileuploadService.download("C:\\Users\\Lemon\\Desktop\\续租合同.pdf");
}
/**
* 电子合同平台方注册
*/
public CreateContractPlatformResponse twcNotaryContractPlatformCreate() {
CreateContractPlatformResponse response = null;
try {
// 构建请求
CreateContractPlatformRequest request = new CreateContractPlatformRequest();
ContractAccountApplication creator = new ContractAccountApplication();
creator.setUserId("1");
request.setCreator(creator);
ContractOrganizationApplication platform = new ContractOrganizationApplication();
platform.setIdNumber(Constants.COMPANY_CODE);
platform.setIdType("CRED_ORG_USCC");
platform.setLegalPerson(Constants.LEGAL_PERSON);
platform.setLegalPersonId(Constants.LEGAL_ID_CARD_NO);
platform.setName(Constants.COMPANY_NAME);
request.setPlatform(platform);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 创建智能合同模板
*/
public CreateContractPlatformtemplateResponse twcNotaryContractPlatformTemplateCreate(InputStream contractFile) {
CreateContractPlatformtemplateResponse response = null;
try {
// 构建请求
CreateContractPlatformtemplateRequest request = new CreateContractPlatformtemplateRequest();
request.setContentMd5(calcNotaryContractFileMD5(contractFile));
request.setContentType("application/octet-stream");
request.setConvert2Pdf(false);
request.setFileName(fileName);
List<ContractPlatformSignField> contractPlatformSignFields = new ArrayList<>();
ContractPlatformSignField contractPlatformSignField = new ContractPlatformSignField();
contractPlatformSignField.setAddSignTime(true);
contractPlatformSignField.setOrder(1l);
contractPlatformSignField.setPosPage("1");
contractPlatformSignField.setPosX("350");
contractPlatformSignField.setPosY("450");
contractPlatformSignFields.add(contractPlatformSignField);
request.setSignFields(contractPlatformSignFields);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 上传智能合同模板
*/
public boolean twcNotaryContractPlatformTemplateUpload(String url,byte [] contractFile) throws IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpPut httpPut = new HttpPut(url);
httpPut.setHeader("Content-Type", "application/octet-stream");
httpPut.setHeader("Content-MD5", calcNotaryContractFileMD5(new ByteArrayInputStream(contractFile)));
httpPut.setEntity(new InputStreamEntity(new ByteArrayInputStream(contractFile), ContentType.APPLICATION_OCTET_STREAM));
CloseableHttpResponse execute = httpclient.execute(httpPut);
if (execute.getStatusLine().getStatusCode() == 200) {
String result = EntityUtils.toString(execute.getEntity(), "UTF-8");
JSONObject object = JSON.parseObject(result);
if (object.getIntValue("errCode") == 0) {
return true;
}
}
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpclient.close();
}
}
/**
* 电子合同平台方的用户注册
*/
public CreateContractUserResponse twcNotaryContractUserCreate(User user) {
CreateContractUserResponse response = null;
try {
// 构建请求
CreateContractUserRequest request = new CreateContractUserRequest();
ContractAccountApplication contractAccountApplication = new ContractAccountApplication();
contractAccountApplication.setEmail("");
contractAccountApplication.setIdNumber(user.getIdCardNum());
contractAccountApplication.setIdType("CRED_PSN_CH_IDCARD");
contractAccountApplication.setMobile(user.getMobile());
contractAccountApplication.setName(user.getTrueName());
contractAccountApplication.setUserId(user.getId().toString());
request.setUser(contractAccountApplication);
request.setUserType("PERSON");
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 电子合同平台方发起手动签署流程
*/
public StartContractHandsignResponse twcNotaryContractHandsignStart(User user, String template, String userAccount) {
StartContractHandsignResponse response = null;
try {
// 构建请求
StartContractHandsignRequest request = new StartContractHandsignRequest();
request.setAutoArchive(true);
request.setBusinessScene(Constants.WEBSIT_NAME + "平台用户协议");
ContractSignFlowConfig contractSignFlowConfig = new ContractSignFlowConfig();
contractSignFlowConfig.setNoticeType("1");
contractSignFlowConfig.setSignPlatform("1");
request.setContractSignFlowConfig(contractSignFlowConfig);
JSONObject formFields = new JSONObject();
formFields.put("s_name", user.getTrueName());
formFields.put("s_id_card_number", user.getIdCardNum());
request.setSimpleFormFields(formFields.toJSONString());
request.setTemplate(template);
request.setUserAccount(userAccount);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 签署流程查询
* @param flowId 合同ID
*/
public QueryContractFlowResponse twcNotaryContractFlowQuery(String flowId) {
QueryContractFlowResponse response = null;
try {
// 构建请求
QueryContractFlowRequest request = new QueryContractFlowRequest();
request.setFlowId(flowId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 创建电子合同签署个人帐户
*/
public CreateContractAccountResponse twcNotaryContractAccountCreate(String username,String idCardNo,String mobile) {
CreateContractAccountResponse response = null;
try {
// 构建请求
CreateContractAccountRequest request = new CreateContractAccountRequest();
request.setIdNumber(idCardNo);
request.setIdType("CRED_PSN_CH_IDCARD");
request.setMobile(mobile);
request.setName(username);
request.setUserId(idCardNo);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public QueryContractOrganizationResponse twcNotaryContractOrganizationQuery(String accountId, OrgInfo info) {
QueryContractOrganizationResponse response = null;
try {
// 构建请求
QueryContractOrganizationRequest request = new QueryContractOrganizationRequest();
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 创建电子合同签署机构帐户
*/
public CreateContractOrganizationResponse twcNotaryContractOrganizationCreate(String accountId, OrgInfo info) {
CreateContractOrganizationResponse response = null;
try {
// 构建请求
CreateContractOrganizationRequest request = new CreateContractOrganizationRequest();
request.setCreator(accountId);
request.setIdNumber(info.getCompanyCode());
request.setIdType("CRED_ORG_USCC");
request.setLegalPerson(info.getLegalPerson());
request.setLegalPersonId(info.getLegalPersonIdCardNo());
request.setName(info.getCompanyName());
request.setUserId(info.getCompanyCode());
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 创建电子合同机构帐户印章
*/
public CreateContractOrgsealResponse twcNotaryContractOrgsealCreate(String accountId) {
CreateContractOrgsealResponse response = null;
try {
CreateContractOrgsealRequest request = new CreateContractOrgsealRequest();
request.setAlias(String.valueOf(System.currentTimeMillis()));
request.setCentral("STAR");
request.setColor("RED");
request.setOrgId(accountId);
request.setType("TEMPLATE_ROUND");
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 创建电子合同个人帐户印章
*/
public CreateContractAccountsealResponse twcNotaryContractSccountsealCreate(String accountId) {
CreateContractAccountsealResponse response = null;
try { // 构建请求
CreateContractAccountsealRequest request = new CreateContractAccountsealRequest();
request.setAccountId(accountId);
request.setColor("RED");
request.setAlias(String.valueOf(System.currentTimeMillis()));
request.setHeight(100L);
request.setType("BORDERLESS");
request.setWidth(100L);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 静默签署授权
*/
public AuthContractSignResponse twcNotaryContractSignAuth(String accountId) {
AuthContractSignResponse response = null;
try {
// 构建请求
AuthContractSignRequest request = new AuthContractSignRequest();
request.setAccountId(accountId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 创建电子合同签署流程
*/
public CreateContractFlowResponse twcNotaryContractFlowCreate(String accountId, String orgId) {
CreateContractFlowResponse response = null;
try {
// 构建请求
CreateContractFlowRequest request = new CreateContractFlowRequest();
request.setAutoArchive(true);
request.setBusinessScene(Constants.WEBSIT_NAME + "平台用户协议");
ContractSignFlowConfig contractSignFlowConfig = new ContractSignFlowConfig();
contractSignFlowConfig.setNoticeType("");
contractSignFlowConfig.setSignPlatform("1");
request.setConfigInfo(contractSignFlowConfig);
request.setInitiatorAccountId(accountId);
request.setInitiatorAuthorizedAccountId(orgId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 通过文件上传方式创建电子合同签署模板
* @param contractFile 合同文件二进制数据
*/
public CreateContractTemplateResponse twcNotaryContractTemplateCreate(byte [] contractFile) {
CreateContractTemplateResponse response = null;
try {
// 构建请求
CreateContractTemplateRequest request = new CreateContractTemplateRequest();
request.setContentMd5(calcNotaryContractFileMD5(new ByteArrayInputStream(contractFile)));
request.setContentType("application/octet-stream");
request.setConvert2Pdf(false);
request.setFileName(fileName);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 通过电子合同模板添加文档
* @param templateId 模版ID
* @param params 参数
* @return null
*/
public AddContractFileResponse twcNotaryContractFileAdd(String templateId, Map<String, String> params) {
AddContractFileResponse response = null;
try {
// 构建请求
AddContractFileRequest request = new AddContractFileRequest();
request.setName(Constants.WEBSIT_NAME+"平台用户协议");
request.setSimpleFormFields(JSON.toJSONString(params));
request.setTemplateId(templateId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
logger.info("reqBody={}",JSON.toJSONString(request));
response = this.getClient().execute(request);
} catch (Exception e) {
logger.error("智能合同模板上传错误",e);
}
return response;
}
/**
* 向电子合同签署流程中添加待签署文档
* @param flowId 合同ID
* @param fileId 文件ID
* @return null
*/
public AddContractDocumentResponse twcNotaryContractDocumentAdd(String flowId, String fileId) {
AddContractDocumentResponse response = null;
try {
// 构建请求
AddContractDocumentRequest request = new AddContractDocumentRequest();
List<ContractDoc> contractDocList = new ArrayList<>();
ContractDoc contractDoc = new ContractDoc();
contractDoc.setEncryption(0L);
contractDoc.setFileId(fileId);
contractDocList.add(contractDoc);
request.setDocs(contractDocList);
request.setFlowId(flowId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 添加电子合同签署方自动盖章签署区
*
* @param flowId 合同ID
* @param fileId 文件ID
*/
public AddContractSignfieldResponse twcNotaryContractSignfieldAdd(String flowId,
String fileId, AntOrgInfo platform,AntOrgInfo jf,AntOrgInfo user) {
AddContractSignfieldResponse response = null;
try {
// 构建请求
AddContractSignfieldRequest request = new AddContractSignfieldRequest();
request.setFlowId(flowId);
List<ContractSignFieldApplication> contractSignFieldApplicationList = new ArrayList<>();
// 签章1:甲方 - 商家
contractSignFieldApplicationList.add(this.createSign(fileId,jf.getOrgId(),jf.getOrgSealId(),1,9,300,300));
// 签章2:乙方 - 用户
contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),2,9,200,350));
// 签章3:丙方 - 平台
contractSignFieldApplicationList.add(this.createSign(fileId,platform.getOrgId(),platform.getOrgSealId(),2,9,200,200));
// 签章1:甲方 - 商家
contractSignFieldApplicationList.add(this.createSign(fileId,jf.getOrgId(),jf.getOrgSealId(),1,14,450,150));
// 签章3:丙方 - 平台
contractSignFieldApplicationList.add(this.createSign(fileId,platform.getOrgId(),platform.getOrgSealId(),2,14,300,150));
// 签章2:乙方 - 用户
contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),2,14,170,170));
// 签章3:用户 - 授权签名
contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),6,16,250,740));
contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),6,21,450,580));
// contractSignFieldApplicationList.add(this.createSign(fileId,platform.getOrgId(),platform.getOrgSealId(),7,21,200,550));
contractSignFieldApplicationList.add(this.createSign(fileId,user.getAccountId(),user.getOrgSealId(),6,23,250,700));
// 添加签署区
request.setSignfields(contractSignFieldApplicationList);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
private ContractSignFieldApplication createSign(String fileId,String orgId,String sealId,int order,int page,int x,int y){
ContractSignFieldApplication platField = new ContractSignFieldApplication();
platField.setAddSignTime(false);
platField.setAuthorizedAccountId(orgId);
platField.setFileId(fileId);
platField.setOrder((long)order);
platField.setPosPage(String.valueOf(page));
platField.setPosX(String.valueOf(x));
platField.setPosY(String.valueOf(y));
platField.setSealId(sealId);
return platField;
}
/**
* 电子合同签署流程开启
* @param flowId 合同ID
*/
public StartContractFlowResponse twcNotaryContractFlowStart(String flowId) {
StartContractFlowResponse response = null;
try {
// 构建请求
StartContractFlowRequest request = new StartContractFlowRequest();
request.setFlowId(flowId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 电子合同签署流程归档
* @param flowId 合同ID
*/
public SaveContractFlowResponse twcNotaryContractFlowSave(String flowId) {
SaveContractFlowResponse response = null;
try {
// 构建请求
SaveContractFlowRequest request = new SaveContractFlowRequest();
request.setFlowId(flowId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
/**
* 电子合同流程文档下载
*
* @param flowId 合同ID
*/
public DownloadContractDocumentResponse twcNotaryContractDocumentDownload(String flowId) {
DownloadContractDocumentResponse response = null;
try {
// 构建请求
DownloadContractDocumentRequest request = new DownloadContractDocumentRequest();
request.setFlowId(flowId);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
response = this.getClient().execute(request);
} catch (Exception e) {
logger.error("flowId={}",flowId,e);
}
return response;
}
public CreateLeaseBizResponse orderHash(JSONObject json, AntLeaseType type){
// 构建请求
CreateLeaseBizRequest request = new CreateLeaseBizRequest();
request.setBizContent(json.toJSONString());
request.setType(type.name());
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
try {
logger.info(type.getDesc() + "存证body={}",json.toJSONString());
CreateLeaseBizResponse response = this.getClient().execute(request);
logger.info(type.getDesc() + "存证返回body={}",JSON.toJSONString(response));
if(StringUtils.isBlank(response.getResponseData())){
return null;
}
return response;
}catch (Exception e){
logger.error(type.getDesc() + "存储错误,json={},type={}",json.toJSONString(),type.name(),e);
}
return null;
}
public String queryByOrderId(Long orderId,AntLeaseType type){
QueryLeaseBizRequest request = new QueryLeaseBizRequest();
request.setBizContent("{\"orderId\":\""+orderId+"\"}");
request.setType(type.name());
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
try {
logger.info(type.getDesc()+"存证结果查询 orderId={},type={}",orderId,type.name());
QueryLeaseBizResponse response = this.getClient().execute(request);
logger.info(type.getDesc()+"存证结果查询返回 body={}",JSON.toJSONString(response));
if(StringUtils.isBlank(response.getResponseData())){
return null;
}
return response.getResponseData();
}catch (Exception e){
logger.error(type.getDesc() + "存证结果查询错误,orderId={},type={}",orderId,type.name());
}
return null;
}
public boolean leaseBiznotary(String hash,String leaseCorpId,String leaseCorpName,String leaseCorpOwnerName){
CreateLeaseBiznotaryRequest request = new CreateLeaseBiznotaryRequest();
request.setHash(hash);
request.setLeaseCorpId(leaseCorpId);
request.setLeaseCorpName(leaseCorpName);
request.setLeaseCorpOwnerName(leaseCorpOwnerName);
request.setProductInstanceId(this.getProductInstanceId());
request.setRegionName(Constants.ALIPAY_REGION_NAME);
// 发送请求,并且获取响应结果
try {
logger.info("req={}",JSON.toJSONString(request));
CreateLeaseBiznotaryResponse response = this.getClient().execute(request);
logger.info("租赁平台存证文件哈希返回hash={},leaseCorpId={},leaseCorpName={},leaseCorpOwnerName={},body={}",hash,leaseCorpId,leaseCorpName,leaseCorpOwnerName,JSON.toJSONString(response));
return Long.valueOf(0).equals(response.getCode());
}catch (Exception e){
logger.error("租赁平台存证文件哈希错误,hash={},leaseCorpId={},leaseCorpName={},leaseCorpOwnerName={}",hash,leaseCorpId,leaseCorpName,leaseCorpOwnerName);
}
return false;
}
/**
* 计算电子合同文件的MD5并返回Base64编码值
*/
private String calcNotaryContractFileMD5(InputStream fileInputStream) {
try {
MessageDigest MD5 = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[8092];
int length;
while ((length = fileInputStream.read(buffer)) != -1) {
MD5.update(buffer, 0, length);
}
// 取摘要的base64
return Base64.encodeBase64String(MD5.digest());
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}