登录中国移动开发者社区注册成为开发者
开发者账号创建后,开发者社区将给您的注册邮箱发一封账号激活邮件,开发者通过邮箱激活账号并登录中国移动开发者社区,如果开发者需要申请使用统一认证能力,从首页点击进去统一认证快捷申请
通道:
填写开发者的应用信息:
应用创建成功后,显示开发者的AppID和APP Key信息
开发者在获取APP ID和APP Key后,需要完成能力配置后才可以正式调用统一认证能力 。开发者进入统一认证快捷申请
页面,选择需要申请的应用,在操作列点击统一认证配置
进入能力配置页面,针对不同的系统平台,能力配置方法如下(其中本机号码校验
为可选项):
Android应用
Android包签名获取方法:
iOS应用
开发者在集成过程中,需要使用sourceID去校验和区分业务,开发者可以在开发者社区管理中心业务维护查看用户创建的(或系统默认的)业务ID(sourceID
)
什么是业务ID(sourceID)?
业务ID是开发者已申请应用的一个集合,它可以包含开发者已申请的多款相同功能但不同平台的应用。例如,开发者有一款应用叫做和多号,分别在Android、iOS平台发布了两款应用,那么,我们强烈的建议开发者您创建一个业务名为“和多号”的业务,把这两款应用归属到“和多号”业务中。
统一认证的所有返回结果都会先传给业务侧服务端,再由业务侧服务端通过接口将结果传给客户端,因此,开发者需要在开发者社区中填写业务侧的结果回调IP地址,支持多个IP地址。
调用SDK方法来获得token
,步骤如下:
a. 构造SDK中认证工具类AuthnHelper的对象;
b. 使用AuthnHelper中的umcLoginByType方法,获得token。
使用平台获取用户信息接口,取得用户信息
CMCCSSOSDK_*.jar
拷贝到应用工程的libs目录下,如没有该目录,可新建;clientCert.crt
、serverPublicKey.pem
拷贝到项目assets
目录下。anim
文件:
drawable
、drawable-xxhdpi
文件:
layout
文件:
values
文件:
注意:为避免出错,请直接从Demo中复制带标签的代码
1. 配置权限
81<uses-permission android:name="android.permission.INTERNET" />
2<uses-permission android:name="android.permission.READ_PHONE_STATE" />
3<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
4<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
5<uses-permission android:name="android.permission.SEND_SMS" />
6<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
7<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
8<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 配置授权登录activity
开发者根据需要配置横竖屏方向:android:screenOrientation
示列代码为unspecified
(默认值由系统选择显示方向)
201<activity
2 android:name="com.cmic.sso.sdk.activity.OAuthActivity"
3 android:configChanges="orientation|keyboardHidden|screenSize"
4 android:screenOrientation="unspecified"
5 android:launchMode="singleTop">
6</activity>
7<!-- required -->
8<activity
9 android:name="com.cmic.sso.sdk.activity.BufferActivity"
10 android:configChanges="orientation|keyboardHidden|screenSize"
11 android:screenOrientation="unspecified"
12 android:launchMode="singleTop">
13</activity>
14<!-- required -->
15<activity
16 android:name="com.cmic.sso.sdk.activity.LoginAuthActivity"
17 android:configChanges="orientation|keyboardHidden|screenSize"
18 android:screenOrientation="unspecified"
19 android:launchMode="singleTop">
20</activity>
通过以上两个步骤,工程就已经配置完成了。接下来就可以在代码里使用统一认证的SDK进行开发了
1. 创建一个AuthnHelper实例
AuthnHelper
是SDK的功能入口,所有的接口调用都得通过AuthnHelper进行调用。因此,调用SDK,首先需要创建一个AuthnHelper实例,其代码如下:
61public void onCreate(Bundle savedInstanceState) {
2 super.onCreate(savedInstanceState);
3 mContext = this;
4 ……
5 mAuthnHelper = AuthnHelper.getInstance(mContext);
6 }
2. 实现回调
所有的SDK接口调用,都会传入一个回调,用以接收SDK返回的调用结果。结果以JsonObjent
的形式传递,TokenListener
的实现示例代码如下:
121mListener = new TokenListener() {
2
3 public void onGetTokenComplete(JSONObject jObj) {
4 if (jObj != null) {
5 mResultString = jObj.toString();
6 mHandler.sendEmptyMessage(RESULT);
7 if (jObj.has("token")) {
8 mtoken = jObj.optString("token");
9 }
10 }
11 }
12};
3. 接口调用
51mAuthnHelper.umcLoginByType(Constant.APP_ID,
2 Constant.APP_KEY,
3 AuthnHelper.UMC_LOGIN_IMPLICIT,
4 AuthnHelper.AUTH_TYPE_DYNAMIC_SMS + AuthnHelper.AUTH_TYPE_WAP,
5 mListener);
获取管理类的实例对象
原型
11public AuthnHelper (Context context)
参数 | 类型 | 说明 |
---|---|---|
context | Context | 调用者的上下文环境,其中activity中this即可以代表。 |
开发者向统一认证服务器获取用户身份标识openId
和临时凭证token
。
openId:每个APP每个手机号码对应唯一的openId。
临时凭证token:开发者服务端可凭临时凭证token通过3.1获取用户信息接口获取用户手机号码。
业务流程图
SDK自动调起登录等待界面(图一),同时自动获取本机号码;若获取本机号码成功,自动切换到授权登录页面(图二),用户授权登录后,即可使用本机号码进行登录;若用户获取本机号码失败,自动跳转到短信验证码登录页面(图三),引导用户使用短信验证码登录。
用户授权登录后,给开发者返回token
和用户ID(openID)
等信息。
原型
51public void umcLoginByType(final String appId,
2 final String appKey,
3 final int loginType,
4 final String authType,
5 final TokenListener listener)
请求参数
参数 | 类型 | 说明 |
---|---|---|
appId | String | 应用的AppID |
appkey | String | 应用密钥 |
loginType | String | 登录类型,AuthnHelper.UMC_LOGIN_DISPLAY |
authType | String | 认证类型,目前支持三种认证类型: 1.短信验证码:AuthnHelper.AUTH_TYPE_DYNAMIC_SMS 2.网关鉴权:AuthnHelper.AUTH_TYPE_WAP 3.短信上行:AuthnHelper.AUTH_TYPE_SMS (开发者可单独选择其中一种认证类型,也可以用“+”号组合同时使用三种认证类型,SDK登录认证优先级顺序为:网关鉴权 → 短信上行 → 短信验证码) 示例:AuthnHelper.AUTH_TYPE_WAP + AuthnHelper.AUTH_TYPE_DYNAMIC_SMS |
listener | TokenListener | TokenListener为回调监听器,是一个java接口,需要调用者自己实现;TokenListener是接口中的认证登录token回调接口,OnGetTokenComplete是该接口中唯一的抽象方法,即void OnGetTokenComplete(JSONObject jsonobj) |
响应参数
OnGetTokenComplete的参数JSONObject,含义如下:
字段 | 类型 | 含义 |
---|---|---|
resultCode | Int | 接口返回码,“103000”为成功。具体响应码见4.1 SDK返回码 |
resultDesc | String | 失败时返回:返回错误码说明 |
token | String | 成功时返回:身份标识,字符串形式的token,应用将该token经应用侧平台向统一认证平台请求认证 |
openId | String | 成功时返回:用户身份唯一标识 |
请求示例代码
51mAuthnHelper.umcLoginByType(Constant.APP_ID,
2 Constant.APP_KEY,
3 AuthnHelper.UMC_LOGIN_DISPLAY,
4 AuthnHelper.AUTH_TYPE_DYNAMIC_SMS + AuthnHelper.AUTH_TYPE_WAP,
5 mListener);
响应示例代码
61{
2"authType": "网关鉴权",
3"resultCode": "103000",
4"openId": "9M7RaoZH1DUrJ15ZjJkctppraYpoNKQW9xKtQrcmCGTFONUKeT3w",
5"token": "848401000133020037515451304E7A497A4D7A5A4651554A474E6A41784D304E4640687474703A2F2F3231312E3133362E31302E3133313A383038302F403031030004051C7840040012383030313230313730373230313030303137050010694969C667EA4D248DFA125D7C4BD35BFF00207EF179935851E1578B313B366007126A3FD3667BCD2B812EC2D084B8924E7164"
6}
使用显式登录前,可以通过预取号提前获取用户信息并缓存。用户再次登录时,会自动使用缓存的信息快速登录来获取token
和用户ID(openID)
等信息。提高登录速度,缓存的有效时间是5min并且只有一次使用有效期。
原型
31public void umcLoginPre(final String appId,
2 final String appKey,
3 final TokenListener listener)
请求参数
参数 | 类型 | 说明 |
---|---|---|
appId | String | 应用的AppID |
appkey | String | 应用密钥 |
listener | TokenListener | TokenListener为回调监听器,是一个java接口,需要调用者自己实现;TokenListener是接口中的认证登录token回调接口,OnGetTokenComplete是该接口中唯一的抽象方法,即void OnGetTokenComplete(JSONObject jsonobj) |
响应参数
OnGetTokenComplete的参数JSONObject,含义如下:
字段 | 类型 | 含义 |
---|---|---|
resultCode | Int | 接口返回码,“103000”为成功。具体响应码见4.1 SDK返回码 |
desc | boolean | 成功标识,true为成功。 |
31mAuthnHelper.umcLoginPre(Constant.APP_ID,
2 Constant.APP_KEY,
3 mListener);
响应示例代码
41{
2"resultCode": "103000",
3"desc": "true",
4}
获取管理类的实例对象
原型
11public AuthnHelper (Context context)
参数 | 类型 | 说明 |
---|---|---|
context | Context | 调用者的上下文环境,其中activity中this即可以代表。 |
开发者向统一认证服务器获取用户身份标识openId
和临时凭证token
。
openId:每个APP每个手机号码对应唯一的openId。
临时凭证token:开发者服务端可凭临时凭证token通过3.1本机号码校验接口对本机号码进行验证。
原型
31public void getToken(final String appId,
2 final String appKey,
3 final TokenListener listener)
请求参数
参数 | 类型 | 说明 |
---|---|---|
appId | String | 应用的AppID |
appkey | String | 应用密钥 |
listener | TokenListener | TokenListener为回调监听器,是一个java接口,需要调用者自己实现;TokenListener是接口中的认证登录token回调接口,OnGetTokenComplete是该接口中唯一的抽象方法,即void OnGetTokenComplete(JSONObject jsonobj) |
响应参数
OnGetTokenComplete的参数JSONObject,含义如下:
字段 | 类型 | 含义 |
---|---|---|
resultCode | String | 接口返回码,“103000”为成功。具体响应码见4.1. 本机号码校验接口返回码 |
authType | String | 登录类型返回码 |
authTypeDes | String | 登录类型返回码描述 |
resultDesc | String | 失败时返回:返回错误码说明 |
token | String | 成功时返回:身份标识,字符串形式的token,第三方应用将该凭证经应用平台向统一认证平台请求认证 |
openId | String | 成功时返回:用户身份唯一标识 |
请求示例代码
31mAuthnHelper.getToken(Constant.APP_ID,
2 Constant.APP_KEY,
3 mListener);
响应示例代码
71{
2"resultCode": "103000",
3"authType": "2",
4"authTypeDes": "网关鉴权",
5"openId": "9M7RaoZH1Q95QzY99YFkeFDO4xDfOv5q4BVlwn_0zJNNlNYUkxrw",
6"token": "8484010001330200374D455979526A49354E6A59774E444D314E454E47516B4D3140687474703A2F2F3231312E3133362E31302E3133313A383038302F40303103000402D59A6B040012383030313230313730383138313031343437050010D2F28C555CB54316B7D031DE9F6F6B1EFF0020F07B4AAFC3B1499A250AAAB4272BBFB565B440FFA5C8257E90C28595956CC224"
7}
直接将统一认证TYRZSDK.framework
拖到项目中
TARGETS-->Build Setting-->Linking-->Other Linker Flags
在这选项中需要添加-ObjC
本节内容主要面向新接入统一认证的开发者,介绍快速集成统一认证的基本服务的方法。
由流程图可知,业务客户端集成SDK后只需要完成2步集成实现登录
211. 调用登录接口获取token
22. 携带token请求登录
第一步:
在appDelegate.m中的didFinish函数中添加初始化代码。初始化代码只需要执行一次就可以。
51- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2 // Override point for customization after application launch.
3 [TYRZBaseApi customInit:APPID appKey:APPKEY sourceID:SOURCEID];
4 return YES;
5}
第二步:
在需要用到登录的地方调用登录接口即可,以下是登录示例
201- (void)showImplicitLogin {
2 self.waitBGV.hidden = NO;
3 [self.waitAV startAnimating];
4 __weak typeof(self) weakSelf = self;
5 [TYRZLogin loginImplicitly:^(id sender) {
6 dispatch_async(dispatch_get_main_queue(), ^{
7 weakSelf.waitBGV.hidden = YES;
8 [weakSelf.waitAV stopAnimating];
9 NSString *resultCode = sender[@"resultCode"];
10 self.token = sender[@"token"];
11 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:sender];
12 if ([resultCode isEqualToString:SUCCESSCODE]) {
13 result[@"result"] = @"获取token成功";
14 } else {
15 result[@"result"] = @"获取token失败";
16 }
17 [self showInfo:result];
18 });
19 }];
20}
功能
用于初始化appid、appkey设置。
原型
TYRZBaseApi -> customInit:appKey:sourceID:
11+ (void)customInit:(NSString *)appID appKey:(NSString *)appKey sourceID:(NSString *)sourceID;
请求参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
appID | NSString | 应用的appid | 是 |
appKey | NSString | 应用密钥 | 是 |
sourceID | NSString | 业务ID | 是 |
响应参数
无
请求示例代码
11 [TYRZBaseApi customInit:APPID appKey:APPKEY sourceID:SOURCEID];
响应示例代码
无
功能
用于使用短信验证码登录,客户端单独调起SDK的短信验证码登录界面(下图),用户手动输入电话号码,获取短信验证码登录,登录成功后获取token和用户ID等。业务方如果需要获取用户的手机号码,需再次调取3.1接口来换取用户的手机号码等信息。
原型
TYRZUILogin -> loginSMS:complete:
11+ (void)loginSMS:(UIViewController *)vc complete:(void (^)(id sender))complete;
请求参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
vc | UIViewController | 调用短信验证码登录所在的vc | 是 |
complete | UAFinishBlock | 登录回调 | 是 |
响应参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
resultCode | NSUinteger | 返回相应的结果码 | 是 |
token | NSString | 登录时需要的token | 成功时必填 |
openid | NSString | 和通行证ID | 成功时必填 |
authType | NSString | 认证类型(详见附录1 认证方法标识) | 成功时必填 |
authTypeDes | NSString | 认证类型描述(详见附录1 认证方法标识) | 成功时必填 |
desc | NSString | 调用描述 | 否 |
请求示例代码
141- (void)showSMSCodeLogin {
2 [TYRZUILogin loginSMS:self complete:^(id sender) {
3 NSLog(@"=open=短信验证码登录:%@",sender);
4 NSString *resultCode = sender[@"resultCode"];
5 self.token = sender[@"token"];
6 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:sender];
7 if ([resultCode isEqualToString:SUCCESSCODE]) {
8 result[@"result"] = @"获取token成功";
9 } else {
10 result[@"result"] = @"获取token失败";
11 }
12 [self showInfo:result];
13 }];
14}
响应示例代码
61{
2openid = 1918310031;
3resultCode = 103000;
4token = 84840100013202003A517A424352446B34517A63304D45464751544E464E6A6B3040687474703A2F2F3132302E3139372E3233352E32373A383038302F72732F40303103000403D6A9B1040012383030313230313730383137313031343230FF00209FEDE8882EDD17B521BC36C422F264925383659BE7AFDFB1BB01958AD9AFC080;
5userName = "139****0743";
6}
功能
用于显式登录。SDK自动调起登录等待界面(图一),同时自动获取本机号码;若获取本机号码成功,自动切换到授权登录页面(图二),用户授权登录后,即可使用本机号码进行登录;若用户获取本机号码失败,自动跳转到短信验证码登录页面(图三),引导用户使用短信验证码登录;
原型
TYRZUILogin -> loginExplicitly:complete:
11+ (void)loginExplicitly:(UIViewController *)vc complete:(void (^)(id sender))complete;
请求参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
vc | UIViewController | 调用显式登录所在的vc | 是 |
complete | UAFinishBlock | 登录回调 | 是 |
响应参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
resultCode | NSUinteger | 返回相应的结果码 | 是 |
token | NSString | 登录时需要的token | 成功时必填 |
openid | NSString | 和通行证ID | 成功时必填 |
authType | NSString | 认证类型(详见附录1 认证方法标识) | 成功时必填 |
authTypeDes | NSString | 认证类型描述(详见附录1 认证方法标识) | 成功时必填 |
desc | NSString | 调用描述 | 否 |
请求示例代码
171//显式登录
2- (void)showExplicitlyLogin {
3 __weak typeof(self) weakSelf = self;
4 [TYRZUILogin loginExplicitly:weakSelf complete:^(id sender) {
5 dispatch_async(dispatch_get_main_queue(), ^{
6 NSString *resultCode = sender[@"resultCode"];
7 self.token = sender[@"token"];
8 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:sender];
9 if ([resultCode isEqualToString:SUCCESSCODE]) {
10 result[@"result"] = @"获取token成功";
11 } else {
12 result[@"result"] = @"获取token失败";
13 }
14 [self showInfo:result];
15 });
16 }];
17}
响应示例代码
71{
2desc = "\U767b\U5f55\U6210\U529f";
3openid = 1918310031;
4resultCode = 103000;
5token = 84840100013202003A4E45564452444D794E7A6C474E45557A4F4441314D304E4340687474703A2F2F3132302E3139372E3233352E32373A383038302F72732F403032030004030DF69E040012383030313230313730383137313031343230FF0020C8C9629B915C41DC3C9528E5D5796BB1551F2A49F8FCF7B5BA23ED0F28A8FAE9;
6userName = 13902220743;
7}
功能
显式登录调取失败后,可使用该方法来决定是否使用短信验证码登录
原型
TYRZUILogin -> setCustomSMS
11+ (void)setCustomSMS:(BOOL)enable;
请求参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
enable | BOOL | YES时显示登录取号失败会跳转至短信验证码界面 | 是 |
响应参数
无
请求示例代码
151 [TYRZUILogin setCustomSMS:YES];
2 __weak typeof(self) weakSelf = self;
3 [TYRZUILogin loginExplicitly:weakSelf complete:^(id sender) {
4 dispatch_async(dispatch_get_main_queue(), ^{
5 NSString *resultCode = sender[@"resultCode"];
6 self.token = sender[@"token"];
7 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:sender];
8 if ([resultCode isEqualToString:SUCCESSCODE]) {
9 result[@"result"] = @"获取token成功";
10 } else {
11 result[@"result"] = @"获取token失败";
12 }
13 [self showInfo:result];
14 });
15 }];
响应示例代码
设置逻辑不返回
功能
用户可以自定义自己的登录标题
原型
TYRZUILogin -> loginEximplicit
11+ (void)setLoginTitle:(NSString *)loginTitle;
请求参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
loginTitle | NSString | 用户自己的自定义的登录标题 | 是 |
响应参数
无
功能
用户自定义的登录logo
原型
TYRZUILogin -> loginEximplicit
11+ (void)setLogo:(UIImage *)image;
请求参数
参数 | 类型 | 说明 | 是否必填 |
---|---|---|---|
image | UIImage | 用户自定义的登录logo | 是 |
响应参数
无
功能
业务平台或服务端携带用户授权成功后的token来调用统一认证服务端获取用户信息。
请求地址: https://www.cmpassport.com/unisdk/rsapi/tokenValidate
协议: HTTPS
请求方法: POST+json
回调地址:请参考开发者接入流程文档中配置业务服务端地址
相关操作
请求参数
参数 | 层级 | 类型 | 约束 | 说明 |
---|---|---|---|---|
header | 1 | 必选 | ||
version | 2 | string | 必选 | 填1.0 |
msgid | 2 | string | 必选 | 标识请求的随机数即可(1-36位) |
systemtime | 2 | string | 必选 | 请求消息发送的系统时间,精确到毫秒,共17位,格式:20121227180001165 |
strictcheck | 2 | string | 必选 | 验证源ip合法性,填写”1”,统一认证会校验sourceid与出口ip对应关系(ip 地址的配置方法请参考接入流程文档中配置业务服务端地址 相关操作) |
sourceid | 2 | string | 可选 | 业务集成统一认证的标识,应用接入后可获取 |
ssotosourceid | 2 | string | 可选 | 单点登录时使用,填写被登录业务的sourceid |
appid | 2 | string | 可选 | 业务在统一认证申请的应用id |
apptype | 2 | string | 可选 | 1:BOSS 2:web 3:wap 4:pc客户端 5:手机客户端 |
expandparams | 2 | string | 扩展参数 | map(key,value) |
body | 1 | 可选 | ||
token | 2 | string | 可选 | 需要解析的凭证值。 |
响应参数
参数 | 层级 | 类型 | 约束 | 说明 |
---|---|---|---|---|
header | 1 | 必选 | ||
version | 2 | string | 必选 | 1.0 |
inresponseto | 2 | string | 必选 | 对应的请求消息中的msgid |
systemtime | 2 | string | 必选 | 响应消息发送的系统时间,精确到毫秒,共17位,格式:20121227180001165 |
resultcode | 2 | string | 必选 | 返回码 |
body | 1 | 必选 | ||
pcid | 2 | string | 必选 | 伪码id |
usessionid | 2 | string | 可选 | 暂忽略 |
openid | 2 | string | 可选 | 用户统一账号的系统标识 |
andid | 2 | string | 可选 | 用户的“和ID” |
msisdn | 2 | string | 可选 | 表示手机号码 |
2 | string | 可选 | 表示邮箱地址 | |
loginidtype | 2 | string | 可选 | 登录使用的用户标识: 0:手机号码 1:邮箱 |
msisdntype | 2 | string | 可选 | 手机号码的归属运营商 0:中国移动 1:中国电信 2:中国联通 99:未知的异网手机号码 |
province | 2 | string | 可选 | 用户所属省份(暂无) |
authtype | 2 | string | 可选 | 认证方式,取值参见附录1 认证方法标识 |
authtime | 2 | string | 可选 | 统一认证平台认证用户的时间 |
lastactivetime | 2 | string | 可选 | 暂无 |
relateToAndPassport | 2 | string | 可选 | 是否已经关联到统一账号,暂无用处 |
fromsourceid | 2 | string | 可选 | 来源sourceid(即签发token sourceid) |
tosourceid | 2 | string | 可选 | 目的sourceid(即被登录业务sourceid) |
请求示例
131{
2"header": {
3"strictcheck":"0",
4"version": "1.0",
5"msgid": "40a940a940a940a93b8d3b8d3b8d3b8d",
6"systemtime": "20170515090923489",
7"appid": "10000001",
8"apptype": "5"
9},
10"body": {
11"token": "8484010001320200344E6A5A4551554D784F444E474E446C434E446779517A673340687474703A2F2F3139322E3136382E31322E3233363A393039302F0300040353EA68040006313030303030FF00203A020A143C6703D7D0530953C760744C7D61F5F7B546F12BC17D65254878748C"
12}
13}
响应示例
191{
2"header": {
3"inresponseto": "40a940a940a940a93b8d3b8d3b8d3b8d",
4"resultcode": "103000",
5"systemtime": "20170522204845598",
6"version": "1.0"
7},
8"body": {
9"msisdntype": "0",
10"usessionid": "NjZEQUMxODNGNDlCNDgyQzg3@http://192.168.12.236:9090/",
11"openid": "000000000",
12"loginidtype": "0",
13"authtime": "2017-05-22 20:48:45",
14"msisdn": "13683329795",
15"lastactivetime": "",
16"authtype": "WAPGW",
17"relateToAndPassport": "1"
18}
19}
校验用户输入的号码是否本机号码。
应用将手机号码传给统一认证SDK,统一认证SDK向统一认证服务端发起本机号码校验请求,统一认证服务端通过网关或者短信上行获取本机手机号码和第三方应用传输的手机号码进行校验,返回校验结果。
调用次数说明:本产品属于收费业务,开发者未签订服务合同前,每天总调用次数有限。
请求地址: https://www.cmpassport.com/openapi/rs/tokenValidate
协议: HTTPS
请求方法: POST+json
回调地址:请参考开发者接入流程文档中配置业务服务端地址
相关操作
请求参数
参数 | 类型 | 层级 | 约束 | 说明 | |
---|---|---|---|---|---|
header | 1 | 必选 | |||
version | string | 2 | 必选 | 版本号,初始版本号1.0,有升级后续调整 | |
msgId | string | 2 | 必选 | 使用UUID标识请求的唯一性 | |
timestamp | string | 2 | 必选 | 请求消息发送的系统时间,精确到毫秒,共17位,格式:20121227180001165 | |
appId | string | 2 | 必选 | 应用ID | |
body | 1 | 必选 | |||
openType | String | 2 | 否,requestertype字段为0时是 | 运营商类型: 1:移动; 2:联通; 3:电信; 0:未知 | |
requesterType | String | 2 | 是 | 请求方类型: 0:APP; 1:WAP | |
message | String | 2 | 否 | 接入方预留参数,该参数会透传给通知接口,此参数需urlencode编码 | |
expandParams | String | 2 | 否 | 扩展参数格式:param1=value1|param2=value2 方式传递,参数以竖线 | 间隔方式传递,此参数需urlencode编码。 | |
phoneNum | String | 2 | 是 | 待校验的手机号码的64位sha256值,字母大写。(手机号码+appKey+timestamp)(注:“+”号为合并意思) | |
token | String | 2 | 是 | 身份标识,字符串形式的token | |
sign | String | 2 | 是 | 签名,HMACSHA256(appId+ msgId+phonNum+timestamp+token+version),输出64位大写字母 (注:“+”号为合并意思,不包含在被加密的字符串中,appkey为秘钥, 参数名做自然排序(Java是用TreeMap进行的自然排序)) | |
请求示例
171{
2"body": {
3"openType": "1",
4"requesterType": "1",
5"message ": "",
6"expandParams": "",
7"phoneNum": "4526285940b6fa7fef49e1dcb04ee944f41a8745444015daf2771bfb7ad7c800",
8"token": "",
9"sign": ""
10},
11"header": {
12"msgId ": "61237890345",
13"timestamp ": "20160628180001165",
14"version ": "1.0",
15"appId ": "0008"
16}
17}
响应参数
参数 | 层级 | 类型 | 约束 | 说明 | |
---|---|---|---|---|---|
header | 1 | 必选 | |||
msgId | 2 | string | 必选 | 对应的请求消息中的msgid | |
timestamp | 2 | string | 必选 | 响应消息发送的系统时间,精确到毫秒,共17位,格式:20121227180001165 | |
appId | 2 | string | 必选 | 应用ID | |
resultCode | 2 | string | 必选 | 规则参见具体接口返回码说明 | |
body | 1 | 必选 | |||
resultDesc | 2 | String | 必选 | 返回结果描述信息: 000:是本机号码 001:非本机号码 102:参数无效 108:无效的手机号 302:签名校验不通过 606:token校验失败 999:系统异常 102315:使用次数为0 其中,000和001状态纳入计费次数 | |
message | 2 | String | 否 | 接入方预留参数,该参数会透传给通知接口,此参数需urlencode编码 | |
expandParams | 2 | String | 否 | 扩展参数格式:param1=value1|param2=value2 方式传递,参数以竖线 | 间隔方式传递,此参数需urlencode编码。 | |
响应示例
121{
2"body": {
3"resultDesc ": "",
4"message": "",
5"expandParams ": ""
6},
7"header": {
8"msgId": "61237890345",
9"timestamp": "20160628180001165",
10"resultCode": "1.0"
11}
12}
编码 | 返回码描述 |
---|---|
103000 | 成功 |
102101 | 无网络 |
102102 | 网络异常 |
102223 | 数据解析异常 |
102121 | 用户取消认证 |
102505 | 业务未注册 |
102506 | 请求出错 |
102507 | 请求超时 |
102201 | 自动登陆失败 |
102202 | 应用签名失败 |
102203 | 输入参数错误 |
102204 | 正在gettoken处理 |
102210 | 指定号码非本机号码 |
102211 | 短信验证码验证成功后返回随机码为空 |
102222 | http响应头中没有结果码 |
102299 | other failed |
102302 | 调用service超时 |
103117 | mac异常 macError |
103200 | ks无需更新 |
103203 | 缓存用户不存在 |
200001 | imsi为空,跳到短信验证码登录 |
200002 | imsi为空,没有短信验证码登录功能 |
200003 | 复用中间件首次登录 |
200004 | 复用中间件二次登录 |
200005 | 用户未授权 |
200006 | 用户未授权 |
200007 | 不支持的认证方式 跳到短信验证码登录 |
200008 | 不支持的认证方式 没有短信验证码登录功能 |
200009 | 应用合法性校验失败 |
200010 | imsi获取失败或者没有sim卡,预取号失败 |
错误编号 | 返回码描述 |
---|---|
102000 | 成功 |
102101 | 无网络 |
102102 | 网络异常 |
102103 | 非移动网络 |
102109 | 网络错误 |
102201 | 自动登陆失败,用户选择自定义界面时,需要继续处理手动登陆流程,比如弹出登陆界面。 |
102202 | APP签名验证不通过 |
102203 | 接口入参错误 |
102204 | 正在进行GetToken动作,请稍后 |
102205 | 当前环境不支持指定的登陆方式 |
102206 | 选择用户登陆时,本地不存在指定的用户 |
102207 | 获取的中间件值错误 |
102208 | 参数错误 |
102209 | 没有sim卡 |
102210 | 不支持短信发送 |
10299 | 其他错误 |
102301 | 用户取消 |
102302 | 没有进行初始化参数 |
102303 | 用户名为空 |
102304 | 密码为空 |
102305 | 验证码获得成功 |
102306 | 验证码获得失败 |
102307 | 用户名格式错误 |
102308 | 用户名格式错误 |
102309 | 验证码格式错误 |
102310 | 用户名和验证码格式错误 |
102311 | 密码格式错误 |
102312 | 用户名和密码格式错误 |
编码 | 返回码描述 |
---|---|
103000 | 成功 |
103101 | 签名错误 |
103103 | 用户不存在 |
103104 | 用户不支持该种登录方式 |
103105 | 密码错误 |
103106 | 用户名错误 |
103107 | 已存在相同的随机数 |
103108 | 短信验证码错误 |
103109 | 短信验证码超时 |
103111 | WAP网关IP不合法 |
103112 | 请求错误 reqError |
103113 | Token内容错误 |
103114 | token验证 KS过期 |
103115 | token验证 KS不存在 |
103116 | token验证 sqn错误 |
103117 | mac异常 macError |
103118 | sourceid不存在 |
103119 | appid不存在appidNOExist |
103120 | clientauth不存在 |
103121 | openid不存在 |
103122 | btid不存在 |
103123 | redisinfo不存在 |
103124 | ksnaf校验不一致 |
103125 | 手机格式错误 |
103126 | 手机号不存在 |
103127 | 证书验证,版本过期 |
103128 | gba webservice接口调用失败 |
103129 | 获取短信验证码的msgtype异常 |
103130 | 新密码不能与当前密码相同 |
103131 | 密码过于简单 |
103132 | 用户注册失败 |
103133 | sourceid不合法 |
103134 | wap方式手机号为空 |
103135 | 昵称非法 |
103136 | 邮箱非法 |
103138 | appid已存在 |
103139 | sourceid已存在 |
103200 | 不需要更新ks |
103204 | 缓存随机数不存在 |
103205 | 服务器内部异常 |
103207 | 发送短信失败 |
103212 | 校验密码失败 |
103213 | 旧密码错误 |
103214 | 访问缓存或数据库错误 |
103226 | sqn过小或过大 |
103265 | 用户已存在 |
103901 | 短信验证码下发次数已达上限 |
103902 | 凭证校验失败 |
104001 | APPID和APPKEY已存在 |
105001 | 联通网关取号失败 |
105002 | 移动网关取号失败 |
105003 | 电信网关取号失败 |
105004 | 短信上行ip检测不合法 |
105005 | 短信上行发送信息为空 |
105006 | 手机号码为空 |
105007 | 手机号码格式错误 |
105008 | 短信内容为空 |
105009 | 解析失败 |
错误编号 | 返回码描述 |
---|---|
103000 | 成功 |
102101 | 无网络 |
102102 | 网络异常 |
102223 | 数据解析异常 |
102121 | 用户取消认证 |
102505 | 业务未注册 |
102506 | 请求出错 |
102507 | 请求超时 |
102201 | 自动登陆失败 |
102202 | 应用签名失败 |
102203 | 输入参数错误 |
102204 | 正在gettoken处理 |
102210 | 指定号码非本机号码 |
102211 | 短信验证码验证成功后返回随机码为空 |
102222 | http响应头中没有结果码 |
102299 | other failed |
102302 | 调用service超时 |
103117 | mac异常 macError |
103200 | ks无需更新 |
103203 | 缓存用户不存在 |
200001 | imsi为空,跳到短信验证码登录 |
200002 | imsi为空,没有短信验证码登录功能 |
200003 | 复用中间件首次登录 |
200004 | 复用中间件二次登录 |
200005 | 用户未授权 |
200006 | 用户未授权 |
200007 | 不支持的认证方式 跳到短信验证码登录 |
200008 | 不支持的认证方式 没有短信验证码登录功能 |
200009 | 应用合法性校验失败 |
200010 | imsi获取失败或者没有sim卡,预取号失败 |