客户身份(CIAM)

手机号码一键登录

# 文档说明

本文为您介绍iOS客户端如何接入一键登录功能。一键登录功能,即号码认证,整合三大运营商特有的数据网关认证能力,升级短信验证码方式,应用于用户注册、登录等场景。

一键登录使用场景:用户无需输入手机号码,SDK会拉起授权页,用户确认授权后,SDK会获取token,服务端携带token到运营商网关获取用户当前上网使用的号码,最终认证结果返回给App服务端。

竹云IDaaS一键登录SDK基于阿里云“号码认证”SDK进行了封装,用户可遵循阿里云接入规范接入此SDK。

# 流程说明

# 一键登录流程

集成流程说明

  1. 注册阿里云的私钥和IDaaS服务端的配置参数到IDaaS SDK。

  2. 终端网络检测,通过阿里云服务端检查网络环境是否可行,若用户开启了4G流量且网络通畅,成功调用IDaaS SDK并拉起授权页面。

  3. 用户确认授权页面的内容,并同意相关协议。IDaaS SDK会获取授权TOKEN,传递到IDaaS服务端。

  4. IDaaS服务端使用TOKEN到阿里云服务端获取用户手机号后,发起认证,若认证成功,则返回session_token和id_token,可保存到App客户端或用于其他;若认证不成功,返回错误码和原因,进行下一步跳转。

  5. 客户端可以使用id_token来校验登录有效期和获取用户基本信息。

  6. 客户端可以使用session_token来刷新id_token。

# 对接流程

# 准备工作

# 注册阿里云账号

参考阿里云官网开通账号流程 (opens new window)认证方案管理 (opens new window)

# 开通号码认证功能

  1. 访问号码认证服务产品详情页以企业用户开通购买

  2. 单击立即开通或访问产品控制台。

  3. 进入控制台首页,勾选我已阅读并同意《号码认证服务协议》。

  4. 单击立即开通,完成产品开通。

  5. 登录号码认证服务控制台 (opens new window),在标准版选项卡,下载并解压iOS SDK。

# 添加认证方案

  1. iOS app接入方案,需要使用iOS app上架的Bundle ID,按照如下填写。

  2. 填写完成后点击确定,保存配置,拿到密钥保存在app本地,当使用IDaaS SDK时,传入SDK的初始化方法(在appdelegate中初始化时候使用),参见sdk初始化的步骤。

# 配置IDaaS后台认证源

  1. 登录IDaaS企业中心,选择 “认证-》认证源管理-》内置认证源”,点击“本机号码一键登录”。

  2. 弹出“本机号码一键登录”配置页面,配置本机号码一键登录需要的参数。

    参数 参数说明
    号码认证服务商 默认阿里云
    Access Key ID 填入阿里云创建用户时候产生的AccessKey
    AccessKey Secret 填入阿里云创建用户时候产生的AccessKey Secret
  3. 在阿里云工作台创建用户,勾选下框,可获取参数AccessKey和AccessKey Secret,将获得的参数配到上一步骤页面中。

  4. 登录IDaaS后台 点击 资源-->应用-->选择跟自己相关的应用点击即可查看到。

# 环境搭建

# 引入依赖包

登录号码认证服务控制台 (opens new window),在标准版选项卡,下载并解压iOS SDK。

ATAuthSDK.framework  //阿里云的sdk,当前版本是2.13.2
YTXMonitor.framework 	//阿里云的sdk,当前版本是2.3.2
YTXOperators.framework 	//阿里云的sdk,当前版本是1.3.2
1
2
3

# 添加主库

AuthnCenter_common_2C.framework	  
AuthnCenter_mobileNumberAuth_AliYun_2C.framework  
AuthnCenter_mobileNumberAuth_AliYun_2C.bundle//资源文件
1
2
3

将依赖库和IDaaSSDK拖入工程,并且引入方式如下:

并且引入Pod的依赖包。

pod 'JWT', '~> 3.0.0-beta.14'

# Targets设置

  • IDaaS一键登录SDK最低版本可兼容ios 11。

  • 在framework, library,and embedded content里引入以下包

  • Framework,Libraries,andEmbedded Content里添加主库和依赖包,且在Other Linker Flags增加-ObjC。

  • 若您的终端设备使用的是中国联通SIM卡的5G移动数据,可能会导致使用一键登录功能获取本机号码失败。您可在菜单栏选择TARGETS > Info > Custom iOS Target Properties > App Transport Security Settings > Allow Arbitrary Loads,并将其值设置为YES可解决此问题。

  • 配置bitcode,如下图,设置bitcode为NO。

# 开发集成

引入头文件:

在appdelegate中引用如下
#import < AuthnCenter_common_2C /BCIDACommonManager.h>
#import <AuthnCenter_mobileNumberAuth_AliYun_2C/BCMobileNumberAuthManager.h>
1
2
3

# SDK初始化

将添加认证方案中获取的密钥保存在app端,在app的入口地方,注册密钥到IDaaS SDK。 IDaaS SDK提供两个初始化方法,您可在初始化方法调用之后,在需要使用一键登录的地方,调用startMobileAuthWithWindowsMode方法拉起窗口。

本机号码一键登录初始化的示例,将初始化的两个方法在appdelegate中的didFinishLaunchingWithOptions方法中初始化。

//1. 基本配置初始化
[[[[[BCIDACommonManager sharedInstance] initWithDomain:@"https://你的后台租户.com"] initWithClientID:@"后台租户clientID"] initWithSSLCerVerification:NO] setLogEnabled:YES] ;

//2. 一键登录初始化方法
[[BCMobileNumberAuthManager sharedInstance] registAliYunSecreteKey:aliYunSecKey andWithCompletionHandler:^(NSDictionary * _Nonnull resultDic) {
        //成功时resultDic=@{resuFltCode:600000,msg:...}
}];
1
2
3
4
5
6
7

基本配置初始化主类BCIDACommonManager方法简介:

/**
  * 函数名:sharedInstance
   * @param 无
   * @return 单例对象实例类
 */
+ (instancetype )sharedInstance ;

/**
  * 函数名:initWithDomain
   * @param domain,以.com结尾。
   * @return 实例类
 */
-(BCIDACommonManager)initWithDomain:(NSString)domain

/**
  * 函数名:initWithClientID
   * @param client id。
   * @return 实例类
 */
-(BCIDACommonManager)initWithClientID:(NSString)clientID;

/**
  * 函数名:setLogEnabled
   * @param 布尔值是否开启log。
   * @return 实例类
 */
-(void)setLogEnabled:(BOOL)enable;

/**
  * 函数名:initWithSSLCerVerification
   * @param 布尔值设置ssl证书是否开启检测。
   * @return 实例类
 */
-(BCIDACommonManager*)initWithSSLCerVerification:(bool)sslCerVerification;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

一键登录初始化主类BCMobileNumberAuthManager方法简介:

/**
  * 函数名:sharedInstance
   * @param 无
   * @return 单例对象实例类
 */
+ (instancetype )sharedInstance ;

/**
  * 函数名:registAliYunSecreteKey
   * @param aliYunSecreteKey传入阿里云的私钥。
   * @return BCMobileNumberAuthRegistCompletionHandler回调函数,包含 NSDictionary * resultDic,成功时resultDic=@{resuFltCode:600000,msg:...},其他情况时"resultCode"值请参考PNSReturnCode
 */
-(void)registAliYunSecreteKey:(NSString*)aliYunSecreteKey andWithCompletionHandler:(BCMobileNumberAuthRegistCompletionHandler)completionCallBack;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 环境检测

App客户端使用一键登录功能,需先通过阿里云的检测方法来检测环境是否合适。终端手机需满足4G环境下才能被调用成功。在初次或切换移动数据网络之后需要重新检测环境,一般在一次登录认证流程开始前调一次即可。

TXCommonHandler对象方法简介:

/**
* 函数名:checkEnvAvailableWithComplete
* @brief:检查及准备调用环境,resultDic返回PNSCodeSuccess才能调用下面的功能接口,在初次或切换移动数据网络之后需要重新调用,一般在一次登录认证流程开始前调一次即可
*@param complete:异步结果回调,成功时resultDic=@{resultCode:600000, msg:...},其他情况时"resultCode"值请参考PNSReturnCode,只有成功回调才能保障后续接口调用
*/
[TXCommonHandler sharedInstance];//获取阿里云单例
-(void)checkEnvAvailableWithComplete:(void(^_Nullable)(NSDictionary* Nullable resultDic))complete;
1
2
3
4
5
6
7

检测成功后,可以调用加速的一个方法,加速一键登录授权页弹起,防止调用一键登录拉起等待弹起授权页时间过长。(根据实际情况加速方法使用不是必须的)

/**
* 函数名:accelerateLoginPageWithTimeout
* @brief:加速一键登录授权页弹起,防止调用getLoginTokenWithTimeout:controller:model:complete: 等待弹起授权页时间过长
* @param timeout:接口超时时间(单位:s),默认3.0s,值为0.0时采用默认超时时间
* @param complete:结果异步回调,成功时resultDic=@{resultCode:600000,msg:...},其他情况时"resultCode"值请参考PNSReturnCode
*/
-(void)accelerateLoginPageWithTimeout:(NSTimeInterval)timeout complete:(void (^_Nullable)(NSDictionary * Nonnull resultDic))complete;
1
2
3
4
5
6
7

# 唤起授权页面

环境检测成功后,加速方法也调用后,拉起IDaaS SDK的一键登录方法。

示例代码:

[[BCMobileNumberAuthManager sharedInstance] startMobileAuthWithWindowsMode:nil andWithViewController:self andWithCompletionCallBack:^(NSString * _Nonnull code, id  _Nonnull data) {
        //code=@”0” 的时候登录成功,data返回session_token和id_token,code=其他的时候登录失败
    }];
回调函数返回结果,授权页面自动关闭
1
2
3
4

主类BCMobileNumberAuthManager方法简介:

/**
* 函数名:startMobileAuthWithWindowsMode
* @brief:一键登录页面拉起流程
* @param (TXCustomModel*)customMode 页面定制类,可以通过此类定制页面样式,请参考后面章节
*@param (UIViewController*)fromVC 从目前的viewcontroller 推出一键登录页面
* @param BCMobileNumberAuthProcessCompletionHandler()回调函数见接下来的表格
*/
-(void)startMobileAuthWithWindowsMode:(TXCustomModel*)customMode andWithViewController:(UIViewController*)fromVC andWithCompletionCallBack:(BCMobileNumberAuthProcessCompletionHandler)completionCallBack;
1
2
3
4
5
6
7
8

BCMobileNumberAuthProcessCompletionHandler回调函数返回码:

code码 说明
code=0 登录成功,此时data会返回NSDictionary: data=@{@"session_token":sessionToken内容,@"id_token":idToken内容};
code=1 登录失败,data返回字符串描述错误
code=错误码(阿里云错误码和事件码),请参照阿里云错误码表格(错误码事件响应码 登录不成功,data返回NSDictionary可获取当前运行结果的值,
code=错误码(sdk后台错误码) 登录不成功,data返回字符串错误描述信息

IDaaS SDK默认的一键登录页面,包含脱敏显示的号码、返回按钮、复选框协议签署以及其他方式登录的按钮。以上组件的样式、文字描述可定制化。

其中,本机号码一键登录、返回以及其他方式登录按钮,点击操作后,IDaaS SDK将向App客户端发起回调,返回内容为返回码和相关数据,并关闭窗口,即操作完成;复选框协议签署,操作后回调函数给出相关数据,窗口不会被关闭。

# 授权界面设计

确保用户在登录过程中将手机号码信息授权给开发者使用的知情权,一键登录需要开发者提供授权页登录页面供用户授权确认。开发者在调用授权登录方法前,必须弹出授权页,明确告知用户当前操作会将用户的本机号码信息传递给应用。

TXCustomModel *model = [[TXCustomModel alloc] init];
是阿里云对页面样式定制的类,您可以实例化类,设置页面样式,然后将此实例传入sdk的拉起方法
1
2

示例代码:

-(TXCustomModel*)AddThemeExample{
    TXCustomModel *model = [[TXCustomModel alloc] init];

        model.supportedInterfaceOrientations = UIInterfaceOrientationMaskPortrait;
         model.navIsHidden = NO;
         model.logoIsHidden = NO;
    model.navColor=[UIColor clearColor];
        NSDictionary *attributes = @{
            NSForegroundColorAttributeName : [UIColor whiteColor],
            NSFontAttributeName : [UIFont systemFontOfSize:20.0]
        };
        NSDictionary *attributesNavTex = @{
            NSForegroundColorAttributeName : [UIColor blackColor],
            NSFontAttributeName : [UIFont systemFontOfSize:20.0]
        };
        NSDictionary *attributesslogenTex = @{
            NSForegroundColorAttributeName : [UIColor grayColor],
            NSFontAttributeName : [UIFont systemFontOfSize:20.0]
        };
        UIColor* UIBlue=[UIColor colorWithRed:255.0/255.0 green:99.0/255.0 blue:71.0/255.0 alpha:1.0];
        NSDictionary *attributeschangeTex = @{
            NSForegroundColorAttributeName : UIBlue,
            NSFontAttributeName : [UIFont systemFontOfSize:15.0]
        };
        
        model.navTitle = [[NSAttributedString alloc] initWithString:@"登录" attributes:attributesNavTex];
        model.loginBtnText=[[NSAttributedString alloc] initWithString:@"本机号码一键登录" attributes:attributes];
        
        UIImage* backImage=  [UIImage imageNamed:@"fanhuianniu-2"];
        UIImage* uncheckImage=[UIImage imageNamed:@"gou-2"];
        UIImage* checkImage=[UIImage imageNamed:@"gou"];
       
        model.navBackImage=backImage;
        model.checkBoxImages=@[uncheckImage,checkImage];
        model.changeBtnTitle=[[NSAttributedString alloc] initWithString:@"其他方式登录" attributes:attributeschangeTex];
        model.privacyFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
            
            float startx= (BCIDAScreenWidth-frame.size.width)*0.5;
            frame.origin.x=startx;

            return frame;
        };
        model.logoImage = [UIImage imageNamed:@"wangluo"];

    model.logoFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
        frame=CGRectMake(frame.origin.x, (frame.origin.y+100), frame.size.width, frame.size.height);
        return frame;
    };
    
       model.numberFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
            frame=CGRectMake(frame.origin.x, (frame.origin.y+40), frame.size.width, frame.size.height);
            return frame;
        };
        model.privacyNavBackImage=backImage;
        model.sloganIsHidden=YES;
        model.loginBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
            frame=CGRectMake(frame.origin.x, (frame.origin.y+40), frame.size.width, frame.size.height);
            return frame;
        };
    model.changeBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
        frame=CGRectMake(frame.origin.x, (frame.origin.y+40), frame.size.width, frame.size.height);
        return frame;
    };
    return model;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

# IDToken校验和获取用户信息

在登录成功后会返回session_token和id_token。id_token可以用来获取用户信息和校验登录有效期。

  1. 校验idToken

  2. 从idtoken中获取用户信息(可以不通过校验直接调用此方法)

# 校验id_token

调用示例:

  [[BCIDAIDTokenManager sharedInstance] verifySignWithIdToken:idToken andWithCallBack:^(NSString * _Nonnull code, id  _Nonnull data) {
          }];
1
2

主类BCIDAIDTokenManager介绍:

/**
   * 函数名:sharedInstance
   * @param 无入参
   * @return返回对象单例实例
*/
+ (instancetype )sharedInstance;

/**
* 函数名:verifySignWithIdToken
* @brief:校验idtoken是否在登录有效期和应用一致的方法
* @param idToken登录时候返回的
* @param BCIDAIdTokenVerifyHandlerBlock回调函数:
NSString code
id       data
**/
-(void)verifySignWithIdToken:(NSString*)idToken andWithCallBack:(BCIDAIdTokenVerifyHandlerBlock)callback;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

返回值:

code(NSString) data data的数据类型和说明
0 success [NSString]验签成功
1 错误描述 [NSString]入参为空,sdk初始化参数domain和clientID没有设置
106 时间过期 [NSString]过期的idtoken
107 clientID不符合 [NSString]可能使用了其他应用的clientID
103 验签失败 [NSString]验签过程失败
102 获取公钥为空 [NSString]验签过程中错误
见文末错误码集合 见文末错误码集合 还可能返回文末的错误码

# 从idToken解析出用户信息

调用示例:

[[BCIDAIDTokenManager sharedInstance] getUserInfoFromIdTokenWithIdToken:idToken andWithCallBack:^(NSString * _Nonnull code, id  _Nonnull data) {
            
}];
1
2
3

主类BCIDAIDTokenManager介绍:

/**
   * 函数名:sharedInstance
   * @param 无入参
   * @return返回对象单例实例
*/
+ (instancetype )sharedInstance;

/**
* 函数名:getUserInfoFromIdTokenWithIdToken
* @brief:从idToken解析用户信息
* @param idToken登录返回的
* @param BCIDAIdTokenGetInfoHandlerBlock回调函数:
NSString code
id       data

**/
-(void)getUserInfoFromIdTokenWithIdToken:(NSString*)idToken andWithCallBack:(BCIDAIdTokenGetInfoHandlerBlock)callback;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

用户信息参数说明:

参数名 描述
iss 令牌签发人
aud 令牌接收者,应用的clientId
exp 令牌的过期时间
jti 令牌的id
iat 令牌的签发时间
sub 固定为subject
name 用户姓名
mobile 用户手机号
id 用户的id
userName 用户名
email 用户邮箱

回调函数返回值:

成功示例:
code=0
data=
{
	"id": "20220729174957176-2C7F-A2C54C293",
	"exp": 1659407592,
	"nbf": 1659407172,
	"mobile": "+86-13808603636",
	"jti": "7iwCYPo8EYcmLAD18x-CAw",
	"iss": "https:\/\/sdk2c.idaas-test-alpha.bccastle.com\/api\/v1\/oauth2",
	"userName": "zhangrui1",
	"sub": "20220729174957176-2C7F-A2C54C293",
	"aud": "S1ScicdIVR1QUbNs8TBz6BYVd2Zt8Adc",
	"iat": 1659407292,
	"email": "",
	"name": "zhangrui1"
}

失败示例
code=102
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 刷新IDToken

调用示例:

[[BCIDAIDTokenRefreshManager sharedInstance] refreshIdTokenWithSessionToken:sessionToken andWithCallBack:^(NSString * _Nonnull code, id  _Nonnull data) {
            NSString* jsonS=(NSString*)data;
         NSDictionary* dict=  [self dictionaryWithJsonString:jsonS];//解析jsonStr到NSDictionary
          NSString* idTok= [dict objectForKey:@"id_token"];
            NSString* session_tok=[dict objectForKey:@"session_token"];
            NSString* expr=[dict objectForKey:@"expire"];
                  }];
1
2
3
4
5
6
7

主类BCIDAIDTokenManager介绍:

/**
   * 函数名:sharedInstance
   * @param 无入参
   * @return返回对象单例实例
*/
+ (instancetype )sharedInstance;

/**
* 函数名:refreshIdTokenWithSessionToken
* @brief:刷新idToken
* @param sessionToken登录返回的
* @param BCIDAIdTokenRefreshIDTokenHandlerBlock回调函数:
NSString code
id       data

**/
-(void)refreshIdTokenWithSessionToken:(NSString*)sessionToken andWithCallBack:(BCIDAIdTokenRefreshIDTokenHandlerBlock)callBack;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

回调函数返回值:

成功示例:
code=0
data=
{
  "id_token" : "eyJraWQiOiJhODJkzJjLmlkYWFzLXRllKp6w",
  "session_token" : "apcOKuyry7kASh9h6mtf2G2GbettkyiU",
  "expire" : 7200
}

失败示例(获取不到数据)
code=1
1
2
3
4
5
6
7
8
9
10
11

# 阿里云返回码

返回码 返回码描述 建议
600000 获取Token成功 无。
600001 唤起授权页成功 无。
600002 唤起授权页失败 建议切换到其他登录方式。
600004 获取运营商配置信息失败 创建工单联系工程师。
600005 手机终端不安全 切换到其他登录方式。
600007 未检测到SIM卡 提示用户检查SIM卡后重试。
600008 移动数据网络未开启 提示用户开启移动数据网络后重试。
600009 无法判断运营商 创建工单联系工程师。
600010 未知异常 创建工单联系工程师。
600011 获取Token失败 切换到其他登录方式。
600012 预取号失败 无。
600013 运营商维护升级,该功能不可用 创建工单联系工程师。
600014 运营商维护升级,该功能已达最大调用次数 创建工单联系工程师。
600015 接口超时 切换到其他登录方式。
600017 App ID、App Key解析失败 密钥未设置或者设置错误,请先检查密钥信息,如密钥无问题创建工单联系工程师。
600021 点击登录时检测到运营商已切换 切换到其他登录方式。
600023 加载⾃定义控件异常 检查⾃定义控件添加是否正确。
600024 终端环境检查⽀持认证 无。
600025 终端检测参数错误 检查传⼊参数类型与范围是否正确。
600026 授权页已加载时不允许调用加速或预取号接口 检查是否有授权页拉起后,调用preLogin或者accelerateAuthPage接口的行为不被允许。

授权页点击事件响应码:

响应码 响应码描述
700000 点击返回,⽤户取消免密登录。
700001 点击切换按钮,⽤户取消免密登录。
700002 点击登录按钮事件。
700003 点击check box事件。
700004 点击协议富文本文字事件。

# 运营商错误码

# 中国移动

返回码 返回码描述
103000 成功。
102507 登录超时(授权页点登录按钮时)。
103101 请求签名错误。
103102 包签名或Bundle ID错误。
103111 网关IP错误或错误的运营商请求。
103119 AppID不存在。
103211 其他错误,请提工单联系工程师。
103412 无效的请求有加密方式错误、非JSON格式和空请求等。
103414 参数校验异常。
103511 服务器IP白名单校验失败。
103811 Token为空。
103902 短时间内重复登录,造成script失效。
103911 Token请求过于频繁,10分钟内获取Token且未使用的数量不超过30个。
104201 Token重复校验失败、失效或不存在。
105018 使用了本机号码校验的Token获取号码,导致Token权限不足。
105019 应用未授权。
105021 已达当天取号限额。
105302 AppID不在白名单。
105313 非法请求。
200005 用户未授权(READ_PHONE_STATE)。
200010 无法识别SIM卡或没有SIM卡(Android)。
200020 用户取消登录。
200021 数据解析异常。
200022 无网络。
200023 请求超时。
200024 数据网络切换失败。
200025 位置错误(一般是线程捕获异常、socket、系统未授权移动数据网络权限等,请提工单联系工程师)。
200026 输入参数错误。
200027 未开启移动数据网络或网络不稳定。
200028 网络请求出错。
200038 异网取号网络请求失败。
200039 异网取号网关取号失败。
200048 用户未安装SIM卡。
200050 EOF异常。
200061 授权页面异常。
200064 服务端返回数据异常。
200072 CA根证书校验失败。
200082 服务器繁忙。
200086 ppLocation为空。
200087 仅用于监听授权页成功拉起。
200096 当前网络不支持取号。

# 中国联通

返回码 返回码描述
0 表示请求成功。
-10008 JSON转换失败。
1,请求超时 请求超时。
1,私网IP查找号码失败 私网IP查找号码失败。
1,私网IP校验错误 私网IP校验错误。
1,源IP鉴权失败 源IP鉴权失败。
1,获取鉴权信息失败 获取鉴权信息失败。
1,获得的手机授权码失败 一般是由于请求SDK超时导致的失败。
1,网关取号失败 网关取号失败。
1,网络请求失败 网络请求失败。
1,验签失败 签名校验失败。
1,传入code和AppID不匹配 传入code和AppID不匹配。
1,似乎已断开与互联网的链接 网络不稳定导致连接断开。
1,此服务器的证书无效 连接到不安全的服务器,提工单联系工程师。
1,PIP校验不通过 提工单联系工程师。
1,网关并发连接数受限 提工单联系工程师。
1,目前不允许数据链接 提工单联系工程师。
1,无法连接到服务器 提工单联系工程师。
1,系统内部错误 提工单联系工程师。
1,取号网关内部错误 取号网关内部错误,提工单联系工程师。
1,connect address error 连接地址错误,一般是由于超时导致失败。
1,select socket error 选择socket错误。
1,handshake failed 握手失败。
1,decode ret_url fail URL解码失败。
1,connect error 连接错误。
1,read failed 提工单联系工程师。
1,response null 无响应,提工单联系工程师。
1,未知错误 提工单联系工程师。
2,请求超时 接口请求耗时超过timeout设定的值。

# 中国电信

返回码 返回码描述
-64 Permission-denied(无权限访问)。
-65 API-request-rates-Exceed-Limitations(调用接口超限)。
-10001 取号失败,mdn为空。
-10002 参数错误。
-10003 解密失败。
-10004 IP受限。
-10005 异网取号回调参数异常。
-10006 mdn取号失败,且属于电信网络。
-10007 重定向到异网取号。
-10008 超过预设取号阈值。
-10009 时间戳过期。
-10013 Perator_unsupported,提工单联系工程师。
-20005 Sign-invalid(签名错误)。
-8001 网络异常,请求失败。
-8002 请求参数错误。
-8003 请求超时。
-8004 移动数据网络未开启。
-8010 无网络连接(网络错误)。
-720001 Wi-Fi切换4G请求异常。
-720002 Wi-Fi切换4G超时。
80000 请求超时。
80001 网络连接失败、网络链接已中断、Invalid argument、目前不允许数据连接。
80002 响应码错误404。
80003 网络无连接。
80005 socket超时异常。
80007 IO异常。
80008 No route to host.
80009 Nodename nor servname provided, or not known.
80010 Socket closed by remote peer.
80800 Wi-Fi切换超时。
80801 Wi-Fi切换异常。

# IDaaS返回码

状态码 错误码 (error_code) 错误说明 (error_msg) 处理措施
400 IDAAS.SDK.COMMON.1001 Parameter {0} cannot be left blank
参数 {0} 不能为空
400 IDAAS.SDK.COMMON.1002 The {0} parameter format is incorrect
参数 {0} 格式错误
400 IDAAS.SDK.COMMON.1003 Device information is incomplete
设备信息不完整
400 IDAAS.SDK.COMMON.1004 Signature decryption error
签名解密错误
400 IDAAS.SDK.COMMON.1005 The {0} has failed
{0} 已失效
400 IDAAS.SDK.COMMON.1006 The {0} parameter error
{0} 参数错误
400 IDAAS.SDK.COMMON.1007 The {0} parameter type error
{0}参数类型错误
500 IDAAS.SDK.COMMON.1008 The system is busy. Try again later
系统繁忙。稍后再试
400 IDAAS.SDK.COMMON.1009 Unknown authentication configuration
未知的认证配置
400 IDAAS.SDK.COMMON.1010 Failed to obtain the enterprise center global configuration
获取企业中心全局配置失败
400 IDAAS.SDK.COMMON.1011 Failed to obtain the international area code configuration
获取国际区号配置失败
400 IDAAS.SDK.COMMON.1012 The x-client-ID is incorrect and the corresponding application cannot be found
X-client-id错误,找不到对应的应用
400 IDAAS.SDK.COMMON.1013 The corresponding user is not found
未找到对应的用户
400 IDAAS.SDK.COMMON.1014 Application private key not found
未找到应用私钥
400 IDAAS.SDK.LOGIN.1001 Error calling interface {0}
调用 {0} 接口出错
400 IDAAS.SDK.LOGIN.1002 User not bound
用户未绑定
400 IDAAS.SDK.LOGIN.1003 The user has been locked due to too many unsuccessful login attempts. It will be unlocked in {0} minutes and {1} seconds
由于多次登录失败,用户已被锁定。 它将在 {0} 分钟和 {1} 秒内解锁
400 IDAAS.SDK.LOGIN.1004 Failed to obtain the password policy
获取密码策略错误
400 IDAAS.SDK.LOGIN.1005 Invalid username or password. Remaining login attempts: {0}
无效的用户名或密码。 其余登录尝试次数:{0}
400 IDAAS.SDK.LOGIN.1006 Configuration error, unable to find wechat authentication source
配置错误,找不到微信认证源
400 IDAAS.SDK.LOGIN.1007 Configuration error, unable to find alipay authentication source
配置错误,找不到支付宝认证源
400 IDAAS.SDK.LOGIN.1008 The configuration is incorrect. The one-click login authentication source cannot be found
配置错误,无法找到一键登录认证源
400 IDAAS.SDK.SMS.1001 {0} slide base map is not initialized successfully, please check the path
{0} 滑动底图未初始化成功,请检查路径
400 IDAAS.SDK.SMS.1002 {0} verification code coordinate resolution failed
{0} 验证码坐标解析失败
400 IDAAS.SDK.SMS.1003 {0} verification code coordinate verification fails
{0} 验证码坐标校验失败
400 IDAAS.SDK.SMS.1004 The graphic verification code is incorrect
图形验证码校验错误
400 IDAAS.SDK.SMS.1005 SMS verification code verification is incorrect
短信验证码验证错误
400 IDAAS.SDK.SMS.1006 The email verification code is incorrect
邮件验证码验证错误
400 IDAAS.SDK.SMS.1007 Sending scenario does not exist
发送场景不存在
400 IDAAS.SDK.SMS.1008 Failed to send the verification code
发送验证码失败
400 IDAAS.SDK.SOCIAL.1001 The social account is unbound incorrectly
社交账号解绑错误
400 IDAAS.SDK.SOCIAL.1002 The social account has been bound, please unbind it first
社交账号已绑定,请先解绑
400 IDAAS.SDK.PWD.1001 The password length is incorrect
密码长度错误
400 IDAAS.SDK.PWD.1002 The password cannot be the username
密码不能为用户名
400 IDAAS.SDK.PWD.1003 Your password complexity is low
你的密码复杂度过低
400 IDAAS.SDK.PWD.1004 The password is weak
密码很弱
400 IDAAS.SDK.PWD.1005 The password is used before, cannot be used again
该密码已被使用过,不能再次使用
400 IDAAS.SDK.PWD.1006 Password cannot username in reverse order
密码不能是用户名的倒序
400 IDAAS.SDK.PWD.1007 The number of repeated password characters exceeded the upper limit
密码重复字符数超过限制
400 IDAAS.SDK.PWD.1008 Password cannot contain :username, phone number, email prefix, name in PinYing
密码不能包含:用户名、电话号码、邮件前缀、拼音名
400 IDAAS.SDK.MFA.1001 The mobile doesn't match the user
手机号和用户不匹配
400 IDAAS.SDK.MFA.1002 The access control policy is incorrect
访问控制策略配置错误
400 IDAAS.SDK.MFA.1003 Access control authentication source type conversion error
访问控制身份验证源类型转换错误