日期 | 版本 | 描述 | 作者 |
---|---|---|---|
2019-03-28 | 1.0 | Bobo | |
2019-05-03 | 1.1 | bug修复,运营商sdk升级 | Bobo |
2019-08-08 | 1.25 | bug修复,部分接口调整以及添加短信验证码登录 | Lance |
2019-09-11 | 2.00 | bug修复,增加自定义授权页接口,移动运营商升级 | Sean |
一键登录文档修订历史目录1. 能力申请1.1 接入流程2. Android开发流程2.1 下载SDK及相关文档2.2 搭建开发环境2.3 开始开发2.4 一键登录功能2.5 授权页设计3. iOS开发流程3.1 下载SDK及相关文档3.2 导入 SDK3.3 编译设置3.4 SDK 的使用4. 平台接口4.1获取用户信息接口4.2 相关源码 5. SDK常见错误码定义5.1 SDK错误码定义5.2 移动错误定义5.3 联通错误定义5.4 电信错误定义
注意事项:
1.认证取号服务必须打开蜂窝数据流量,并且应用应有蜂窝数据权限;
2.取号请求过程需要消耗用户少量数据流量(国外漫游时可能会产生额外的费用);
3.使用WiFi网络不会影响一键登录功能。
1. 申请appid和appkey
根据《开发者接入流程文档》,联系易讯云商务人员按照文档要求创建开发者账号并申请appid和appkey,并提交应用名称、简介、类型、应用图标(256X256)、公钥1024bit pkcs#8格式)、调用“一键免密登录”能力 IP地址;安卓应用另提交登录页面类名、应用包名、应用签名,iOS应用另提交ios bundle ID。
2. 申请能力
应用创建完成后,联系易讯云商务人员申请开通“一键免密登录”能力。
说明
Android sdk支持版本:Android4.0以上
本文档为一键登录SDK1.1版本开发文档
请在易讯云官网下载最新的SDK集合包
www.51yixun.com
1. 建立你的工程。
2. 将 *.aar 拷贝到工程的libs目录下,如没有该目录,可新建。
3. 在build.gradle中添加依赖。
xndk {
abiFilters "armeabi"
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
//okHttp框架
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
//添加易讯云一键登录sdk
//Android 添加
implementation name: 'YxAccountSdk-release-2.0.0', ext: 'aar'
//Androidx 添加
implementation name: 'YxAccountSdkx-release-2.0.0', ext: 'aar'
//移动api
implementation name: 'CMCCSSOSDK-release', ext: 'aar'
//电信api
implementation name: 'CTAccountSdk_HY_v3.7.0_armeabi', ext: 'aar'
}
4. 添加必要的权限
AndroidManifest.xml设置
xxxxxxxxxx
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_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.CHANGE_NETWORK_STATE" />
权限说明:
权限 | 说明 |
---|---|
INTERNET | 允许应用程序联网,用于访问网关和认证服务器 |
READ_PHONE_STATE | 获取imsi用于判断双卡和换卡 |
ACCESS_WIFI_STATE | 允许程序访问WiFi网络状态信息 |
ACCESS_NETWORK_STATE | 获取网络状态,判断是否数据、wifi等 |
CHANGE_NETWORK_STATE | 允许程序改变网络连接状态 |
1. 创建一个YxAuthnHelper实例
YxAuthnHelper是SDK的功能入口,所有的接口调用都得通过YxAuthnHelper进行调用。因此,调用SDK,首先需要创建一个YxAuthnHelper实例
方法原型:
xxxxxxxxxx
public static YxAuthHelper getInstance(Context context)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
context | Context | 调用者的上下文环境,其中activity中this即可以代表。 |
示例代码:
xxxxxxxxxx
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
……
mAuthHelper = YxAuthHelper.getInstance(mContext);
}
2. 初始化 APPID
设置 APPID 和 appSecret
方法原型:
xxxxxxxxxx
public void init(String appId, String appSecret)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
appId | String | 应用appId |
appSecret | String | 应用秘钥 |
3. 初始化
可以通过initNet方法设置SDK的请求超时时间,默认10s,设置以ms为单位。
方法原型:
xxxxxxxxxx
public static void initNet(int connectTimeout, int readTimeout, int writeTimeout )
参数说明:
参数 | 类型 | 说明 |
---|---|---|
connectTimeout | int | SDK的http/https请求的链接超时时间。 |
readTimeout | int | SDK的http/https请求的读数据超时时间。 |
writeTimeout | int | SDK的http/https请求的写数据超时时间。 |
4. 设置主题
开发者可根据开放接口,对授权页进行定制
方法原型:
xxxxxxxxxx
YxAuthPageConfig yxAuthPageConfig = new YxAuthPageConfig.Builder(context)
/**
自定义配置
***/
.build()
public void setYxAuthPageConfig(YxAuthPageConfig yxAuthPageConfig)
5.验证码功能
短信验证码功能在特殊网络环境下,当一键登录获取手机号失败时,提供补充登录功能。开发者可选择是否启用短信验证码功能,默认false。
xxxxxxxxxx
public void setSmsLogin(boolean smsLogin)
6. 实现回调
所有的SDK接口调用,都会传入一个回调,用于接收SDK返回的调用结果。结果以 Json字符串的形式传递,
ResultListener的实现示例代码如下:
xxxxxxxxxx
mListener = new ResultListener() {
@Override
public void onResult(String result) {
……
}
};
短信验证码登录界面回调:
xxxxxxxxxx
smsLoginListener = new SmsLoginListener() {
@Override
public void getCode(String result) {
//获取短信验证码回调
}
@Override
public void getToken(String result) {
//获取token(即登录)回调
}
});
短信验证码回调 result 参数说明:
字段 | 类型 | 含义 |
---|---|---|
status | Int | 接口返回码,“0”为成功。 |
message | String | 返回码说明。 |
token | String | 成功时返回:临时凭证,token有效期30s。 |
expire | long | Token有效期,时间戳格式。 |
1. 预取号请求
使用 SDK 登录前,需要提前调用预登录接口,完成网络判断、蜂窝数据网络切换等操作,获取预登录结果、运营商类型等信息。
取号方法原型:
xxxxxxxxxx
public void preLogin(ResultListener resultListener)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
resultListener | ResultListener | 回调监听器,是一个java接口,需要调用者自己实现。 onResult是该接口中唯一的抽象方法,即void onResult(String result)。 |
响应参数:
onResult的参数result为json字符串,含义如下。
字段 | 类型 | 含义 |
---|---|---|
status | Int | 接口返回码,“0”为成功。 |
message | String | 返回码说明。 |
ispType | String | 运营商类型。CM:中国移动,CU:中国联通,CT:中国电信。 |
示例代码:
xxxxxxxxxx
//创建YxAuthnHelper实例
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
/***
判断和获取READ_PHONE_STATE权限逻辑
***/
mAuthnHelper = YxAuthnHelper.getInstance(mContext);
//实现取号回调
mListener = new ResultListener() {
@Override
public void onResult(String result) {
……// 应用接收到回调后的处理逻辑
}
};
//调用取号方法
mAuthnHelper.preLogin(mListener);
}
2. 授权请求
应用调用本方法时,SDK将拉起用户授权页面,用户确认授权后,SDK将返回token给应用客户端。
授权请求方法原型:
xxxxxxxxxx
//创建YxAuthnHelper实例
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
/***
判断和获取READ_PHONE_STATE权限逻辑
***/
mAuthnHelper = YxAuthnHelper.getInstance(mContext);
//实现回调
mListener = new ResultListener() {
@Override
public void onResult(String result) {
……// 应用接收到回调后的处理逻辑
}
};
//
mAuthnHelper.login(mListener);
}
请求参数:
字段 | 类型 | 含义 |
---|---|---|
resultListener | ResultListener | 回调监听器,是一个java接口,需要调用者自己实现; onResult是该接口中唯一的抽象方法,即void onResult(String result)。 |
响应参数:
onResult的参数result为json字符串,含义如下:
字段 | 类型 | 含义 |
---|---|---|
status | Int | 接口返回码,“0”为成功。 |
message | String | 返回码说明。 |
mobile | String | 成功时返回:用户脱敏手机号,仅联通含此字段,可用于设计登录页。 |
token | String | 成功时返回:临时凭证,token有效期30s。 |
expire | long | Token有效期,时间戳格式。 |
示例代码:
xxxxxxxxxx
//创建YxAuthnHelper实例
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
/***
判断和获取READ_PHONE_STATE权限逻辑
***/
mAuthnHelper = YxAuthnHelper.getInstance(mContext);
//实现回调
mListener = new ResultListener() {
@Override
public void onResult(String result) {
……// 应用接收到回调后的处理逻辑
}
};
mAuthnHelper.login(mListener);
}
1. 移动授权页设计
使用new YxAuthPageConfig.Build().setCmXXX()设置移动授权页中对应的元素。
2. 联通授权页设计
使用new YxAuthPageConfig.Build().setCuXXX()设置移动授权页中对应的元素。
3. 电信授权页设计
使用new YxAuthPageConfig.Build().setCtXXX()设置移动授权页中对应的元素。
4.验证码登录页面设计
使用new YxAuthPageConfig.Build().setSmsXXX()设置验证码登录页中对应的元素。
请在易讯云官网下载最新的SDK集合包
xxxxxxxxxx
www.51yixun.com
按实际情况导入debug 或者 release,以及相应的bundle文件。该 SDK 需要依赖第三方库 AFNetworking,Masonry请自行导入。
1. 配置ATS
在 info.plist 文件中添加 App Transport Security Settings 项,并在其中添加 Allow Arbitrary Loads 子项,同时将该子项的值设置为 YES
2. 添加依赖字段
(1)在BuildSetting-Hearder Search Paths 中设置 EAccountHYSDK.framework 文件的路径,并将右边的值设置为 recursive
(2)在BuildSetting-Other Linker Flags 中添加“-ObjC”、“-lstdc++”和“-force_load”加上EAccountHYSDK.framework/EAccountHYSDK 所在的路径(路径注意带双引号,比如""$(SRCROOT)/EAccountHYSDK.framework/EAccountHYSDK")。
3. 添加依赖库
在项目设置 target -> Build Phases->Link Binary with Libraries 下添加 libc++.1.tbd 和 libz.1.2.8.tbd。
1.在 APPDelegate 引入头文件
xxxxxxxxxx
#import <YxAuthHelperSDK/YxAuthHelper.h>
2、初始化
在 didfinsh 方法中,传入申请的 appid 和 appsecret 调用接口进行初始化及预登录。
方法原型:
xxxxxxxxxx
- (void)requestPreLogInWithAppIdServer:(NSString *)appId appSecretServer:(NSString *)appSecret completion:(TypeCompletionSucess)typeCompletionSucess failure:(TypeCompletionFailure)typeCompletionFaiure;
成功响应:
响应参数为 NSDictionary *result,包含内容如下:
字段 | 类型 | 含义 |
---|---|---|
status | String | 接口返回码,“0”为成功。 |
desc | String | 返回码说明。 |
operatorType | String | 运营商标识:移动CM,联通CU,电信CT |
失败响应:
响应参数为 NSError *error
3、获取token
在开发需要的地方调用以下接口获取 SIM 卡运营商返回的 Token,需要传入当前的controller。
短信验证码能在特殊网路环境下,一键登录失败时,提供补充登录功能。使用 SMSmode 设置是否选择短信验证码登录功能。
方法原型:
xxxxxxxxxx
- (void)getLogInTokenWithController:(id)viewController SMSmode:(BOOL)mode Completion:( TokenCompletionSucess)tokenCompletionSucess failure:(TokenCompletionFailure)tokenCompletionFailure;
响应参数:
响应参数为 NSDictionary *tokenResponse,包含内容如下:
字段 | 类型 | 含义 |
---|---|---|
status | String | 接口返回码,“0”为成功。 |
message | String | 返回码说明。 |
mobile | String | 成功时返回:用户脱敏手机号,仅联通含此字段,可用于设计登录页。 |
token | String | 成功时返回:取号凭证,token 有效期 30s。 |
expire | String | Token 有效期,时间 |
失败响应:
失败响应参数为:NSError *error
4、自定义授权页
使用YxAuthHelper 的 customUAModelBlock 和 cuAuthVCBlock 以及修改nib的方法来实现自定义授权页。
移动和联通的授权页使用block来设置;电信的通过修改EAccountOpenPageResource中的EAccountAuthVC.xib,然后用生成的EAccountAuthVC.nib文件将原来的EAccountAuthVC.nib替换,生成方法可以参考开发包中的“生成nib文件的方法.doc”
1.接口说明
请求地址:
xxxxxxxxxx
https://x.91yixun.com/auth/getUserInfo
协议:
HTTPS
请求方法:
POST
注意:开发者需到正确填报服务端出口IP地址后才能正常使用
2.参数说明
请求参数:
字段 | 类型 | 含义 |
---|---|---|
appId | String | 平台申请的appId。 |
token | String | 授权请求返回的token。 |
timeStamp | String | 生成请求时的时间戳。 |
sign | String | 签名校验,sign=RSAUtil.sign(appId+ timeStamp+ token, privateKey),”+”表示字符串连接,连接顺序不可变化。privateKey为申请appId和appSecret时填写的公钥对应的私钥,用于验证请求者身份。 |
响应参数:
字段 | 类型 | 含义 |
---|---|---|
status | Int | 接口返回码,“0”为成功。 |
message | String | 返回码说明。 |
mobile | String | 成功时返回:用户手机号。 |
相关源码请在易讯云官网下载。
xxxxxxxxxx
www.51yixun.com
错误码 | 含义 |
---|---|
0 | 请求成功 |
-100 | appId错误 |
-101 | appSecret错误 |
-110 | 签名错误 |
-111 | 公钥配置错误 |
-112 | token无效 |
-120 | 该appId没有有效订单 |
-121 | 账户暂停 |
-131 | 验证码失效 (短信验证码登录页) |
-132 | 验证码错误 (短信验证码登录页) |
-10002 | 该appId暂不支持的运营商 |
-10003 | 系统内部数据解析错误 |
-10004 | 未调用预登陆接口 |
-10005 | 系统忙 |
-10006 | 无运营商网络 |
-10008 | 网络错误 |
-10009 | 权限错误 |
错误码 | 含义 |
---|---|
102507 | 登录超时(授权页点登录按钮时) |
103101 | 请求签名错误 |
103102 | 包签名/Bundle ID错误 |
103108 | 短信验证码错误 |
103109 | 短信验证码校验超时 |
103111 | 网关IP错误 |
103119 | appid不存在 |
103211 | 其他错误,(如有需要请联系qq群609994083内的移动认证开发) |
103901 | 短验下发次数已达上限(5次/min,30次/day) |
103902 | scrip失效 |
103911 | token请求过于频繁,10分钟内获取token且未使用的数量不超过30个 |
105002 | 移动取号失败 |
105021 | 已达当天取号限额 |
105302 | appid不在白名单 |
105313 | 非法请求 |
200005 | 用户未授权(READ_PHONE_STATE) |
200020 | 用户取消登录 |
200021 | 数据解析异常 |
200022 | 无网络 |
200023 | 请求超时 |
200024 | 数据网络切换失败 |
200025 | 未知错误一般出现在线程捕获异常,请配合异常打印分析 |
200026 | 输入参数错误 |
200027 | 未开启数据网络 |
200028 | 网络请求出错 |
200038 | 异网取号网络请求失败 |
200039 | 异网取号网关取号失败 |
200040 | UI资源加载异常 |
200048 | 用户未安装sim卡 |
200050 | EOF异常 |
200060 | 切换账号(未使用SDK短验时返回) |
200072 | CA根证书校验失败 |
200080 | 本机号码校验仅支持移动手机号 |
200082 | 服务器繁忙 |
错误码 | 含义 |
---|---|
100 | 应用未授权 |
101 | 应用秘钥错误 |
102 | 应用无效 |
103 | 应用未授权该 IP 访问 |
104 | 应用访问次数丌足 |
105 | 应用包名丌正确 |
200 | tokenId 无效 |
201 | token 已失效 |
202 | token 未授权该应用访问 |
203 | 登录鉴权级别不满足接口鉴权要求 |
300 | 接口未开放 |
302 | IP 未授权码访问该接口 |
303 | 应用访问接口次数超日限额 |
400 | 请求参数为空 |
401 | 请求参数不完整 |
402 | 请求参数非法 |
600 | 请求非法 |
1000 | 请求解析错误 |
1001 | 请求已失效 |
1002 | 验签失败 |
1003 | 授权码已过期 |
1004 | 加密方式不支持 |
1005 | RSA 加密错误 |
1010 | 服务间访问失败 |
1011 | 服务间访问错误 |
2004 | 用户不存在 |
3001 | unikey 无效 |
3002 | 跳转异网取号 |
3003 | 本网执行取号失败,丌需要重定向 |
3004 | NET 取号失败 |
3005 | 上网方式为 WIFI,无法取号 |
3006 | urlencode 编码失败 |
3007 | 请求认证接口异常 |
3008 | imsi 取号失败 |
3009 | 非联通号码 |
3010 | 网关取号错误 |
3011 | 源 IP 鉴权失败 |
3012 | 网关取号失败 |
3015 | 获取 accessCode 请求参数失败 |
错误码 | 含义 |
---|---|
-64 | permission-denied(无权限访问) |
-65 | API-request-rates-Exceed-Limitations(调用接口超限) |
-10001 | 取号失败 |
-10002 | 参数错误 |
-10003 | 解密失败 |
-10004 | ip 受限 |
-10005 | 异网取号回调参数异常 |
-10006 | Mdn 取号失败,且属于电信网络 |
-10007 | 重定向到异网取号 |
-10008 | 超过预设取号阈值 |
-10009 | 时间戳过期 |
-20005 | sign-invalid(签名错误) |
-20006 | 应用不存在 |
-20007 | 公钥数据不存在 |
-20100 | 内部解析错误 |
-20102 | 加密参数解析失败 |
-30001 | 时间戳非法 |
-30003 | topClass 失效, 请查看 5.3+5.4 常见问题。 |
51002 | 参数为空 |
51114 | 无法获取手机号数据 |
Android 自定义错误码
错误码 | 含义 |
---|---|
-8100 | 网络无连接 |
-8001 | 请求网络异常 |
-8002 | 请求参数异常 |
-8003 | 请求超时 |
-8004 | 移动网络未开启 |
-8005 | 请先初始化 SDK |
-8005 | 请先初始化 SDK |
-8101 | 响应码错误 |
-8102 | Socket 超时异常(读取超时、连接超时) |
-8103 | 域名解析异常 |
-8104 | IO 异常 |
-720001 | 切换异常 |
-720002 | 切换异常超时 |
iOS 自定义错误码
错误码 | 含义 |
---|---|
-8001 | 请求网络异常 |
-8201 | 响应码错误 |
-8005 | 请先初始化 SDK |