一、整体框架流程和接入流程
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 <ZMCreditSDK/ALCreditService.h>
[[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<AFMultipartFormData> _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<AFMultipartFormData> _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来授权认证。
(持续更新~🙈)