闪验、创蓝闪验

注:插件文档以官网为准


创建应用


应用的创建流程及APPID的获取,请查看「账号创建」文档

注意:如果应用有多个包名或签名不同的马甲包,须创建多个对应包名和签名的应用,否则马甲包将报包名或签名校验不通过。


快速体验示例Demo

注:需运行真机到真机,安装SIM卡,打开手机流量开关,允许网络权限

  1. 到闪验官网申请创建应用,提供包名包签名/bundleID,得到对应的appID/appKey
  2. 搜索初始化方法shanyan.init,将appID换成自己的appid(appid安卓/iOS不同,分别与包名包签名/bundleID绑定)
  3. 在模块管理中导入闪验离线插件或云插件
  4. 在APP设置中上传对应包名包签名/bundleID的安卓iOS证书
  5. 分别云打包安卓iOS自定义Loader
  6. 手机安装自定义Loader,运行,设置自定义Loader的IP和端口,连接到APICloudStudio2示例工程
  7. WIFI同步APICloudStudio2项目到自定义Loader


引用方式(Android&iOS)

var shanyan = api.require('clSDKShanYanSDKModule')

Android部分


一、免密登录API使用说明

1.初始化


使用一键登录功能前,必须先进行初始化操作。


调用示例


shanyan = api.require('clSDKShanYanSDKModule')
shanyan.init({appid:'loXN4jDs'},
function(ret, err){
       alert(JSON.stringify(ret));
       console.log("callback---button--shanyanSdkInit========"+ret.code+"result===="+ret.result);
      });


参数描述

参数

类型

说明

appId

String

闪验平台获取到的appId


返回参数含义如下:

字段

类型

含义

code

Int

code为1022:成功;其他:失败

result

String

返回信息



2.预取号


  • 建议在判断当前用户属于未登录状态时使用,已登录状态用户请不要调用该方法
  • 建议在执行拉取授权登录页的方法前,提前一段时间调用预取号方法,中间最好有2-3秒的缓冲(因为预取号方法需要1~3s的时间取得临时凭证
  • 请勿频繁的多次调用、请勿与拉起授权登录页同时和之后调用。
  • 避免大量资源下载时调用,例如游戏中加载资源或者更新补丁的时候要顺序执行


调用示例:


shanyan.preLogin(function(ret, err){
                alert(JSON.stringify(ret));
                console.log("callback---button--shanyanSdkGetPhoneInfo========"+ret.code+"result===="+ret.result);
            });


返回参数含义如下:

字段

类型

含义

code

Int

code为1022:成功;其他:失败

result

String

返回信息


3.拉起授权页

  • 调用拉起授权页方法后将会调起运营商授权页面。已登录状态请勿调用 。
  • 每次调用拉起授权页方法前均需先调用授权页配置方法,否则授权页可能会展示异常。
  • 对应两个回调,一个是拉起授权页的回调,一个是点击一键登录的回调(包含返回键)


调用示例:

var param = {isFinish:true};
            shanyan.openActivity(param,function(ret, err){
                //alert(JSON.stringify(ret));
                console.log("fff"+JSON.stringify(ret));
            });


参数描述

字段

类型

含义

isFinish

boolean 

点击授权页一键登录按钮有回调时是否自动销毁授权页:

true:自动销毁

false:不自动销毁,开发者需主动调用销毁授权页方法进行授权页销毁操作 


当type=0时是拉起授权页回调(ret.type):

字段

类型

含义

code

int

code为1000:授权页成功拉起

其他:失败

result

String

返回信息


当type=1时是一键登录回调(ret.type):

字段

类型

含义

code

int

code为1011:点击返回按钮(包括物理返回键)

code为1000:点击一键登录获取token成功

其他:点击一键登录获取token失败

result

String

返回信息


当第二个回调外层code为1000时,result的返回为


{
"token": ""
}


含义如下:

字段

类型

含义

token

String

用来和后台置换手机号。一次有效。


4.销毁授权页

A.授权页面自动销毁

1.在授权登录页面,当用户主动点击左左上角返回按钮时,返回码为1011,SDK将自动销毁授权页;

2.安卓 SDK,当用户点击手机的硬件返回键(相当于取消登录),返回码为1011,SDK将自动销毁授权页

3.当用户设置一键登录或者其他自定义控件为自动销毁时,得到回调后,授权页面会自动销毁


B.授权页手动销毁

1.当设置一键登录为手动销毁时,点击授权页一键登录按钮成功获取token不会自动销毁授权页,请务必在回调中处理完自己的逻辑后手动调用销毁授权页方法。

2.当设置自定义控件为手动销毁时,请务必在回调中处理完自己的逻辑后手动调用销毁授权页方法。


调用示例


shanyan.finishAuthActivity();


5.置换手机号

当一键登录外层code为1000时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端」文档来实现获取手机号码的步骤。


6.授权页界面配置


调用该方法可实现对三网运营商授权页面个性化设计,每次调用拉起授权页方法前必须先调用该方法否则授权界面会展示异常。(三网界面配置内部实现逻辑不同,请务必使用移动、联通、电信卡分别测试三网界面



配置授权页方法


shanyan.setAuthThemeConfig({
        widgets:{
      widget1:  {widgetId:"customView_one",
      type:"TextView",
        left:"",
        top:"330",
        right:"",
        bottom:"",
        width:"",
        height:"30",
        textContent:"自定义控件1(点击不销毁)",
        textFont:"13",
        textColor:"#cc0000",
        backgroundColor:"#ffffff",
        backgroundImgPath:"",
        isFinish:"false"},
        widget2:  {widgetId:"customView_two",
        type:"ImageView",
        left:"",
        top:"370",
        right:"",
        bottom:"",
        width:"60",
        height:"60",
        textContent:"自定义控件2(点击销毁)",
        textFont:"13",
        textColor:"#00aa00",
        backgroundColor:"",
        backgroundImgPath:'widget://image/qq.png',
        isFinish:"true"}
        },
        uiConfig:{
        setAuthBGImgPath:'widget://image/sy_login_bg.png',
        setNavColor:'#ff0000',
        setNavText:'一键登录',
        setNavTextColor:'#080808',
        setNavTextSize:'16',
        setAuthNavTransparent:'true',
        setAuthNavHidden:'false',
        setNavReturnBtnWidth:'25',
        setNavReturnImgPath:'sy_sdk_left',
        setNavReturnBtnOffsetX:'0',
        setNavReturnBtnOffsetY:'-1',
        setNavReturnBtnOffsetRightX:'-1',
        setNavReturnBtnHeight:'25',
        setNavReturnImgHidden:'false',
                setLogBtnText:"本机号登录",
                setLogBtnOffsetY:"260",
        setAppPrivacyOne:{
        title:'用户协议1',
        url:"http://flash.253.com/"
        },
        setPrivacyText:{
        privacyTextOne:'同意',
        privacyTextTwo:"、",
        privacyTextFive:"并授权登录"
        },

        }},
          function(result){
                console.log("ffff"+result.code+"result===="+result.result);
                }
        );


自定义控件回调

ret:

  • 类型:JSON对象
  • 内部字段:
{    
        code:0
        result:'', //自定义控件id, 点击时触发,可用于自定义控件的点击事件处理
    }



ShanYanUIConfig.java配置元素说明


授权页背景配置三选一,支持图片,gif图,视频


  String setAuthBGImgPath; //普通图片
  String setAuthBgGifPath; //GIF图片(只支持本地gif图,需要放置到drawable文件夹中)
  String setAuthBgVideoPath; //视频背景


授权页导航栏


  bool setFullScreen; //设置是否全屏显示(true:全屏;false:不全屏)默认不全屏
  String setNavColor; //设置导航栏背景颜色
  String setNavText; //设置导航栏标题文字
  String setNavTextColor; //设置导航栏标题文字颜色
  int setNavTextSize; //设置导航栏标题文字大小
  String setNavReturnImgPath; //设置导航栏返回按钮图标
  bool setNavReturnImgHidden = false; //设置导航栏返回按钮是否隐藏(true:隐藏;false:不隐藏)
  int setNavReturnBtnWidth; //设置导航栏返回按钮宽度
  int setNavReturnBtnHeight; //设置导航栏返回按钮高度
  int setNavReturnBtnOffsetRightX; //设置导航栏返回按钮距离屏幕右侧X偏移
  int setNavReturnBtnOffsetX; //设置导航栏返回按钮距离屏幕左侧X偏移
  int setNavReturnBtnOffsetY; //设置导航栏返回按钮距离屏幕上侧Y偏移
  bool setAuthNavHidden; //设置导航栏是否隐藏(true:隐藏;false:不隐藏)
  bool setAuthNavTransparent; //设置导航栏是否透明(true:透明;false:不透明)


授权页logo


  String setLogoImgPath; //设置logo图片
  int setLogoWidth; //设置logo宽度
  int setLogoHeight; //设置logo高度
  int setLogoOffsetY; //设置logo相对于标题栏下边缘y偏移
  int setLogoOffsetBottomY; //设置logo相对于屏幕底部y偏移
  bool setLogoHidden; //设置logo是否隐藏(true:隐藏;false:不隐藏)
  int setLogoOffsetX; //设置logo相对屏幕左侧X偏移


授权页号码栏


  String setNumberColor; //设置号码栏字体颜色
  int setNumFieldOffsetY; //设置号码栏相对于标题栏下边缘y偏移
  int setNumFieldOffsetBottomY; //设置号码栏相对于屏幕底部y偏移
  int setNumFieldWidth; //设置号码栏宽度
  int setNumFieldHeight; //设置号码栏高度
  int setNumberSize; //设置号码栏字体大小
  int setNumFieldOffsetX; //设置号码栏相对屏幕左侧X偏移


授权页登录按钮


  String setLogBtnText; //设置登录按钮文字
  String setLogBtnTextColor; //设置登录按钮文字颜色
  String setLogBtnImgPath; //设置授权登录按钮图片
  int setLogBtnOffsetY; //设置登录按钮相对于标题栏下边缘Y偏移
  int setLogBtnOffsetBottomY; //设置登录按钮相对于屏幕底部Y偏移
  int setLogBtnTextSize; //设置登录按钮字体大小
  int setLogBtnHeight; //设置登录按钮高度
  int setLogBtnWidth; //设置登录按钮宽度
  int setLogBtnOffsetX; //设置登录按钮相对屏幕左侧X偏移


授权页隐私栏


  List<String> setAppPrivacyOne; //设置开发者隐私条款1,包含两个参数:1.名称 2.URL
  List<String> setAppPrivacyTwo; //设置开发者隐私条款2,包含两个参数:1.名称 2.URL
  List<String> setAppPrivacyThree; //设置开发者隐私条款3,包含两个参数:1.名称 2.URL
  bool setPrivacySmhHidden; //设置协议名称是否显示书名号《》,默认显示书名号(true:不显示;false:显示)
  int setPrivacyTextSize; //设置隐私栏字体大小
  List<String> setAppPrivacyColor; //设置隐私条款文字颜色,包含两个参数:1.基础文字颜色 2.协议文字颜色
  int setPrivacyOffsetBottomY; //设置隐私条款相对于授权页面底部下边缘y偏移
  int setPrivacyOffsetY; //设置隐私条款相对于授权页面标题栏下边缘y偏移
  int setPrivacyOffsetX; //设置隐私条款相对屏幕左侧X偏移
  bool setPrivacyOffsetGravityLeft; //设置隐私条款文字左对齐(true:左对齐;false:居中)
  bool setPrivacyState; //设置隐私条款的CheckBox是否选中(true:选中;false:未选中)
  String setUncheckedImgPath; //设置隐私条款的CheckBox未选中时图片
  String setCheckedImgPath; //设置隐私条款的CheckBox选中时图片
  bool setCheckBoxHidden; //设置隐私条款的CheckBox是否隐藏(true:隐藏;false:不隐藏)
  List<int> setCheckBoxWH; //设置checkbox的宽高,包含两个参数:1.宽 2.高
  List<int> setCheckBoxMargin; //设置checkbox的间距,包含四个参数:1.左间距 2.上间距 3.右间距 4.下间距
  List<String> setPrivacyText; //设置隐私条款名称外的文字,包含五个参数


授权页slogan


  String setSloganTextColor; //设置slogan文字颜色
  int setSloganTextSize; //设置slogan文字字体大小
  int setSloganOffsetY; //设置slogan相对于标题栏下边缘y偏移
  bool setSloganHidden = false; //设置slogan是否隐藏(true:隐藏;false:不隐藏)
  int setSloganOffsetBottomY; //设置slogan相对屏幕底部Y偏移
  int setSloganOffsetX; //设置slogan相对屏幕左侧X偏移


授权页弹窗样式


  List<String>setDialogTheme; //设置授权页为弹窗样式,包含5个参数:1.弹窗宽度 2.弹窗高度 3.弹窗X偏移量(以屏幕中心为原点) 4.弹窗Y偏移量(以屏幕中心为原点) 5.授权页弹窗是否贴于屏幕底部


注意:

a.控件X偏移如果不设置默认居中。


二、本机认证API使用说明


注:本机认证、免密登录可共用初始化,两个功能同时使用时,只需调用一次初始化即可。


1.初始化


免密登录初始化


2.本机号校验


在初始化执行之后调用,本机号校验界面需自行实现,可以在多个需要校验的页面中调用。


调用示例:


  shanyan.startAuthentication(function(ret,err){
              console.log("fff"+JSON.stringify(ret));
            });


返回参数含义如下:


字段

类型

含义

code

int

code为2000:成功

其他:失败

result

String

返回信息


当外层code为2000时,result的返回为


{
    "token":""
}


含义如下:


字段

类型

含义

token

String

用来和后台校验手机号。一次有效。


3.校验手机号


当本机号校验外层code为2000时,您将获取到返回的参数,请将这些参数传递给后端开发人员,并参考「服务端」文档来实现校验本机号的步骤


iOS部分


前置条件

  • 闪验SDK支持Xcode 9.4.1,iOS8.0+及以上版本。
  • 闪验SDK支持中国移动、联通、电信4G的取号能力。
  • 闪验SDK支持网络环境为

a.纯数据网络

b.数据网络与wifi网络双开

  • 对于双卡手机,闪验SDK取当前流量卡号

一、免密登录API使用说明

1.初始化


<script type="text/javascript" src="../script/api.js"></script>

//模块加载
let shanyan = api.require('clSDKShanYanSDKModule')

/**初始化*/
shanyan.init(option: callBack:)


参数描述

参数是否必填类型说明
optionappId必填String闪验appID
callBackret,err选填function初始化回调


所有回调统一形式:


function(ret, err) {
      //iOS回调
    if (err != null) {
        //失败
    } else {
        //成功
    }
});


ret:包含所有信息

字段类型说明
codeNumber外层code
messageString外层描述(概要)
dataObject数据
errorCodeNumber内层code
errorDomainString外层描述
errorUserInfoObject错误详情


err:可能为空,不为空即失败

字段类型说明
errorCodeNumber内层code
errorDomainString外层描述
errorUserInfoObject错误详情


接口作用

初始化SDK :传入用户的appID,获取本机运营商,读取缓存,获取运营商配置,初始化SDK


使用场景

  • 建议在app启动时调用
  • 必须在一键登录前至少调用一次
  • 只需调用一次,多次调用不会多次初始化,与一次调用效果一致


请求示例代码


<script type="text/javascript" src="../script/api.js"></script>

apiready = function() {
        shanyan = api.require('clSDKShanYanSDKModule')
};

function init() {
        let platform = api.systemType;

        var appid;
        if (platform == 'android') {
            appid = 'AndroidAPPID'; //appID与包名绑定
        } else if (platform == 'ios') {
            appid = 'iOSAppID'; //appID与bundleID绑定
        }

        shanyan.init({
                appid: appid
            },
            function(ret, err) {

                if (platform == 'android') {
                    //Android回调
                    api.toast({
                        msg: JSON.stringify(ret),
                        location: 'middle'
                    });

                } else if (platform == 'ios') {
                    //iOS回调
                    if (err != null) {
                        //iOS初始化失败
                    } else {
                        //iOS初始化成功
                    }

                    api.toast({
                        msg: JSON.stringify(ret),
                        location: 'middle'
                    });
                }
                console.log("callback---button--shanyanSdkInit========" + JSON.stringify(ret));
            });
    }


2.预取号


/**
 * 预取号(获取临时凭证)
 * 建议在判断当前用户属于未登录状态时使用,已登录状态用户请不要调用该方法
 */
func preGetPhonenumber(callBack:function);


接口作用

电信、联通、移动预取号 :初始化成功后,如果当前为电信/联通/移动,将调用预取号,可以提前获知当前用户的手机网络环境是否符合一键登录的使用条件,成功后将得到用于一键登录使用的临时凭证,默认的凭证有效期10min(电信)/30min(联通)/60min(移动)。

使用场景

  • 建议在执行一键登录的方法前,提前一段时间调用此方法,比如调一键登录的vc的onLoad中,或者rootVC的rootVC中,或者app启动后,此调用将有助于提高闪验拉起授权页的速度和成功率
  • 不建议调用后立即调用拉起授权页方法(此方法是异步)
  • 此方法需要1~2s的时间取得临时凭证,因此也不建议和拉起授权页方法一起串行调用
  • 不建议频繁的多次调用和在拉起授权页后调用
  • 建议在判断当前用户属于未登录状态时使用,已登录状态用户请不要调用该方法


请求示例代码



<script type="text/javascript" src="../script/api.js"></script>

apiready = function() {
    shanyan = api.require('clSDKShanYanSDKModule')
};

    function preLogin() {

        let platform = api.systemType;
        if (platform == 'android') {
            //安卓预取号
            shanyan.preLogin(function(ret, err) {
                api.toast({
                    msg: JSON.stringify(ret),
                    location: 'middle'
                });

                document.getElementById("codeid").innerHTML = "code:" + ret.code;
                document.getElementById("resultId").innerHTML = "result:" + JSON.stringify(ret);
                console.log("callback---button--shanyanSdkGetPhoneInfo========" + ret.code + "result====" + ret.result);
            });
        } else if (platform == 'ios') {
            //iOS预取号
            shanyan.preGetPhonenumber(
                function(ret, err) {
                    if (err != null) {
                        //iOS预取号失败
                    } else {
                        //iOS预取号成功
                    }
                    api.toast({
                        msg: JSON.stringify(ret),
                        location: 'middle'
                    });
                    console.log("callback---button--shanyanSdkGetPhoneInfo========" + JSON.stringify(ret));
                });
        }
    }


3.拉起授权页


//openLoginAuthListener:调起授权页回调
shanyan.openLoginAuthListener(option:Object,callBack:function())
    
//oneKeyLoginListener:调起授权页成功,后续回调    
shanyan.oneKeyLoginListener(option:Object,callBack:function());

//调起授权页
shanYanSDKModule.quickAuthLoginWithConfigure(clUIConfigure:);


参数描述

参数类型说明
clUIConfigure 必填CLUIConfigure授权页控件属性配置对象
openLoginAuthListener选填function拉起授权页的回调,拉起页面成功失败均触发
oneKeyLoginListener 必填

function

一键登录回调,用于接收一键登录的结果,点一键登录成功失败均触发,点自带的返回按钮也触发

使用场景

  • 用户进行一键登录操作时,调用一键登录方法,如果初始化成功,SDK将会拉起授权页面,用户授权后,SDK将返回取号 token给到应用客户端。
  • 可以在多处调用
  • 需在调用预初始化方法之后调用

一键登录逻辑说明

  • 存在调用预初始化时获取的临时凭证,调用一键登录方法将立即拉起授权页面
  • openLoginAuthListener 拉起授权页监听回调,拉起成功或失败均触发
  • 不存在临时凭证或临时凭证过期时(临时凭证有效期电信10min、联通30min、移动60min),调用一键登录方法,将有一个很短的时延,待取号成功后拉起授权页面
  • 取号失败时,返回失败


请求示例代码


function openActivity() {

    api.showProgress();
    setTimeout(function() {
        api.hideProgress();
    }, 5000);

    let platform = api.systemType;
    if (platform == 'android') {
        //Android 全屏模式
        var param = {
            isFinish: false
        };
        shanyan.openActivity(param, function(ret, err) {

            api.hideProgress();

            if (ret.type == 1) {
                //ret.type:1 调起授权页成功,后续回调
                shanyan.finishAuthActivity();
                if (ret.code == 1000) {
                    //获取Token成功
                    api.alert({
                        title: 'SDK获取Token成功',
                        msg: JSON.stringify(ret.result),
                    });
                } else {
                    //获取Token失败
                }
            } else {
                //ret.type:0 拉授权页的回调
            }

            console.log(JSON.stringify(ret));
        });

    } else if (platform == 'ios') {
        //一键登录
                //iOS 简单竖屏全屏模式

        let screenWidth_Portrait = api.winWidth; //竖屏宽

        var screenScale = screenWidth_Portrait / 375.0; //相对iphone6屏幕
        if (screenScale > 1) {
          screenScale = 1; //大屏的无需放大
        }

        //先计算各控件位置及相对关系
        //logo
        let clLayoutLogoTop_Portrait = screenScale * 60;
        let clLayoutLogoWidth_Portrait = 60 * screenScale;
        let clLayoutLogoHeight_Portrait = 60 * screenScale;
        let clLayoutLogoCenterX_Portrait = 0;

        //手机号
        let clLayoutPhoneCenterY_Portrait = -20 * screenScale;
        let clLayoutPhoneLeft_Portrait = 50 * screenScale;
        let clLayoutPhoneRight_Portrait = -50 * screenScale;
        let clLayoutPhoneHeight_Portrait = 20 * screenScale;

        //一键登录按钮
        let clLayoutLoginBtnCenterY_Portrait = clLayoutPhoneCenterY_Portrait + clLayoutPhoneHeight_Portrait * 0.5 *
          screenScale + 20 * screenScale + 15 * screenScale;
        let clLayoutLoginBtnHeight_Portrait = 30 * screenScale;
        let clLayoutLoginBtnLeft_Portrait = 70 * screenScale;
        let clLayoutLoginBtnRight_Portrait = -70 * screenScale;

        //隐私协议
        let clLayoutAppPrivacyLeft_Portrait = 40 * screenScale;
        let clLayoutAppPrivacyRight_Portrait = -40 * screenScale;
        let clLayoutAppPrivacyBottom_Portrait = 0 * screenScale;
        let clLayoutAppPrivacyHeight_Portrait = 45 * screenScale;

        //运营商能力标签(认证服务由**提供)
        let clLayoutSloganLeft_Portrait = 0;
        let clLayoutSloganRight_Portrait = 0;
        let clLayoutSloganHeight_Portrait = 15 * screenScale;
        let clLayoutSloganBottom_Portrait = clLayoutAppPrivacyBottom_Portrait - clLayoutAppPrivacyHeight_Portrait;

        //ios_uiConfigure 用于传入一键登录方法
        this.ios_uiConfigure = 
        {
          clBackgroundImg: "image/shanyanImg/eb9a0dae18491990a43fe02832d3cafa.jpg",//全屏背景

          shouldAutorotate: false,//支持自动旋转
          /**支持方向
           * 如支持横竖屏,需同时设置 clOrientationLayOutPortrait 和 clOrientationLayOutLandscape
           * 0:UIInterfaceOrientationMaskPortrait//竖屏
           * 1:UIInterfaceOrientationMaskLandscapeLeft//横屏左
           * 2:UIInterfaceOrientationMaskLandscapeRight//横屏右
           * 3:UIInterfaceOrientationMaskPortraitUpsideDown//上下倒置
           * 4:UIInterfaceOrientationMaskLandscape//横屏左&右
           * 5:UIInterfaceOrientationMaskAll//全部
           * 6:UIInterfaceOrientationMaskAllButUpsideDown//全部但不包括上下倒置
           * */
          supportedInterfaceOrientations: 5,

          /**偏好方向 
           * -1:UIInterfaceOrientationUnknown
           * 0:UIInterfaceOrientationPortrait
           * 1:UIInterfaceOrientationPortraitUpsideDown
           * 2:UIInterfaceOrientationLandscapeLeft
           * 3:UIInterfaceOrientationLandscapeRight
           * */
          //偏好方向默认Portrait preferredInterfaceOrientationForPresentation: Number(5),

          clNavigationBackgroundClear: true,//导航栏透明
          clNavigationBackBtnImage: "image/shanyanImg/close-white.png",//返回按钮图片,自带返回按钮大小将由1x图片大小决定
          clNavBackBtnAlimentRight: true,//返回按钮居右

          clLogoImage: "image/shanyanImg/logo_shanyan_text.png",//logo图片

          clLoginBtnText: "本机号一键登录",//一键登录按钮文字
          clLoginBtnTextColor: [1,1,1,1.0],//rgba
          clLoginBtnBgColor: [0.2,0.8,0.2,1.0],//rgba
          clLoginBtnTextFont: 15*screenScale,
          clLoginBtnCornerRadius: 10,
          clLoginBtnBorderWidth: 0.5,
          clLoginBtnBorderColor: [0.1,0.8,0.1,1.0],//rgba 

          clPhoneNumberFont: 20.0*screenScale,//手机号字体

          clAuthTypeUseWindow: false,//弹窗模式
          //clAuthWindowCornerRadius: 20,//弹窗模式下的窗口圆角

          //隐私协议
          clAppPrivacyColor: [[0.6,0.6,0.6,1.0],[0,1,0,1.0]],//2 item,commomTextColor and appPrivacyTextColor
          clAppPrivacyTextFont: 11*screenScale,
          clAppPrivacyTextAlignment: 0,//0: center 1: left 2: right
          clAppPrivacyFirst: ["测试连接A","https://www.baidu.com"],// 2 item, name and url
          clAppPrivacySecond: ["测试连接B","https://www.sina.com"],// 2 item, name and url

          //隐私协议勾选框
          clCheckBoxVerticalAlignmentToAppPrivacyCenterY: true,
          clCheckBoxSize: [30*screenScale,30*screenScale],//2 item, width and height
          clCheckBoxImageEdgeInsets: [2*screenScale,10*screenScale,13*screenScale,5*screenScale],//4 item, top left bottom right
          clCheckBoxUncheckedImage: "image/shanyanImg/checkBoxNor.png",
          clCheckBoxCheckedImage: "image/shanyanImg/checkBoxSEL.png",

          //加载动画
          clLoadingSize : [50, 50],//2 item, width and height
          clLoadingTintColor : [0.2,0.8,0.2,1],
          clLoadingBackgroundColor : [1,1,1,1],
          clLoadingCornerRadius : 5,

          //竖屏布局对象
          clOrientationLayOutPortrait:{
              //控件:
              //logo
              clLayoutLogoWidth : clLayoutLogoWidth_Portrait,
              clLayoutLogoHeight : clLayoutLogoHeight_Portrait,
              clLayoutLogoCenterX : clLayoutLogoCenterX_Portrait,
              clLayoutLogoTop : clLayoutLogoTop_Portrait,
              //手机号
              clLayoutPhoneCenterY : clLayoutPhoneCenterY_Portrait,
              clLayoutPhoneHeight : clLayoutPhoneHeight_Portrait,
              clLayoutPhoneLeft : clLayoutPhoneLeft_Portrait,
              clLayoutPhoneRight : clLayoutPhoneRight_Portrait,
              //一键登录按钮
              clLayoutLoginBtnCenterY : clLayoutLoginBtnCenterY_Portrait,
              clLayoutLoginBtnHeight : clLayoutLoginBtnHeight_Portrait,
              clLayoutLoginBtnLeft : clLayoutLoginBtnLeft_Portrait,
              clLayoutLoginBtnRight : clLayoutLoginBtnRight_Portrait,
              //隐私协议
              clLayoutAppPrivacyLeft : clLayoutAppPrivacyLeft_Portrait,
              clLayoutAppPrivacyRight : clLayoutAppPrivacyRight_Portrait,
              clLayoutAppPrivacyBottom : clLayoutAppPrivacyBottom_Portrait,
              clLayoutAppPrivacyHeight : clLayoutAppPrivacyHeight_Portrait,
              //运营商能力标签(认证服务由**提供)
              clLayoutSloganLeft : clLayoutSloganLeft_Portrait,
              clLayoutSloganRight : clLayoutSloganRight_Portrait,
              clLayoutSloganHeight : clLayoutSloganHeight_Portrait,
              clLayoutSloganBottom : clLayoutSloganBottom_Portrait,
          },
        }
      

        //先设置SDK回调
        shanyan.openLoginAuthListener({},
            //openLoginAuthListener:调起授权页回调
            function(ret, err) {

                api.hideProgress();

                if (err != null) {
                    //调起授权页 失败
                } else {
                    //调起授权页 成功
                }

                api.toast({
                    msg: JSON.stringify(ret),
                    location: 'middle'
                });
          
                      console.log(JSON.stringify(ret));
            }
        );
        shanyan.oneKeyLoginListener({},
            //oneKeyLoginListener:调起授权页成功,后续回调
            function(ret, err) {

                api.hideProgress();

                if (err != null) {
                    if (err.errorCode == 1011) {
                        //点了返回,自动授权页关闭

                        //提示:错误无需提示给用户,可以在用户无感知的状态下直接切换登录方式
                        //用户取消登录(点返回)
                        //处理建议:如无特殊需求可不做处理,仅作为交互状态回调,此时已经回到当前用户自己的页面
                        //点击sdk自带的返回,无论是否设置手动销毁,授权页面都会强制关闭
                    } else {
                        //处理建议:其他错误代码表示闪验通道无法继续,可以统一走开发者自己的其他登录方式,也可以对不同的错误单独处理
                        //关闭授权页