| 日期 | 版本 | 描述 | 作者 |
|---|---|---|---|
| 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'//移动apiimplementation name: 'CMCCSSOSDK-release', ext: 'aar'//电信apiimplementation 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实例
方法原型:
xxxxxxxxxxpublic static YxAuthHelper getInstance(Context context)
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| context | Context | 调用者的上下文环境,其中activity中this即可以代表。 |
示例代码:
xxxxxxxxxxpublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mContext = this;……mAuthHelper = YxAuthHelper.getInstance(mContext);}
2. 初始化 APPID
设置 APPID 和 appSecret
方法原型:
xxxxxxxxxxpublic void init(String appId, String appSecret)
参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| appId | String | 应用appId |
| appSecret | String | 应用秘钥 |
3. 初始化
可以通过initNet方法设置SDK的请求超时时间,默认10s,设置以ms为单位。
方法原型:
xxxxxxxxxxpublic 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. 设置主题
开发者可根据开放接口,对授权页进行定制
方法原型:
xxxxxxxxxxYxAuthPageConfig yxAuthPageConfig = new YxAuthPageConfig.Builder(context)/**自定义配置***/.build()public void setYxAuthPageConfig(YxAuthPageConfig yxAuthPageConfig)
5.验证码功能
短信验证码功能在特殊网络环境下,当一键登录获取手机号失败时,提供补充登录功能。开发者可选择是否启用短信验证码功能,默认false。
xxxxxxxxxxpublic void setSmsLogin(boolean smsLogin)
6. 实现回调
所有的SDK接口调用,都会传入一个回调,用于接收SDK返回的调用结果。结果以 Json字符串的形式传递,
ResultListener的实现示例代码如下:
xxxxxxxxxxmListener = new ResultListener() {@Overridepublic void onResult(String result) {……}};
短信验证码登录界面回调:
xxxxxxxxxxsmsLoginListener = new SmsLoginListener() {@Overridepublic void getCode(String result) {//获取短信验证码回调}@Overridepublic void getToken(String result) {//获取token(即登录)回调}});
短信验证码回调 result 参数说明:
| 字段 | 类型 | 含义 |
|---|---|---|
| status | Int | 接口返回码,“0”为成功。 |
| message | String | 返回码说明。 |
| token | String | 成功时返回:临时凭证,token有效期30s。 |
| expire | long | Token有效期,时间戳格式。 |
1. 预取号请求
使用 SDK 登录前,需要提前调用预登录接口,完成网络判断、蜂窝数据网络切换等操作,获取预登录结果、运营商类型等信息。
取号方法原型:
xxxxxxxxxxpublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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集合包
xxxxxxxxxxwww.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.接口说明
请求地址:
xxxxxxxxxxhttps://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 | 成功时返回:用户手机号。 |
相关源码请在易讯云官网下载。
xxxxxxxxxxwww.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 |