手机号码校验-SDK方式
(1) 将jar包导入到libs目录下:
(2) 在build.gradle配置jar依赖:
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') }
(1) 在AndroidManifest.xml配置权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
(2) 权限配置说明:
权限 | 用途 |
---|---|
INTERNET | 允许应用程序联网 |
CHANGE_NETWORK_STATE | 允许程序改变网络连接状态 |
ACCESS_WIFI_STATE | 允许程序访问WiFi网络状态信息 |
ACCESS_NETWORK_STATE | 允许程序访问联网状态,区分用户设备是移动网络或WiFi |
WRITE_SETTINGS | 允许读写系统设置项 |
在混淆配置文件末尾添加如下:
-keep class cn.com.chinatelecom.gateway.lib.** { *; }
(1) 根据Android SDK接入指南接入SDK,完成SDK的导入,配置等准备工作。
(2) 创建对象并调用初始化接口 init。
【接口说明】
如果要设置超时时间和Log输出,应该在调用预授权接口之前,先调用初始化方法:
CtAuth.init(connTimeout ,readTimeout ,totalTimeout,TraceLoggerImpI)
【参数说明】
参数名 | 参数类型 | 参数说明 |
---|---|---|
connTimeout | int | Http连接超时时间 (默认3000毫秒) |
readTimeout | int | http读取超时时间(默认3000毫秒) |
totalTimeout | int | 请求任务总的超时时间在指定时间未完成预授权请求,则强制停止任务(默认10000毫秒) |
traceLoggerImpl(可空) | TraceLogger | Log处理类实例(可传null),SDK不直接打印Exception堆栈信息和关键日志,由接入方实现TraceLogger接口打印或上报日志。 |
【相应数据】
无
(3) 调用获得用户手机授权码接口requestPreMobile。
【接口说明】
调用预授权接口获取AccessCode,通过AccessCode进行相关业务请求(校验)。
CtAuth.requestPreMobile(context,appId,appSecret,bussinessType,preCodeListener)
【参数说明】
参数名 | 参数类型 | 参数说明 |
---|---|---|
context | Context | 上下文环境 |
appId | String | 天翼账号开放平台分配的appId |
appSecret | String | 天翼账号开放平台分配的appSecret |
bussinessType | String | 业务类型,传入”jy” |
preCodeListener | PreCodeListener | 回调接口,在onResult(String result)方法返回预授权接口的响应数据 |
【响应数据】
请求结果通过PreCodeListener的回调方法返回, result为json格式的字符串。返回结果解析:
result:返回参数结果码,如0表示成功,详细参考错误码定义;
msg: 结果码对应详细说明;
data:为json串,参数说明见下表
参数名 | 参数类型 | 参数含义 | 参数说明 |
---|---|---|---|
accessCode | String | 授权码 | 天翼账号授权码,时效性1分钟 |
operatorType | String | 运营商标识 | CT电信,CU联通,CM移动,UN其他 |
expiredTime | Int | code失效时间 | 表示该code的有效时间,时间单位为s |
【调用示例】
public void requestPreMobile(View view) { CtAuth.init(connTimeout ,readTimeout , totalTimeout ,new TraceLoggerImpl()); CtAuth.requestPreMobile(MainActivity.this ,APPID, APPSECRET, "jy" ,preCodeListener); } PreCodeListener preCodeListener = new PreCodeListener(){ @Override public void onResult(String result) { parseAccessCode(result); mResultTv.setText("返回结果:\n"+result); } }; private void parseAccessCode(String result){ try { JSONObject jsonObject = new JSONObject(result); int code = jsonObject.optInt("result"); JSONObject dataObj = jsonObject.optJSONObject("data"); if(code == 0 && dataObj != null){ accessCode = dataObj.optString("accessCode"); mAccessCodeTv.setText("AccessCode:" +accessCode ); //dataObj.optString(""); } } catch (JSONException e) { e.printStackTrace(); } }
(1) 将EAccountSDK文件夹(包括EAccountSDKNetWork.framework)复制到自己的文件夹目录下;
(2) 在工程中添加EAccountSDK文件(在工程名上点击右键弹出菜单后选择“Add Files to ‘xxxxxx’” 其中‘xxxxxx’为你的工程名字,如图所示);
(3) 弹出的窗口选择EAccountSDKNetwork.framework文件,在选项“Copy items into destination group’s folder(if needed)”打钩,务必记得添加目标项目“Add to targets”选择你的目标工程,最后点击”Add”;
(4) 查询工程是否添加了EAccountSDKNewwork.framework文件,(点击工程项目,点击目标TARGETS,选择Build Phases,展开Link Binary With Libraries,查看是否存在EAccountSDKNetwork.framework文件,具体操作如图。)
如果工程没有添加EAccountSDKNetwork.framework文件则需要手动添加(点击”+”按钮,弹出选择框,选择“Add Other ...”按钮,在弹出的选择文件中,选择EAccountSDKNetwork.framework,点击“Open”按钮)。
(1) 增加动态库
CoreTelephony.framework MobileCoreServices.framework SystemConfiguration.framework CFNetwork.framework libsqlite3.tbd libz.tbd Security.framework
在工程中引入静态库后,需要在编译时添加-ObjC编译选项,避免静态库中加载不完全造成程序崩溃。(具体方法:点击TARGETS,点击“Build Settings”,搜索框内搜索Other Linker Flags,在“Other Linker Flags”选项后添加”-ObjC”,如图:
注意:如果你的Other Linker Flages已经有值也就是已经之前导入过其他的库文件,那么建议用以下方法引入静态库(添加-force_load和EAccountSDKNetwork.framework文件所在的路径,请根据自己文件的实际路径进行设置,如图:
iOS SDK调用流程如下:
(1) 根据iOS SDK接入指南接入SDK,完成SDK的导入,配置等准备工作;
(2) 配置网络权限,EAccountSDKNetwork.framework等动态库文件;
(3) 调用初始化接口;
【调用示例】
[EAccountSDK initWithSelfKey:kAppKey appSecret:kAppSecret]
【请求参数】
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
appKey | String | 是 | 向天翼账号平台申请的应用ID |
appSecret | String | 是 | 向天翼账号平台申请的应用密钥 |
(4) 调用获取授权码接口。
【调用示例】
[EAccountSDK getMobileCodeWithBussinessType:@“jy” timeoutInterval:3 completion: ^(NSDictionary * _Nonnull resultDic) { //成功 } failure:^(NSError * _Nonnull error) { //失败 }];
【请求参数】
参数名 | 类型 | 字段含义 | 说明 |
---|---|---|---|
apiTimeoutInterval | NSTimeInterval | 接口超时时间 | 传0或者小于0的数,则默认为3s |
bussinessType | NSString | 业务类型 | 业务类型,固定填写“jy” |
completion | block | 成功的回调代码块 | 成功的回调代码块 |
failue | block | 失败的回调,失败有两种情况,根据error.code来判断 | 失败的回调,失败有两种情况,根据error.code来判断 |
【响应参数】
返回结果resultDic为NSDictnory,格式说明:
参数名 | 类型 | 字段含义 | 说明 |
---|---|---|---|
result | int | 结果码 | 返回参数结果码,0表示成功,详细参考错误码定义(2.7) |
msg | String | 结果说明 | 结果码对应详细说明 |
data | String | 响应数据 | json格式的响应数据 |
accessCode | String | 授权码 | 天翼账号授权码,默认时效性1分钟 |
operatorType | String | 运营商标识 | CT电信,CU联通,CM移动,UN其他 |
expiredTime | int | code失效时间 | 表示该accessCode的有效时间,时间单位为s |
number | String | 脱敏号码 | 当前上网卡的脱敏号码 |
在调用预授权接口,结果为认证成功后,第二步是合作方平台调用服务端手机号校验接口,获得校验结果。调用获取手机号码接口需要传入第一步获取的授权码。
【接口定义】
接口名称 | verifyinfo |
接口描述 | 验证用户信息接口 |
承载协议 | HTTPS |
加密类型 | XXTEA、RSA |
承载网络 | 公网 |
请求方式 | POST/GET |
数据格式 | 返回数据:json格式 |
请求ContentType | application/x-www-form-urlencoded;charset=UTF-8 |
接口URL | https://open.e.189.cn/auth/verifyinfo.do |
标识 | 类型 | 必填 | 字段含义 | 说明 |
---|---|---|---|---|
appId | String | 是 | 应用ID | 开发者在注册应用的时候由天翼账号开放平台分发的接入方appId |
timeStamp | Long | 是 | 时间戳 | 毫秒 |
format | String | 是 | 返回格式 | 目前仅支持json和jsonp格式 |
sign | String | 是 | 签名 | 加密算法如下: sign=RSA(appId+format+params+timeStamp,RSA_Private_key) 1、需要注意参数拼接key升序排序。 2、RSA_Private_key对接应用的RSA私钥。 3、接入方需要在开发平台配置自身的RSA公钥,用于访问接口时平台侧验签 |
params | String | 是 | XXTea加密结果 | params= XXTea((accessCode=value1&mobile=value2&algorithm=MD5), appSecret) 1、appSecret为应用密钥,申请时天翼账号平台分配 2、参数拼接无顺序要求。 |
【params字段构成说明】
标识 | 类型 | 必填 | 说明 |
---|---|---|---|
accessCode | String | 是 | 访问令牌 |
mobile | String | 是 | 待校验手机号码 |
algorithm | String | 否 | 号码加密方式 可传值 “MD5” 和“SHA256”和“SM3” 明文不需传该参数 |
【响应参数】
标识 | 类型 | 含义 | 说明 |
---|---|---|---|
result | String | 响应结果码 | 0表示取号成功,非0表示失败 |
msg | String | 返回结果描述 | 结果描述与结果码result相对应 |
data | String | 加密数据 | 1、data采用接入方的RSA公钥加密,具体见data解密后数据结构; 2、data使用RSA私钥进行RSA解密。 |
【data字段解密后说明】
标识 | 类型 | 说明 |
---|---|---|
isVerify | String | 验证结果 0:一致,1:不一致,2:无法判断 |
示例
ü 请求
ü 响应
Json示例: { "result": 0, "msg": "操作成功", "data":"446a47c3b601cd41dc1afe43e926c2ee" } data解密后: { "isVerfiy ": 0 } }];
4 计费标准
(1) 合作方平台调用手机号校验接口,成功返回匹配验证结果时(返回匹配或不匹配)计费。
(2) 按照状态码返回值的情况下计费,详见下表。除此之外的其他状态码值,我们承诺不收取任何费用。计费口径:verifyinfo接口,result=0 且 isVerify=0或1。
字段标识 | 字段含义 | 说明 |
---|---|---|
result | 操作结果返回码 | 0 表示操作成功 |
isVerify | 验证结果: 0:一致 1:不一致 2:无法判断 | 0 和 1:计费 2:不计费 |
(3) 具体服务价格可向商务人员咨询。
(4) SDK及demo下载: https://id.189.cn/api?initialSrc=/html/api_detail_475.html
(5) 附录及常见问题:
1) SDK错误码定义
错误码 | 含义 |
---|---|
0 | 请求成功 |
-64 | permission-denied(无权限访问) |
-65 | API-request-rates-Exceed-Limitations(调用接口超限) |
-10001 | 授权失败 |
-10002 | 参数错误 |
-10003 | 解密失败 |
-10004 | ip受限 |
-10005 | 异网授权回调参数异常 |
-10006 | Mdn授权失败,且属于电信网络 |
-10007 | 重定向到异网授权 |
-10008 | 超过预授权阈值 |
-10009 | 时间戳过期 |
-20005 | sign-invalid(签名错误) |
Android自定义错误码
错误码 | 含义 |
---|---|
-8001 | 请求网络异常 |
-8002 | 请求参数异常 |
-8003 | 请先初始化SDK |
-8004 | 移动网络未开启 |
-8100 | 请求网络异常,请求失败 |
-720001 | 切换异常 |
-720002 | 切换异常超时 |
客户端类型详见 《客户端类型》
2) Android对接常见问题
Q:返回{"msg":"sign-invalid","result":-20005}
A: 签名错误,确保AppId和AppSceret是在天翼账号平台申请成功。
Q:permission-denied(无权限访问)
A:确保appId是在天翼账号平台开通权限。
3) iOS对接常见问题
Q:返回{"msg":"sign-invalid","result":-20005}
A:签名错误,确保AppId和AppSceret是在天翼账号平台申请成功。
Q:permission-denied(无权限访问)
A:确保AppId是在天翼账号平台开通权限。