工银e生活开发脱坑日志(4)工行页面及jsAPI交互接口hybrid_app.js登录情况说明

简介: 工银e生活开发脱坑日志(4)工行页面及jsAPI交互接口hybrid_app.js登录情况说明

工银e生活页面及jsAPI交互接口

情况说明:

1、判断运行环境,否则是否在android或IOS环境的ICBC内,才起作用,当然改动hybrid_app.js中的return false为alert,也可以在chrome中体验,毕竟只是JS;

2、登录传递参数,需要查询出登录参数cust_id、phone、currentTimeMillis、isNewUser四个必选参数,调用方法即可;

3、必须要工行模拟器或测试环境支持


工银e生活hybrid_app.js整个文件代码如下:

var hybrid_app ={};
var ua = navigator.userAgent;
//判断e生活版本号
hybrid_app.elifeVer = function() {
      try {
          var version = navigator.userAgent.match(new RegExp('fullversion:(\\d\.\\d\.\\d\.\\d)'));
          if(version==undefined){
              version = navigator.userAgent.match(new RegExp('fullversion:(\\d\.\\d\.\\d)'));
          }
          version = (version == undefined ? "0" : version);
          version = parseInt(version[1].replace(/\./g, ''));
          version = (version==""?"1000":version);
          return version;
      } catch (e) {
        return "1000";
      }
};
//判断是否是融e联 ios
hybrid_app.isRELIphone = function () {
  if (ua.indexOf('ICBCiPhoneBS')>-1) {
    return true;
  }
  return false;
};
//  判断是否是融e联 android
hybrid_app.isRELAndroid = function () {
  if (ua.indexOf('ICBCAndroidBS')>-1 ) { 
    return true;
  }
  return false;
};
/**
 * 检测当前浏览器是否为Android(Chrome)
 */
hybrid_app.isAndroid = function() {
  if (ua.indexOf('Android')>-1) {
    return true;
  }
  return false;
};
/**
 * 检测当前浏览器是否为iPhone(Safari)
 */
hybrid_app.isIPhone = function() {
  if (ua.indexOf('iPhone')>-1) {
    return true;
  }
  return false;
};
//android拦截native
hybrid_app.GetNativeFunctionAndroid = function(para) {
  setTimeout(function () {
        var res;
        switch (para.keyword) {
            case 'open' :
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['open','" + para.callMethod + "']}");
                callLogin(res);
                break;
            case 'showToolBar' :
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['showToolBar','" + para.isShow + "']}");
                break;
            case 'back' :
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['back','']}");
                break;
            case 'openGPS' :
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['openGPS','']}");
                break;
            case 'closeGPS' :
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['closeGPS','']}");
                break;
            case 'getMyLocation' :
              res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['getMyLocation','" + para.getGps + "']}");
                getGps(res);
              break;
            case 'callPhoneNumber' :
              res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['callPhoneNumber','" + para.tel + "']}");
              break;
            case 'share' :
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['share','" + para.shareInfo + "']}");
                break;
            case 'openAddress' : 
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['openAddress','" + para.custId + "','" + para.appId + "']}");
                break;
            case 'getDefaultAddress' : 
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['getDefaultAddress','" + para.custId + "','" + para.appId + "'],callBack:" + para.callback + "}");
                callBackAddress(res);
                break;
            case 'getThirdScan' : 
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['getThirdScan','" + para.callback + "']}");
                thirdScanCallback(res);
                break;
            case 'getThirdARScan' : 
                res = prompt('callNativeMethod', "{obj:Native,func:DataConfigServiceServer,args:['getThirdARScan','" + para.callback + "']}");
                thirdARScanCallback(res);
                break;
        }
    });
};
//ios注册native
function connectWebViewJavascriptBridge(callback) {
    if(window.WebViewJavascriptBridge){
      return callback(WebViewJavascriptBridge);
    }else{
      document.addEventListener('WebViewJavascriptBridgeReady', function() {
            callback(WebViewJavascriptBridge);
        }, false);
    }
    if(window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe=document.createElement('iFrame');
    WVJBIframe.style.display='none';
    WVJBIframe.src='wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function(){document.documentElement.removeChild(WVJBIframe)});
}
connectWebViewJavascriptBridge(function(bridge) {
    bridge.init();
    bridge.registerHandler("callback",callback);
});
var ICBCBridge = {
    callHandler: function(name, params, callback) {
        connectWebViewJavascriptBridge(function(bridge) {
            bridge.callHandler(name, params, callback);
        });
    },
    send: function(params, callback) {
        connectWebViewJavascriptBridge(function(bridge) {
            bridge.send(params, callback);
        });
    }
};
window.ICBCBridge = ICBCBridge;
//中途登录
hybrid_app.merLogin = function(callMethod){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(callMethod != null){
      if(hybrid_app.elifeVer() < '213') {
                Myutils.open(callMethod);
            } else {
                hybrid_app.GetNativeFunctionAndroid({'keyword': 'open', 'callMethod': callMethod});
            }
    }else{
      if(hybrid_app.elifeVer() < '213') {
                Myutils.open("callLogin");
            } else {
                hybrid_app.GetNativeFunctionAndroid({'keyword': 'open', 'callMethod': "callLogin"});
            }
    }
  }else{  //ios
    if(callMethod != null){
       window.ICBCBridge.callHandler("Myutils.open",callMethod);
    }else{
       window.ICBCBridge.callHandler("Myutils.open","callLogin");
    }
  }
}
//第三方显示或隐藏tabbar isShow:true显示tabbar 反之隐藏
hybrid_app.showToolBar = function(isShow){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(hybrid_app.elifeVer() < '213') {
            Myutils.showToolBar(isShow);
        } else {
            hybrid_app.GetNativeFunctionAndroid({'keyword': 'showToolBar', 'isShow': isShow});
        }
  }else{  //ios
    window.ICBCBridge.callHandler("Myutils.showToolBar",isShow);
  }
}
//第三方返回上一级页面
hybrid_app.back = function(){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(hybrid_app.elifeVer() < '213') {
            Myutils.back();
        } else {
            hybrid_app.GetNativeFunctionAndroid({'keyword': 'back'});
        }
  }else{  //ios
     window.ICBCBridge.callHandler("Myutils.back");
  }
}
//第三方开启定位
hybrid_app.openGPS = function(){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(hybrid_app.elifeVer() < '213') {
            Myutils.openGPS();
        } else {
            hybrid_app.GetNativeFunctionAndroid({'keyword': 'openGPS'});
        }
  }else{  //ios
    window.ICBCBridge.callHandler("Myutils.openGPS");
  }
}
//第三方关闭定位
hybrid_app.closeGPS = function(){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(hybrid_app.elifeVer() < '213') {
            Myutils.closeGPS();
        } else {
            hybrid_app.GetNativeFunctionAndroid({'keyword': 'closeGPS'});
        }
  }else{  //ios
    window.ICBCBridge.callHandler("Myutils.closeGPS");
  }
}
//第三方获取定位  参数是回调的函数名的字符串
hybrid_app.getMyLocation = function(getGps){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(getGps != null){
      if(hybrid_app.elifeVer() < '213') {
              Myutils.getMyLocation(getGps);
          } else {
              hybrid_app.GetNativeFunctionAndroid({'keyword': 'getMyLocation', 'getGps': getGps});
          }
    }else{
      if(hybrid_app.elifeVer() < '213') {
              Myutils.getMyLocation("getGps");
          } else {
              hybrid_app.GetNativeFunctionAndroid({'keyword': 'getMyLocation', 'getGps': "getGps"});
          }
    }
  }else{  //ios
    if(getGps != null){
      window.ICBCBridge.callHandler("Myutils.getMyLocation",getGps);
    }else{
      window.ICBCBridge.callHandler("Myutils.getMyLocation","getGps");
    }
  }
}
//第三方打电话功能  参数是电话号
hybrid_app.callPhoneNumber = function(tel){
  //如果是安卓
  if(hybrid_app.isAndroid()){
    if(hybrid_app.elifeVer() < '213') {
            Myutils.callPhoneNumber(tel);
        } else {
            hybrid_app.GetNativeFunctionAndroid({'keyword': 'callPhoneNumber', 'tel': tel});
        }
  }else{  //ios
    window.ICBCBridge.callHandler("Myutils.callPhoneNumber",tel);
  }
}
//base64转码(由于ios客户端对特殊字符拦截,故要转码后传值)
hybrid_app.base64Encode = function (str) {
    _utf8_encode = function (string) {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    };
    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;
    str = _utf8_encode(str);
    while (i < str.length) {
        chr1 = str.charCodeAt(i++);
        chr2 = str.charCodeAt(i++);
        chr3 = str.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;
        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }
        output = output +
            _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
            _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
    }
    return output;
},
//分享
hybrid_app.share = function (shareInfo) {
    if (ICBCUtilTools.isAndroid()) {
        if(hybrid_app.elifeVer() < '213') {
            window.Myutils.share(shareInfo);
            return;
        } else {
            hybrid_app.GetNativeFunctionAndroid({'keyword': 'share','shareInfo': shareInfo});
        }
    }else if(ICBCUtilTools.isiPhone()){
        //(ios需要将参数base64加密)
        window.ICBCBridge.callHandler("Myutils.share", hybrid_app.base64Encode(shareInfo));
    }
}
//分享方法调用示例
/*
  <div onclick="share()">分享</div>
  function share() {
    //调用分享交互需要传入的参数如下
    //pngUrl:分享后链接显示的图片地址
    var pngUrl = "https://122.19.157.9:443/filepath/elife/2018/12/31/15/cc91f9e05902461b83ff15dfda8fa9c3_s.gif";
    //shareUrl:分享后点击链接需要跳转的地址
    var shareUrl = "https://OFST-APP-GND.sdc.cs.icbc/OFSTCUSTH5/dist/#/business/index/02000015087";
    //title:分享后链接显示的标题
    var title = "特约商户支付专用01(修改)1111111111111111111111111";
    //content:分享后链接显示的内容
    var content = "4星级 4167256元/人 回龙观  汽车销售4S店/ 洗浴/  自助餐";
    //封装需要分享的对象
    var shareInfo = {
        PNGUrl: pngUrl,
        ShareUrl: shareUrl,
        Title: title,
        Content: content
    };
    // 将对象转为字符串
    shareInfo = JSON.stringify(shareInfo);
    var _jumpUtil = new jumpUtil();
    _jumpUtil.share(shareInfo);
}*/
//中途登录的回调示例,提供给第三方时,请删除方法体内容
function callLogin(param){
    var loginUrl = "merLogin.do?loginParams="+param;
    $.ajax({
    type : "POST",
    url : loginUrl,
    dataType : 'json',
    async : false,
    success : function(msg) {
      $("#cust_id").text(msg.cust_id);
      $("#phone").text(msg.phone);
      if(null != msg.longitude && null != msg.latitude){
      $("#longitudeAndlatitude").text(
          msg.longitude + "," + msg.latitude);
      }
      $("#cisno").text(msg.cisno);
      $("#third_cisno").text(msg.third_cisno);
      $("#isNewUser").text(msg.isNewUser);
      $("#city_name").text(msg.city_name);
      $("#city_code").text(msg.city_code);
      $("#special").text(msg.special);
      $("#device_id").text(msg.device_id);
      $("#currentTimeMillis").text(msg.currentTimeMillis);
      $("#loginSuc").text("中途登录成功!");
    },
    error : function(XMLHttpRequest, textStatus, errorThrown) {
      alert($.parseXML(XMLHttpRequest) + "," + textStatus + ","
          + errorThrown);
    }
  });
}
//获取定位信息的回调例,提供给第三方时,请删除方法体内容
//param位json格式,{"longitude":"","latitude":""},定位失败时,param为null,或""
function getGps(param) {
    if(param != null && param != ""){
      $("#myLocal").text(param.longitude+","+param.latitude);
    }else{
      $("#myLocal").text("定位获取失败!");
    }
}
//4月新增 1、获取默认地址(解密方式同中途登录) 2、打开管理收货地址页面 3、第三方唤起扫一扫
//获取默认地址回调,同中途登录,获取param值后做自有逻辑即可
function callBackAddress(param) {
    alert(param += '');
}
//第三方扫一扫回调,同中途登录,获取param值后做自有逻辑即可
function thirdScanCallback(param) {
    alert(param += '');
}
//第三方AR扫一扫回调,同中途登录,获取param值后做自有逻辑即可
function thirdARScanCallback(param) {
    alert(param += '');
}
//获取默认地址
hybrid_app.getDefaultAddress = function (custId, appId) {
    if (ICBCUtilTools.isAndroid()) {
        hybrid_app.GetNativeFunctionAndroid({'keyword': 'getDefaultAddress', 'custId': custId, 'appId': appId, 'callback': 'callBackAddress'});
    }else if(ICBCUtilTools.isiPhone()){
        var paraObj = {
            custId: custId,
            appId: appId,
            callback: 'callBackAddress'
        };
        paraObj = JSON.stringify(paraObj);
        window.ICBCBridge.callHandler("Myutils.getDefaultAddress",hybrid_app.base64Encode(paraObj));
    }
}
//打开管理收货地址页面
hybrid_app.openAddress = function (custId, appId) {
    if (ICBCUtilTools.isAndroid()) {
        hybrid_app.GetNativeFunctionAndroid({'keyword': 'openAddress', 'custId': custId, 'appId': appId});
    }else if(ICBCUtilTools.isiPhone()){
        var paraObj = {
            custId: custId,
            appId: appId
        };
        paraObj = JSON.stringify(paraObj);
        window.ICBCBridge.callHandler("Myutils.openAddress",hybrid_app.base64Encode(paraObj));
    }
}
//打开扫一扫
hybrid_app.getThirdScan = function () {
    if (ICBCUtilTools.isAndroid()) {
        hybrid_app.GetNativeFunctionAndroid({'keyword': 'getThirdScan', 'callback': "thirdScanCallback"});
    }else if(ICBCUtilTools.isiPhone()){
        window.WebViewJavascriptBridge.callHandler("Myutils.getThirdScan", "thirdScanCallback");
    }
}
//打开AR扫一扫
hybrid_app.getThirdARScan = function () {
    if (ICBCUtilTools.isAndroid()) {
        hybrid_app.GetNativeFunctionAndroid({'keyword': 'getThirdARScan', 'callback': "thirdARScanCallback"});
    }else if(ICBCUtilTools.isiPhone()){
        window.WebViewJavascriptBridge.callHandler("Myutils.getThirdARScan", "thirdARScanCallback");
    }
}
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
11月前
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
694 89
|
10月前
|
存储 数据可视化 开发工具
【Application Insights】Application Insights存储的Function App的日志存在"Operation Link" 为空的情况
在将 Azure Functions 升级到 .NET 8 和 Isolated Worker 模式后,Application Insights 的请求日志中 `operation_Link` 字段为空,导致分布式追踪无法正常关联。解决方法包括:确保引用正确的 SDK 包(如 `Microsoft.Azure.Functions.Worker.ApplicationInsights`),正确配置 Application Insights 服务,移除默认日志过滤规则,并使用最新依赖包以支持分布式追踪。通过这些步骤,可恢复端到端事务视图的可视化效果。
208 12
|
11月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
318 22
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
3908 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
存储 JavaScript 前端开发
【JavaScript】网页交互的灵魂舞者
本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
196 1
【JavaScript】网页交互的灵魂舞者
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
771 5
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
424 4
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
384 4
|
JSON 前端开发 API
使用微信JS-SDK调用发票接口的完整开发指南
本文介绍了如何使用微信JS-SDK的`chooseInvoiceTitle`接口来调用微信的发票功能。通过微信发票接口,用户可以选择开具个人或单位发票,并获取相关发票信息,如抬头、税号、公司地址等。在文中,详细描述了JS-SDK的初始化、发票接口的调用方式,并提供了完整的代码示例。文章还介绍了如何处理返回的发票信息,帮助开发者快速集成微信发票功能。
723 2
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。