import axios from 'axios' import { MD5, RSAEncrypt, AESEncryptV2, AESDecryptV2, AESEncrypt, AESDecrypt, randomString, publicKey, SHA256 } from '@/assets/js/utils/cryptoJsUtil' import configApp from '@/config' import { Dialog, Toast } from 'vant' // import MD5 from 'js-md5' import CacheUtils from '@/assets/js/utils/cacheUtils' import BusinessCommon from '@/assets/js/business-common' let proposal = [ '/proposal/proposal/list', '/proposal/proposal/toInsurance', '/proposal/proposal/info', '/proposal/proposal/demo', '/proposal/proposal/saveOrUpdateProposal', '/proposal/proposal/updateInsured', '/proposal/file/getFile', '/proposal/proposal/deleteProposal' ] //建议书 //理赔 let claims = [ `/claim/claimApply/progress`, `/claim/claimApply/progressDetail`, `/claim/claimReport/history`, `/claim/claimApply/apply`, `/edor/customer/customerList`, `/edor/customer/customerInfo`, `/claim/claimApply/query`, `/claim/claimApply/delete` ] //在线投保 let sale = [ '/sale/order/orderList', '/sale/order/saveOrUpdateOrderInfo', '/sale/order/orderList', '/sale/order/deleteOrderInfo', '/sale/product/getDetail', '/sale/order/saveOrUpdateOrderInfo', '/sale/order/orderDetail', '/customer/authcode/loginedSend', '/uploadImage', '/sale/insure/underWrite', '/sale/insure/acceptInsurance', '/app/code/getCodeValue', '/customer/token', '/media/ebizSignInfo/sign', '/sale/receiptSign/submit', '/sale/order/orderDetail', '/sale/record/check', '/ppf/sign', '/ppf/check', '/sale/insure/selfToHuman', '/sale/insure/orderPayStatusQuery', '/sale/order/revokeOrder', '/sale/product/getcompany', '/sale/product/occupationCodeCheck' ] //在线投保 let agentEnter = [ '/agent/enter/share', '/agent/enter/query', '/agent/enter/saveOrUpdateInfo', '/agent/enter/queryAll', '/agent/enter/getImpart', '/agent/agreement/query', '/agent/agreement/signAgreement', '/agent/enter/query', '/agent/examineApprove/dispose' //入司增员审批 ] let survey = [ //'/customer/question/getQuestionnaire', // 代理人下问卷查询 --ok '/customer/question/getQuestion', // 问卷题库查询 '/customer/question/submit', // 问卷提交 //'/customer/question/shareSubmit', //问卷分享 --ok //'/customer/question/getTableId', // id 查询 -- ok '/customer/question/getAgentInfo' // 代理人详情 ] let manpower = [ '/customer/answer/queryList' //DISC性格分析 ] let productStore = [ '/customer/shop/getShopList', //获取商城列表/详情 '/customer/shop/getShareList' //查询分享轨迹(转发记录) ] //续期管理 let renewalManage = [ '/renewal/getRenewalList' //续期列表查询 ] //保全 let preserve = [ '/edor/customer/customerList', //客户搜索 '/edor/policy/policyList', //保单列表 '/edor/edor/queryEdorList' //保全进度查询 ] // 个险业绩排行优化 let performanceRanking = ['/data/performance/getComList', '/data/performance/getComPerformance'] // 惠桂保 let hgb = ['/sale/order/selectHgb', '/sale/order/getHgbDetail'] let whitelist = ['/agent/white/getWhiteInfo'] // 开门红 let goodStart = ['/data/performance/getComPerformance'] let eqiVisit = [ '/agent/accompany/getAccompanyComCode', '/agent/accompany/getAccompanyPerson', '/agent/accompany/getAgentAccompanyRecordPage', '/agent/accompany/saveAccompanyRecord', '/agent/accompany/getAccompanyDetail', '/agent/reward/getRewardRecord', '/agent/reward/getAccompanyRank' ] let whiteList = [ '/customer/agent/getCustomersList', ...proposal, ...sale, ...agentEnter, ...claims, ...survey, ...manpower, ...preserve, ...productStore, ...renewalManage, ...performanceRanking, ...hgb, ...whitelist, ...goodStart, ...eqiVisit ] // 创建axios实例 const service = axios.create({ timeout: 66666666 // 请求超时时间 }) // request拦截器 service.interceptors.request.use( async config => { let relativePath = config.url && config.url.split(configApp.API_VERSION)[1] if (whiteList.includes(relativePath)) { Toast.loading({ duration: 0, // 持续展示 toast forbidClick: true, // 禁用背景点击 loadingType: 'spinner', message: '加载中……' }) } let masterKey if (configApp.API_VERSION == 'v3') { // 生成本次请求随机密钥 if (!window.localStorage.getItem('masterKey')) { masterKey = randomString(); window.localStorage.setItem('masterKey', masterKey) } else { masterKey = window.localStorage.getItem('masterKey') } } // token 不存在初始化处理 let token = CacheUtils.getLocItem('token') /** * 请求拦截处理(待添加 判断走统一网关处理) */ // console.log(config) if (config.url && /api\/$/.test(config.url.split(configApp.API_VERSION)[0]) && (configApp.API_VERSION == 'v2' || configApp.API_VERSION == 'v3')) { if (!config.data || config.data == null) { config.data = {} } if (!!config.data && config.data != null) { if (configApp.API_VERSION == 'v3') { // console.log('随机密钥:' + masterKey); // RSA加密随机密钥 let ak = RSAEncrypt(masterKey, publicKey); // console.log('加密后的masterKey:' + ak); // 随机密钥加密data let data = AESEncrypt(JSON.stringify(config.data), masterKey); // console.log('MD5值:' + MD5(AESEncrypt(data, masterKey)).toString()); // 验证数据完整性MD5 // 数据完整性MD5需要进行二次AES加密 config.headers['signature'] = SHA256(AESEncrypt(data, masterKey)).toString(); if (config.method == 'get') { config.headers['ak'] = ak config.headers['data'] = data } config.data = { ak, data }; // console.log(config.data); if (AESDecrypt(config.data.data, masterKey)) { // console.log(JSON.parse(AESDecrypt(config.data.data, masterKey))); } else { // console.log(AESDecrypt(config.data.data, masterKey)); } } else if (configApp.API_VERSION == 'v2') { config.headers['signature'] = MD5(timeStr + CacheUtils.getLocItem('token')) let encrypt = AESEncryptV2(JSON.stringify(config.data), configApp.REQ_PWD) config.data = { data: encrypt } } } } if (!token) { console.log('token====>>', token) // 设备类型 const target = BusinessCommon.device() // 安卓or苹果(非浏览器) if (!target.isWeixin && target.mobile) { // console.log(to.meta.name, 'to.meta.name'); // eslint-disable-next-line no-undef let u = navigator.userAgent; let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //判断是否是 android终端 if (isAndroid) { // setTimeout(() => { if (window.location.hash !== '#/my/privacyPolicy' && window.location.hash !== '#/YB_agentSign/step1' && window.location.hash !== '#/YB_agentSign/step2') { console.log(window.Android.getToken(), 'Android获取token') CacheUtils.setLocItem('token', window.Android.getToken()) } // }, 1000) } else { // const res = await EWebBridge.webCallAppInJs('getToken') // CacheUtils.setLocItem('token', JSON.parse(res).token) if (window.location.hash !== '#/my/privacyPolicy') { const res = await EWebBridge.webCallAppInJs('getToken') CacheUtils.setLocItem('token', JSON.parse(res).token) } } } } config.headers['token'] = CacheUtils.getLocItem('token') // 添加请时间戳 let timeStr = new Date().getTime() + '' config.headers['timeStr'] = timeStr return config }, error => { // Do something with request error Promise.reject(error) } ) // respone拦截器 service.interceptors.response.use( response => { if (response.config.responseType) { return response.data } let res = response.data if ( (configApp.API_VERSION == 'v2' || configApp.API_VERSION == 'v3') && response.config.url && response.headers['content-type'].match(/application\/json/) && /api\/$/.test(response.config.url.split(configApp.API_VERSION)[0]) ) { if (res.response) { if (configApp.API_VERSION == 'v3') { // 正常情況返回必有response 节点 // 返回结果的随机密钥 let masterKey; if (!window.localStorage.getItem('masterKey')) { return Promise.reject('密钥失效') } else { masterKey = window.localStorage.getItem('masterKey'); } // console.log('请求结果response' + response) // console.log('请求结果masterKey:' + masterKey) // console.log(JSON.parse(AESDecrypt(response.data.response, masterKey))) // 使用随机密钥解密返回结果data res = JSON.parse(AESDecrypt(res.response, masterKey)) } else if (configApp.API_VERSION == 'v2') { // 使用固定密钥解密返回结果data res = JSON.parse(AESDecryptV2(res.response, configApp.REQ_PWD)) // console.log(res,'JSON.parse(AESDecrypt(res.response, configApp.REQ_PWD))') } } } Toast.clear() if (res.code != 0) { //10001 token不能为空 10002 token错误或已失效 if (res.code == 10001 || res.code == 10002) { var ua = window.navigator.userAgent.toLowerCase(); //通过正则表达式匹配ua中是否含有MicroMessenger字符串, 在微信 if (ua.match(/MicroMessenger/i) == 'micromessenger') { Dialog.alert({ title: '提示', confirmButtonText: '退出', message: '当前链接已失效,请您联系业务员获取(重新分享)。', }).then(() => { window.close(); WeixinJSBridge.call('closeWindow'); }); } else { //在app Dialog.confirm({ confirmButtonText: '重新登录', message: '你已被登出,可以取消继续留在该页面,或者重新登录' }).then(() => { //eslint-disable-next-line EWebBridge.webCallAppInJs('bridge', { flag: 'login' }) }) } } else { //Toast.fail(res.msg) } return Promise.reject(res) } else { return res.content } }, error => { Toast.clear() console.log('err' + error) // for debug //Toast.fail(error.message) return Promise.reject(error) } ) export default service