接口流程拉通方案.docx_第1页
接口流程拉通方案.docx_第2页
接口流程拉通方案.docx_第3页
接口流程拉通方案.docx_第4页
接口流程拉通方案.docx_第5页
免费预览已结束,剩余44页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

接口流程拉通方案 文档变更记录序号变更(+/-)说明作者版本号日期批准1接口流程拉通方案方浩1.02016.9.62 1. 引言1.1 编写目的和范围美的消费金融整个流程是通过把各个业务做成接口通过dubbo对外提供服务。各个模块之间是通过调用接口来实现业务的。对于开发人员:此文档例出接口提供方应实现哪些接口和接口调用方对应的调用接口的方法,以及各模块接口调用的关系。对于业务人员帮助熟悉理解整个流程,更好理解各业务模块之间的关系。2. 接口设计总体概述2.1 流程概述本方案涉及的接口有产品,渠道,风控,贷前贷中,核算,涉及到的系统有EDP,渠道,cmis,核算系统之间通过互调接口实现业务整个业务流程接口,渠道调产品的接口得到相关的产品信息然后调风控的接口进行信用的评估,评估通过后在cmis中进行美的贷审批,审批后调用核算接口进行放款结算相关业务,流程图如下:3. 各个模块之间接口互相调用关系各个模块之间接口提供者和调用分开,各个模块接口由各组成员开发实现,对外通过duboo暴露接口注入zookeeper当业务需要调用接口的时候直接调用暴露的接口实现业务各接口调用关系如下:3.1 产品组3.2 风控组3.3 核算组3.4 渠道组3.5 贷前贷中组4. 接口串连demo4.1 Web容器加载dubbo启动类Tomcat启动时读取配置文件web.xml,web.xml所在目录:/cmismd/WebContent/WEB-INF/web.xml;在web里增加servletProviderInitcom.yucheng.cmis.dubbo.start.Provider6类Provider init()方类启动dubbo4.2 Dubbo接口参数配制Dubbo启动时加载参数配制:applicationContextService.xml所在目录:/cmismd/src/main/config/applicationContextService.xml参数解析:dubbo:application:提供方应用信息,用于计算依赖关系dubbo:registry:使用注册中心暴露服务地址dubbo:protocol:用dubbo协议在端口暴露服务dubbo:service:声明需要暴露的服务接口4.3 渠道调用产品接口:门店信息查询applicationContextService.xml产品服务提供配制: 服务接口类:目录:/cmismd/src/main/java/com/yucheng/cmis/dubbo/service/scoopr定义接口示例:SCooprExternalServiceInterfacepackage com.yucheng.cmis.dubbo.service.scoopr;import java.math.BigDecimal;import com.yucheng.cmis.dubbo.ob.SCooprBO;/* * 门店信息查询: * author yusys * moduleId com.yucheng.cmis.dubbo.service * createDate 2016-8-23 10:09:59 */public interface SCooprExternalServiceInterface /* * 根据门店员工代码查询门店信息 * param usrCde * return SCooprBO */public SCooprBO queryStoreInfo(String usrCde); 服务接口实现类:目录:/cmismd/src/main/java/com/yucheng/cmis/dubbo/service/ scoopr/impl接口实现类示例:SCooprExternalServiceInterfaceImplpackage com.yucheng.cmis.dubbo.service.scoopr.impl;import java.math.BigDecimal;import java.sql.Connection;import java.sql.SQLException;import com.alibaba.dubbo.config.annotation.Service;import com.ecc.emp.log.EMPLog;import com.yucheng.cmis.dao.SqlClient;import com.yucheng.cmis.dubbo.ob.SCooprBO;import com.yucheng.cmis.dubbo.service.scoopr.SCooprExternalServiceInterface;import com.yucheng.cmis.retailloan.manager.CooperationAgency.domain.SCoopr;import com.yucheng.cmis.dubbo.util.DbUtil;import com.yucheng.cmis.dubbo.util.JSONUtils;/* * 门店信息查询: * author yusys * moduleId com.yucheng.cmis.dubbo.service * createDate 2016-8-23 10:09:59 */Servicepublic class SCooprExternalServiceInterfaceImpl implements SCooprExternalServiceInterface /* * 根据门店员工代码查询门店信息 * param usrCode 门店员工代码 * return SCooprBO 门店信息 */Overridepublic SCooprBO getSCooprByUsrCode(String usrCode)SCoopr sCoopr = getDBData(usrCode, getSCooprByUsrCode);SCooprBO dest = new SCooprBO();dest.putData(sCoopr.getDataMap();return dest;/* * 根据门店员工代码查询门店信息 * param usrCde * return SCooprBO */public SCooprBO queryStoreInfo(String usrCde)SCoopr sCoopr = getDBData(usrCde, getSCooprByUsrCode);SCooprBO dest = new SCooprBO();dest.putData(sCoopr.getDataMap();return dest;/* * 根据合作机构代码查询付款间隔 * param cooprCode * return */Overridepublic Integer getCooprPayInterval(String cooprCode) return getDBData(cooprCode, getCooprPayIntervalByCooprCode);/* * 根据合作机构代码查询付款阈值 * param cooprCode * return */Overridepublic BigDecimal getCooprPayThreshold(String cooprCode) return getDBData(cooprCode, getCooprPayThresholdByCooprCode);/* * 根据合作机构代码查询日放款上限 * param cooprCode * return */Overridepublic BigDecimal getUpperLimitForDay(String cooprCode) return getDBData(cooprCode, getUpperLimitForDayByCooprCode);/*根据合作机构代码查询付款延期天数 * * param cooprCode * return */Overridepublic Integer geMaxDeferDays(String cooprCode) return getDBData(cooprCode, getMaxDeferDaysByCooprCode);SuppressWarnings(unchecked)private T getDBData(String singleValue, String sqlId) Connection connection = null;T ret = null; try connection = DbUtil.getConnection(); ret = (T) SqlClient.queryFirst(sqlId, singleValue, connection); catch (Exception e) e.printStackTrace();try connection.rollback(); catch (SQLException e1) e1.printStackTrace();EMPLog.log(SCooprExternalServiceInterfaceImpl, EMPLog.ERROR, 0, String.format( getDBData : sqlId : %s, singleValue : %s, catch erro msg : %s, sqlId, singleValue, e.getMessage() );finallyif (connection != null)try connection.close(); catch (SQLException e) e.printStackTrace();EMPLog.log(SCooprExternalServiceInterfaceImpl, EMPLog.ERROR, 0, String.format( getDBData : sqlId : %s, singleValue : %s, finally erro msg : %s, sqlId, singleValue, e.getMessage() );return ret;服务接口javabeen:package com.yucheng.cmis.dubbo.ob;import java.util.Map;/* *门店信息 * param usrCde * */public class SCooprBO extends CMISBO /* * 构造函数 */public SCooprBO() init();/* * 构造函数 */ public SCooprBO(Map initData) init(); this.dataPool.putAll(initData);/* * 构造函数,初始化表名和主键字段名 */public void init()this.tableName = S_COOPR;this.primaryKey = new String coopr_seq, ; /* * 获取合作机构代码的值 * return 返回String 合作机构代码 */public String getCooprCde() return this.dataPool.get(coopr_cde) = null ? null:(String)this.dataPool.get(coopr_cde);/* * 设置合作机构代码的值 * param CooprCde String 合作机构代码 */public void setCooprCde(String CooprCde)this.dataPool.put(coopr_cde, CooprCde); /* * 获取合作机构名称的值 * return 返回String 合作机构名称 */public String getCooprName() return this.dataPool.get(coopr_name) = null ? null:(String)this.dataPool.get(coopr_name);/* * 设置合作机构名称的值 * param CooprName String 合作机构名称 */public void setCooprName(String CooprName)this.dataPool.put(coopr_name, CooprName); /* * 获取合作状态的值 * return 返回String 合作状态 */public String getCooprSts() return this.dataPool.get(coopr_sts) = null ? null:(String)this.dataPool.get(coopr_sts);/* * 设置合作状态的值 * param CooprSts String 合作状态 */public void setCooprSts(String CooprSts)this.dataPool.put(coopr_sts, CooprSts); /* * 获取登录用户名的值 * return 返回String 登录用户名 */public String getUsrCde() return this.dataPool.get(usr_cde) = null ? null:(String)this.dataPool.get(usr_cde);/* * 设置登录用户名的值 * param UsrCde String 登录用户名 */public void setUsrCde(String UsrCde)this.dataPool.put(usr_cde, UsrCde); /* * 获取用户姓名的值 * return 返回String 用户姓名 */public String getUsrName() return this.dataPool.get(usr_name) = null ? null:(String)this.dataPool.get(usr_name);/* * 设置用户姓名的值 * param UsrName String 用户姓名 */public void setUsrName(String UsrName)this.dataPool.put(usr_name, UsrName); /* * 获取证件类型的值 * return 返回String 证件类型 */public String getUsrIdTyp() return this.dataPool.get(usr_id_typ) = null ? null:(String)this.dataPool.get(usr_id_typ);/* * 设置证件类型的值 * param UsrIdTyp String 证件类型 */public void setUsrIdTyp(String UsrIdTyp)this.dataPool.put(usr_id_typ, UsrIdTyp); /* * 获取证件号码的值 * return 返回String 证件号码 */public String getUsrIdNo() return this.dataPool.get(usr_id_no) = null ? null:(String)this.dataPool.get(usr_id_no);/* * 设置证件号码的值 * param UsrIdNo String 证件号码 */public void setUsrIdNo(String UsrIdNo)this.dataPool.put(usr_id_no, UsrIdNo); /* * 获取A-生效,I-失效,W-待生效的值 * return 返回String A-生效,I-失效,W-待生效 */public String getUsrSts() return this.dataPool.get(usr_sts) = null ? null:(String)this.dataPool.get(usr_sts);/* * 设置A-生效,I-失效,W-待生效的值 * param UsrSts String A-生效,I-失效,W-待生效 */public void setUsrSts(String UsrSts)this.dataPool.put(usr_sts, UsrSts);渠道调用产品配制: 渠道调用接口实现: Autowired private SCooprExternalServiceInterface ecfStoreService;4.4 渠道调风控接口:芝麻信用4.4.1 渠道调EDP芝麻信用接口:授权perties产品服务提供配制:服务接口类:目录:monssrcmainjavacommideajredpetlcommonsMideaInterceptor.java接口报文解析示例:AbstractPhaseInterceptorpackage mons;import java.io.BufferedInputStream;import java.io.InputStream;import java.util.List;import java.util.logging.Logger;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamConstants;import javax.xml.stream.XMLStreamReader;import mons.lang.StringUtils;import org.apache.cxf.Bus;import org.apache.cxf.binding.Binding;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.binding.soap.SoapVersion;import org.apache.cxf.binding.soap.SoapVersionFactory;import org.apache.cxf.bus.CXFBusFactory;import mon.logging.LogUtils;import org.apache.cxf.endpoint.Endpoint;import org.apache.cxf.endpoint.Server;import org.apache.cxf.endpoint.ServerRegistry;import erceptor.Fault;import erceptor.InterceptorChain;import erceptor.StaxInInterceptor;import org.apache.cxf.message.Exchange;import org.apache.cxf.message.Message;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.apache.cxf.service.Service;import org.apache.cxf.staxutils.DepthXMLStreamReader;import org.apache.cxf.staxutils.StaxUtils;public class MideaInterceptor extends AbstractPhaseInterceptor private static final Logger LOG = LogUtils.getL7dLogger(MideaInterceptor.class);public MideaInterceptor() super(Phase.POST_STREAM);addBefore(StaxInInterceptor.class.getName();public void handleMessage(SoapMessage message) throws Fault 解析报文的命名空= */String schemaNamespace = ;try / create a buffered stream so that we get back the original stream/ after scaningInputStream is = message.getContent(InputStream.class);BufferedInputStream pis = new BufferedInputStream(is);pis.mark(pis.available();message.setContent(InputStream.class, pis);String encoding = (String) message.get(Message.ENCODING);if(StringUtils.isBlank(encoding)encoding = UTF-8;XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(pis, encoding);DepthXMLStreamReader xmlReader = new DepthXMLStreamReader(reader);if (xmlReader.nextTag() = XMLStreamConstants.START_ELEMENT) String ns = xmlReader.getNamespaceURI();SoapVersion soapVersion = SoapVersionFactory.getInstance().getSoapVersion(ns);StaxUtils.toNextTag(xmlReader, soapVersion.getBody();xmlReader.nextTag();schemaNamespace = xmlReader.getName().getNamespaceURI();LOG.info(schemaNamespace:+schemaNamespace);pis.reset(); catch (Exception e) LOG.info(不合法报文,解析获取报文schemaNamespace错误);e.printStackTrace();throw new RuntimeException(不合法报文,解析获取报文schemaNamespace错误);根据Namespace选取对应的Endpoint= */Bus bus = CXFBusFactory.getDefaultBus();ServerRegistry serverRegistry = bus.getExtension(ServerRegistry.class);List servers = serverRegistry.getServers();Endpoint ep = null;for (Server server : servers) ep = server.getEndpoint();if (schemaNamespace.startsWith(ep.getEndpointInfo().getName().getNamespaceURI() break; else ep = null;if (ep = null) return;/* =设置新Endpoint= */Exchange ex = message.getExchange();ex.put(Endpoint.class, ep);ex.put(Binding.class, ep.getBinding();ex.put(Service.class, ep.getService();/ set for PEs OperationId(see ServiceDispatcher.java)ex.put(javax.xml.ws.Endpoint.WSDL_SERVICE, ep.getService().getName();InterceptorChain chain = message.getInterceptorChain();chain.add(ep.getInInterceptors();chain.add(ep.getBinding().getInInterceptors();chain.add(ep.getService().getInInterceptors();chain.setFaultObserver(ep.getOutFaultObserver();4.4.2风控调EDP接口:芝麻信用分applicationContextConsumer.xml产品服务提供配制: 服务接口类:目录:com.yucheng.cmis.platform.ruleengine.msi.msiimple定义接口示例:zmxyRule public class DubboSpringUtil private volatile static ApplicationContext act = null; public static ApplicationContext getInstance() if (act = null) synchronized (DubboSpringUtil.class) if (act = null) EMPLog.log(EMPConstance.EMP_JDBC, EMPLog.DEBUG, 0,-进入了DubooSpringUtil等于null-); String configLocations = new String1; configLocations0 = classpath:applicationContextConsumer.xml; act = new ClassPathXmlApplicationContext(configLocations); return act; /* * 获取芝麻信用分 * param reqMap * param conn * return * throws Exception */ SuppressWarnings( rawtypes, unchecked )public Map zmxyRule(Map reqMap,Connection conn) throws Exception String applSeq = String.valueOf(reqMap.get(appl_seq);String id_no = String.valueOf(reqMap.get(id_no);String id_typ = String.valueOf(reqMap.get(id_typ);Validate.notEmpty(id_no, 证件号码为空!) ; / 返回map 执行状态和错误信息Map returnMap = new HashMap();/ 获取贷款申请接口对应组件LcApplServiceInterface lcApplIntf = (LcApplServiceInterface) CMISModuleServiceFactory .getInstance().getModuleServiceById(lcApplServices, lcappl); ZmxyService zmxyService = (ZmxyService) DubboSpringUtil.getInstance().getBean(zmxyService);ResponseData res = zmxyService.getScoreByCertNo(id_no, true);if (res != null) engInMap.put(IN_芝麻信用分,res.getData();/ 保存芝麻信用分到LcApplApptLcApplAppt lcApplApplt = (LcApplAppt) lcApplIntf.queryLcApplApptByApplSeqAndTyp(new BigDecimal(applSeq),01, conn);lcApplApplt.setZhiMaScore(new BigDecimal(res.getData();SqlClient.updateAuto(lcApplApplt, conn);returnMap.put(zhiMaScore,res.getData();/ 执行规则引擎,返回执行结果mapMap engOutMap = new RuleEngineServiceImple().checkZmxyScore(engInMap);if (02.equals(engOutMap.get(OUT_信用分是否准入).toString() lcRRMap.put(id_typ, id_typ);lcRRMap.put(id_no, id_no);lcRRMap.put(OUT_风险等级, 05); / 05-禁止准入lcRRMap.put(OUT_是否准入, N);lcApplIntf.addLcRiskResuCa(lcRRMap, conn);returnMap.put(flag, 02);returnMap.put(error_msg, 您的综合评分暂未达到我司标准。);return returnMap; else lcRRMap.put(id_typ, id_typ);lcRRMap.put(id_no, id_no);lcRRMap.put(OUT_风险等级, 01); / 01-无风险lcRRMap.put(OUT_是否准入, Y);lcApplIntf.addLcRiskResuCa(lcRRMap, conn);catch (Exception e) EMPLog.log(tdSignScore, EMPLog.INFO, 0, 查询芝麻信用分接口异常,原因:+e.getMessage();returnMap.put(flag, 01);return returnMap;4.5 渠道调用贷前贷中接口:额度/状态查询applicationContextService.xml贷前贷中服务提供配制: 服务接口类:目录:/cmismd/src/main/java/com/yucheng/cmis/dubbo/service定义接口示例:LmLimitAgreementDubboServicepackage com.yucheng.cmis.dubbo.service;import com.yucheng.cmis.dubbo.ob.ReqLimitAgreementBO;import com.yucheng.cmis.dubbo.ob.RespLcApplLimitAmtBO;/* * 贷中-额度/状态查询接口 * author Administrator * */public interface LmLimitAgreementDubboService /* * 额度/状态查询 * param reqLimitAgreement * return RespLcApplLimitAmtBO * throws Exception */public RespLcApplLimitAmtBO queryLcApplLimitAmt(ReqLimitAgreementBO reqLimitAgreement) throws Exception;服务接口实现类:目录:/cmismd/src/main/java/com/yucheng/cmis/dubbo/service/impl接口实现类示例:LmLimitAgreementDubboServiceImplpackage com.yucheng.cmis.dubbo.service.impl;import java.math.BigDecimal;import java.sql.Connection;import java.sql.SQLException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.sql.DataSource;import mons.collections.CollectionUtils;impor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论