Andriod SDK集成文档
[TOC]
概述
本文是国密一键登录SDK_Android端接入文档,用于指导SDK的集成使用。在对接之前您需要花5-10分钟阅读以下条目,可减少对接过程中的问题。
前置条件
- 国密一键登录SDK支持Android 4.1、minSdkVersion 16及以上版本
- 国密一键登录SDK支持运营商网关认证、短信验证码认证、国密双向认证
- 运营商网关认证需要用户开启4G/5G移动网络,短信验证码认证、国密双向认证支持4G/5G/WiFi场景
集成国密一键登录SDK
本地集成
- 将SDK中libs目录下的aar包拷贝到您工程的libs目录下,如没有该目录需新建。
- 在build文件的dependencies中添加aar包依赖
repositories {
flatDir {
dirs '../app/libs'
}
}
implementation (name:'loginlibrary',ext:'aar')
<br/>
权限配置
您需要在 AndroidMainfest.xml 文件添加:
&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.CHANGE_NETWORK_STATE&quot; /&gt;
权限名称 | 权限说明 | 使用说明 |
---|---|---|
INTERNET | 允许应用程序联网 | 用于访问网关和认证服务器 |
ACCESS_WIFI_STATE | 允许访问WiFi网络状态信息 | 允许程序访问WiFi网络状态信息 |
ACCESS_NETWORK_STATE | 允许访问网络状态 | 区分移动网络或WiFi网络 |
CHANGE_NETWORK_STATE | 允许改变网络连接状态 | 设备在WiFi跟数据双开时,强行切换使用数据网络 |
<br/>
注册应用信息
将AppId配置在项目build.gradle中:
buildTypes {
release {
buildConfigField('String', 'APP_ID', '&quot;1111&quot;')
}
debug {
buildConfigField('String', 'APP_ID', '&quot;1111&quot;')
}
}
混淆配置
-dontwarn com.unicom.online.account.shield.**
-keep class com.unicom.online.account.shield.** {*;}
-keep class com.safevast.uid.** {*;}
<br/>
SDK的使用
通过上面的几个步骤,工程就配置完成了,接下来就可以在工程中使用国密一键登录SDK进行开发了。
日志开关-提示:在初始化之前调用
方法原型: LoginManager.getInstance().showLog(showLog);
参数 | 类型 | 说明 |
---|---|---|
showLog | boolean | 是否打印日志 |
<br/>
初始化--提示:SDK的所有其他方法必须在初始化后再调用
初始化的过程中会向服务端请求获取配置参数、动态密码算法,并同步初始化运营商SDK。 <br/> 方法原型: LoginManager.getInstance().init(context, appId, initListener);
参数 | 类型 | 说明 |
---|---|---|
context | Context | 传ApplicationContext对象 |
appId | String | 应用appId |
initListener | InitListener | 初始化回调监听 |
示例代码:
LoginManager.getInstance().init(getApplicationContext(),BuildConfig.APP_ID,new InitListener() {
@Override
public void initLoginResult(int code, String result) {
if(code == 1000){
}
}
});
initLoginResult(int code, String result)返回参数code和result,含义如下:
字段 | 类型 | 含义 |
---|---|---|
code | int | code为1000:成功;其他:失败 |
result | String | 初始化结果描述 |
<br/>
预取号
提前获取手机掩码,以便获得更好的用户体验,建议尽可能前置。(预取号失败可以参考对接流程走SDK提供的短信验证码认证方式) <br/> 示例代码:
LoginManager.getInstance().advanceLogin(new AdvanceLoginListener() {
@Override
public void advanceLoginResult(int code, String result) {
if(code == 1000){
//预认证成功
try {
//设备信息
JSONObject json = new JSONObject(result);
//手机掩码
String mask = json.optString(&quot;mask&quot;);
//服务商(移动、联通、电信、密认)
String service = json.optString(&quot;service&quot;);
//服务协议名称
String termName = json.optString(&quot;termName&quot;);
//服务协议URL
String termUrl = json.optString(&quot;termUrl&quot;);
} catch (JSONException e) {
e.printStackTrace();
}
}else if(code == 1001){
//预认证失败,未获取到设备信息
}else{
//预认证失败
}
}
});
advanceLoginResult(int code, String result)返回参数code和result,含义如下:
字段 | 类型 | 含义 |
---|---|---|
code | int | code为1000:成功;其他:失败 |
result | String | 预认证结果描述,成功会返回JSON数据,按示例解析即可 |
说明:预取号获得的数据需要在登录/绑定页面显示,预取号会返回移动、联通、电信、密认四个服务商,无需判断类型,根据返回显示即可。 1、用户首次登录满足运营商取号条件,走运营商流量网关认证,服务商字段会返回移动、联通或电信; 2、用户首次登录不满足运营商取号条件,走SDK提供的短信验证码认证,应用自行显示短信验证码页面,无需显示服务商; 3、不管是运营商还是短信验证码,首次认证后都会激活密码模块,密码机会为当前设备生成融合手机号的唯一认证算法(可以理解为下发一个纯软UKey),后续认证都会通过密码算法进行双向认证,服务商字段会返回密认; <br/>
取号
获取本次认证会话密钥加密的手机号码mToken。 <br/> 示例代码:
LoginManager.getInstance().getDeviceInfo(new GetDeviceListener() {
@Override
public void getDeviceResult(int code, String result) {
if(code == 1000){
try {
JSONObject json = new JSONObject(result);
// 密码模块生成的唯一用户标识
String zuid = json.optString(&quot;zuid&quot;);
// 本次认证会话密钥sm4加密的手机号
String mToken = json.optString(&quot;token&quot;);
// 本次认证的签名摘要
String signature = json.optString(&quot;signature&quot;);
loginPost(token,zuid,signature);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
getDeviceResult(int code, String result)返回参数code和result,含义如下:
字段 | 类型 | 含义 |
---|---|---|
code | int | code为1000:成功;其他:失败 |
result | String | 预认证结果描述,成功会返回JSON数据,按示例解析即可 |
<br/>
发送短信验证码(收费同一键登录)
短信验证码认证:预认证失败时,可以走SDK提供的短信验证码认证方式,间隔发送时间60s。 说明:密码模块已激活的情况下无法调用此方法;短信验证码默认签名为创建应用时的签名。 <br/> 方法原型:
LoginManager.getInstance().sendLoginSms(num, loginSmsListener);
参数 | 类型 | 说明 |
---|---|---|
num | String | 用户输入的手机号 |
loginSmsListener | LoginSmsListener | 发送结果回调 |
示例代码:
LoginManager.getInstance().sendLoginSms(num, new LoginSmsListener() {
@Override
public void loginSmsResult(int code, String result) {
}
});
loginSmsResult(int code, String result)返回参数code和result,含义如下:
字段 | 类型 | 含义 |
---|---|---|
code | int | code为1000:成功;其他:失败 |
result | String | 发送验证码结果描述 |
<br/>
校验短信验证码
短信验证码认证:预认证失败时,可以走SDK提供的短信验证码认证方式。(说明:配合发送验证码方法使用) <br/> 方法原型:
LoginManager.getInstance().checkLoginSms(num, sms, checkLoginSmsListener);
参数 | 类型 | 说明 |
---|---|---|
num | String | 用户输入的手机号 |
sms | String | 用户输入的验证码 |
checkLoginSmsListener | CheckLoginSmsListener | 校验结果回调 |
示例代码:
LoginManager.getInstance().checkLoginSms(num, sms, new CheckLoginSmsListener() {
@Override
public void checkLoginSmsResult(int code, String result) {
if(code == 1000){
try {
JSONObject json = new JSONObject(result);
// 密码模块生成的唯一用户标识
String zuid = json.optString(&quot;zuid&quot;);
// 本次认证会话密钥sm4加密的手机号
String mToken = json.optString(&quot;token&quot;);
// 本次认证的签名摘要
String signature = json.optString(&quot;signature&quot;);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
checkLoginSmsResult(int code, String result)返回参数code和result,含义如下:
字段 | 类型 | 含义 |
---|---|---|
code | int | code为1000:成功;其他:失败 |
result | String | 校验证码结果描述,成功会返回JSON数据,按照示例解析即可 |
<br/>
返回码
参数 | 描述 |
---|---|
1000 | 所有请求返回1000即代表成功 |
1001 | 预认证失败,未获取到设备信息 |
1003 | 系统版本低于5.0 |
其他返回码,请结合Result描述具体分析 <br/>
运营商返回码 | 返回码描述 |
---|---|
100 | 一键登录成功,解析result,可得到网络请求参数 |
1101 | 公网 ip 无效(客户 wifi 访问、wap 方式访问等引起获取到的公网 ip 查询不到省份信息) |
1102 | 私网 ip 无效(无法用私网 ip 找到对应的省份信息) |
1105 | 参数信息错误(参数名称、内容错误或者参数丢失再或者加密错误) |
1106 | 应用密钥信息不匹配(密钥信息与包名不一致,android 还需要校验 MD5 信息,也有可能是参数命名错误) |
1107 | 余额不足(使用条数不足) |
1201 | 取号失败 |
1202 | 认证失败 |
1203 | 获取置换码失败 |
2101 | 鉴权失败(参数 sign 名称错误或者 sign 值有误) |
2102 | accessCode 已失效(accessCode 错误或者过期) |
2103 | 序列号不存在(序列号与授权码和密钥绑定,序列号不存在时返回,即授权码错误或者密钥信息与前台使用 不是一套,或者 seq 已过期) |
2201 | app_id 无效(appid 未激活或者 appid 错误) |
2202 | 应用信息错误(获取应用信息错误(demo 中 data 参数中 app 信息错误)) |
2203 | sdk 信息错误(获取 sdk 信息错误(demo 中 data 参数中 sdk 信息错误)) |
2205 | 接入信息解析错误(用户接入信息解析失败) |
2206 | 流控值超限(用户访问流控超过限制) |
3201 | 系统繁忙(服务端系统出现错误) |
3202 | 内部网关错误 |
3203 | 内部路由错误 |
3204 | 无支付权限 |
3206 | 取号功能暂时不可用 |
3207 | 不支持此功能 |
10100 | 无网络连接 |
10101 | 无数据网络连接 |
10102 | ApiKey 或 PublicKey 不能为空 |
10103 | 超时 |
10104 | 用户取消登录 |
10105 | 切换登录方式 |
20100 | 测试次数超限 |
20101 | 10 分钟之内最多只能获取 30 个授权码 |
30200 | 服务端数据格式出错 |
-100 | 数据解密异常(SDK 解密数据失败) |
其他返回码请结合result结果描述具体分析
<br/>
工具类
sm4加密方法
示例代码:
String sm4Vaule = AuthManager.getInstance().sm4EncryptMsg(vaule,sessionKey);
参数 | 类型 | 说明 |
---|---|---|
vaule | String | 需要加密的数据 |
sessionKey | byte[] | 加密密钥 |
sm4EncryptMsg((vaule,sessionKey)返回结果,含义如下:
字段 | 类型 | 含义 |
---|---|---|
sm4Vaule | String | sm4加密后结果(16进制字符) |
<br/>