一、整体框架流程和接入流程

1.1 整体框架流程

1.2 接入流程

此文档,为完整的对接流程中的第三步,芝麻信用移动sdk的对接文档。其他技术细节,请参考芝麻信用开发平台和商户平台文档。

第一步:商户通过芝麻信用商户平台进行配置申请

第二步:商户服务端对接芝麻信用开发平台,集成加密加签等功能

第三步:商户app对接芝麻信用移动端sdk接口

第四步: 商户拿到返回的params参数,通过RSA解密,可以获取授权结果以及用户的openId

二、 开发流程

导入 SDK的Framework文件

2.1 向工程中导入SDK Framework文件

Build Phases -> Link Binary With Libraries 里导入库

ZMCreditSDK.framework

ZMDependUponSDK.framework

(找不到的话,需要的可以联系我~)

注意:如果商户引入支付宝钱包SDK,则不需要再引入ZMBuildUponSDK.framework, 因为这样可以解决相同类库冲突的问题

将资源bundle导入工程

H5Service.bundle

Poseidon.bundle

(找不到的话,需要的可以联系我~)

导入其他依赖库

SDK中依赖了其他基础库来保证正常运行,请添加如下依赖库:

MobileCoreServices.framewrok

CFNetwork.framework

MessageUI.framework

EventKit.framework

AssetsLibrary.framework

CoreMotion.framework

Libz.dylib (Xcode 7 之后是libz.tbd)

SystemConfiguration.framework

CoreTelephony.framework

2.2 代码开发

2.2.1 在appdelegate中注册APP

首先倒入头文件:#import

[[ALCreditService sharedService] resgisterApp];

2.2.2 支付宝对app进行授权

认证 URL:https://zmopenapi.zmxy.com.cn/openapi.do?sign=rr8lb07UarEXFp2gckiAc28y%2BeHHdq%2BYwWFBW3bl1iYMKK2ScHFYtZRdOxWwBgbqBily5P6455c4QjumfF%2BRQhHgFr6DrA7RfMDp3tQMbTAn7wtAR8vGE8o%2BuCKAgDMzF2lfqCSn%2BGcOtbhSwnNbJDJAsNWerlezkSTu0YrMLvA%3D&signtype=RSA&charset=UTF-8&appid=1000509&method=zhima.customer.certification.certify&version=1.0?ms=TNjy6EwBUey02QxJF4VUB4UjkRL1NjLHrK7XKD1J9sGvjvVPXGT7e1cupoxr%2BBZS1OXbhpf4LTRVzPIgROiyk6az%2BFFU7ud0378ugHn8UbqHu%2FvbeTRsEY0FDAekCv6AmY6xbVZRDkClVuM9k1KlZ6bVRvs%2F1zUgvjP8iSivKA0%3D

这里给一个参考URL

- (void)doVerify:(NSString* )url {

// 这里使用固定appid 20000067

NSString *alipayUrl = [NSString stringWithFormat:@"alipays://platformapi/startapp?appId=20000067&url=%@",

[self URLEncodedStringWithUrl:url]];

if ([self canOpenAlipay]) {

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:alipayUrl] options:@{} completionHandler:nil];

} else {

//引导安装支付宝 根据需求这里也可以跳转到一个VC界面进行网页认证

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"是否下载并安装支付宝完成认证?"

delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"好的", nil];

[alertView show];

//网页认证

//(传入认证 URL)

BBDCZMCreditViewController *zmCreditVC = [[BBDCZMCreditViewController alloc] init];

zmCreditVC.zmUrl = url;

[self.navigationController pushViewController:zmCreditVC animated:YES];

}

}

- (NSString *)URLEncodedStringWithUrl:(NSString *)url {

NSString *encodedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)url,NULL,(CFStringRef) @"!'();:@&=+$,%#[]|",kCFStringEncodingUTF8));

return encodedString;

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

if (buttonIndex == 1) {

NSString *appstoreUrl = @"itms-apps://itunes.apple.com/app/id333206289";

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:appstoreUrl] options:@{} completionHandler:nil];

}

}

- (BOOL)canOpenAlipay {

return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipay://"]];

}

2.2.3 网页认证

网页认证直接调用H5页面,这里需要用到与JS的交互

- (void)viewDidLoad {

[super viewDidLoad];

//_zmUrl 这个是后台返回的一个认证后的url 加载授权认证网页

[self.zmWeb loadHTMLString:_zmUrl baseURL:nil];

[self.view addSubview:self.zmWeb];

}

2.3 获取芝麻信用分

- (void) getZMCreditInfo{

// ①把用户数据传给服务器,即传入参数(字典)

//(如果后台从别的页面已经获取到用户的这些数据了,此处也可以不传参数,这就看你跟后台怎么商量了;IDCardNumber:身份证号userName:用户姓名)

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"18位身份证号码", @"IDCardNumber", @"用户姓名", @"userName", nil];

// 创建网络请求管理对象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 申明返回的结果是json类型

manager.responseSerializer = [AFJSONResponseSerializer serializer];

// 申明请求的数据是json类型

manager.requestSerializer = [AFJSONRequestSerializer serializer];

// 如果报接受类型不一致请替换一致text/html或别的

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];

[manager POST:@"后台请求网址" parameters:dict constructingBodyWithBlock:^(id _Nonnull formData) {

} progress:^(NSProgress * _Nonnull uploadProgress) {

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

// ②芝麻信用SDK提供的方法,就是这么简单,就一行代码,搞定。(APPid(不是app的appid)是后台接入芝麻信用时申请时后台申请的,这个是固定的,写死就行)

// ②这里只要传三个参数就行,app id、sign、params,芝麻信用会返回给我们一个字典,在result中

[[ALCreditService sharedService] queryUserAuthReq:@"APP ID" sign:responseObject[@"sign"] params:responseObject[@"param"] extParams:nil selector:@selector(result:) target:self];

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

}];

}

- (void)result:(NSMutableDictionary*)dic{

// ③从第二步中芝麻信用返回给我们的字典就是这的dic,你可以试着打印看一下

// ③把params提交给服务器,服务器就能把芝麻信用分数返回给我们了,这里dict的key:params也是后台给你的,不是固定的。

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:dic[@"params"], @"params", nil];

// 创建网络请求管理对象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 申明返回的结果是json类型

manager.responseSerializer = [AFJSONResponseSerializer serializer];

// 申明请求的数据是json类型

manager.requestSerializer = [AFJSONRequestSerializer serializer];

// 如果报接受类型不一致请替换一致text/html或别的

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];

[manager POST:@"后台请求网址" parameters:dict constructingBodyWithBlock:^(id _Nonnull formData) {

} progress:^(NSProgress * _Nonnull uploadProgress) {

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

// 看看这里是不是打印出了你想要的芝麻分数了呢

NSLog(@"%@", responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

}];

}

三、注意事项

ALCreditService是IOS SDK的功能入口,所有的接口调用都需要通过ALCreditService进行调用。

注意:界面跳转是基于navigationController的push功能,并且使用的是系统的nav bar,如果商户端有对nav bar作自定义,请在调用SDK之前,进行nav bar的调整。

由于sdk里面有用到c编译,请把调用queryUserAuthReq的controller后缀名改成.mm

附官方demo链接:滚到最下面

https://zmmcportal.zmxy.com.cn/technology/openDoc.htm?relInfo=CERTIFICATION_QUICK_START

特别注意:像ofo、优拜单车、永安行 支付宝客户端的认证方式只有和支付宝深度合作才可以做......

没有深度合作就老老实实使用H5来授权认证。

(持续更新~🙈)