// // EZHttpUtil.m // EZOpenSDKDemo // // Created by 陈嘉乐 on 2021/2/26. // Copyright © 2021 hikvision. All rights reserved. // #import "EZHttpUtil.h" #import #import #import "AFNetworking.h" #import "YYModel.h" #define TestRequestHttpsHost @"https://test-gz.hdlcontrol.com" #pragma mark API #define API_POST_EZ_VerifyLocalLock @"/home-wisdom/platform/yingshi/lock/verifyLocalLock"//萤石门锁本地验证 #define API_POST_EZ_AddDevice @"/home-wisdom/platform/yingshi/child/addDevice" #define API_POST_EZ_GetChildToken @"/home-wisdom/platform/yingshi/child/token" #define API_POST_EZ_ChildDelDevice @"/home-wisdom/platform/yingshi/child/deleteDevice" #define API_POST_EZ_RefreshToken @"/smart-footstone/member/oauth/login" #define API_POST_EZ_LockAuth @"/home-wisdom/platform/yingshi/lock/auth"//萤石门锁终端授权 #define API_POST_EZ_RemoteOpen @"/home-wisdom/platform/yingshi/lock/remote/open/door"//萤石门锁远程开锁 #define API_POST_EZ_TempList @"/home-wisdom/platform/yingshi/lock/temp/list"//萤石门临时密码列表 #define API_POST_EZ_AddTemp @"/home-wisdom/platform/yingshi/lock/temp/add"//萤石门添加临时密码 #define API_POST_EZ_DeleteTemp @"/home-wisdom/platform/yingshi/lock/temp/delete"//萤石门删除临时密码 #define API_POST_EZ_DeviceMessage @"/home-wisdom/app/device/message"//萤石设备消息列表 #define API_POST_EZ_GetAlarmList @"/home-wisdom/platform/yingshi/alarm/records"//获取报警消息 #define API_POST_EZ_DeleteAlarmMes @"/home-wisdom/platform/yingshi/alarm/delete"//删除报警消息 #define API_POST_EZ_ReadAlarmMes @"/home-wisdom/platform/yingshi/alarm/updateChecked"//标记报警消息已读 #define API_POST_EZ_GetCoverSwitchStaus @"/home-wisdom/platform/yingshi/getCoverSwitchStatus"//获取萤石镜头遮蔽开关状态 #define API_POST_EZ_GetCoverSwitch @"/home-wisdom/platform/yingshi/coverSwitch"//设置萤石镜头遮蔽开关 #define AOI_POST_EZ_UpdateAnswerStatus @"/home-wisdom/platform/yingshi/lock/updateAnswerStatus" // 更改门铃通话状态(接听和未接) #define API_POST_EZ_GetAiSupportList @"/home-wisdom/platform/yingshi/getAiSupportList"//获取摄像头智能算法列表和状态 #define API_POST_EZ_SetAiSupport @"/home-wisdom/platform/yingshi/setAiSupport"//设置摄像头智能算法 #define API_POST_EZ_GetDeviceCapacity @"/home-wisdom/platform/yingshi/getDeviceCapacity"//获取设备能力集(获取摄像头反转能力) #define API_POST_EZ_SetPtzMiroor @"/home-wisdom/platform/yingshi/setPtzMiroor"//设置设备云台镜像(设置摄像头反转能力) #pragma mark APP_KEY #define APP_KEY @"HDL-HOME-APP-TEST" #define SECRET_KEY @"WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss" #define TIME_OUT 30.0f @implementation EZHttpUtil #pragma mark -接口请求部分 /// sharedManager + (id)sharedManager { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ instance = [self new]; }); return instance; } /** * @since 河东获取子账号token的接口 * * @param block 回调block */ - (void)getChildToken:(void (^)(NSString *accessToken))block{ //2.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue: [NSString stringWithFormat:@"%d", [GlobalKit shareKit].hdlPlatform] forKey:@"platform"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsPost:API_POST_EZ_GetChildToken parameters:parameters completion:^(ResponseData *responseData) { if (block) { NSString * token = @""; if(responseData.success){ // token = responseData.data[@"accessToken"]; token = [NSString stringWithFormat:@"%@",responseData.data]; } block(token); } }]; // return task; } /** * @since 河东添加设备之前本地验证的接口(智能门锁使用,调用接口后输入门锁密码,再进行绑定) * @param deviceSerial 设备序列号 * @param completion 回调block,error为空时表示调用验证接口成功 * */ - (void)verifyLocalLockByHDL:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion{ //2.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue: [NSString stringWithFormat:@"%d",[GlobalKit shareKit].hdlPlatform] forKey:@"platform"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsPost:API_POST_EZ_VerifyLocalLock parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东添加设备的接口 * 根据设备序列号和设备验证码添加设备接口 * * @param deviceSerial 设备序列号 * @param verifyCode 设备验证码 * @param completion 回调block,error为空时表示添加成功 * */ - (void)addDeviceByHDL:(NSString *)deviceSerial verifyCode:(NSString *)verifyCode completion:(void (^)(ResponseData *responseData))completion{ //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:verifyCode forKey:@"validateCode"]; [parameters setValue: [NSString stringWithFormat:@"%d",[GlobalKit shareKit].hdlPlatform] forKey:@"platform"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; HDLEZLog(@"添加设备参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_AddDevice parameters:parameters completion:^(ResponseData *responseData) { if (responseData.success){//添加成功,触发代理 if ([EZSDK sharedInstance].delegate&&[[EZSDK sharedInstance].delegate respondsToSelector:@selector(addDeviceSuccessed:)]) { // HDLEZLog(@"添加设备设备成功回调:%@",parameters[@"deviceSerial"]); [[EZSDK sharedInstance].delegate addDeviceSuccessed:parameters[@"deviceSerial"]]; // // //设置设备去掉验证码 // [EZOPENSDK setDeviceEncryptStatus:deviceSerial // verifyCode:verifyCode // encrypt:NO // completion:^(NSError *error) { // if (error) // { // // } // else // { // } // // }]; } } if (completion) { completion (responseData); } }]; // return task; } /** * @since 河东删除设备的接口 * 根据设备序列号删除设备接口 * * @param deviceSerial 设备序列号 * @param completion 回调block,error为空时表示添加成功 * */ - (void)deleteDeviceByHDL:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion{ //1.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue: [NSString stringWithFormat:@"%d",[GlobalKit shareKit].hdlPlatform] forKey:@"platform"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsPost:API_POST_EZ_ChildDelDevice parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; // return task; } /** * 根据设备序列号获取告警信息列表 */ - (void)getAlarmList:(NSString *)deviceSerial pageNo:(NSInteger)pageNo pageSize:(NSInteger)pageSize completion:(void (^)(ResponseData *responseData))completion{ //1.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageSize] forKey:@"pageSize"]; [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageNo] forKey:@"pageNo"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"HDLpageNo:%ld",(long)pageNo); [self requestHttpsPost:API_POST_EZ_GetAlarmList parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * 批量删除报警记录 */ - (void)deleteAlarmMessage:(NSArray *)alarmIds completion:(void (^)(ResponseData *responseData))completion{ //1.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:[alarmIds yy_modelToJSONObject] forKey:@"alarmIds"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsPost:API_POST_EZ_DeleteAlarmMes parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * 批量标记报警记录已读 */ - (void)readAlarmMessage:(NSArray *)alarmIds completion:(void (^)(ResponseData *responseData))completion{ //1.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:@"1" forKey:@"isChecked"]; [parameters setValue:[alarmIds yy_modelToJSONObject] forKey:@"alarmIds"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsPost:API_POST_EZ_ReadAlarmMes parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东门锁终端授权接口 * @param password 门锁密码 * @param deviceId 设备id * @param completion 回调block,error为空时表示添加成功 * */ - (void)authLockByHDL:(NSString *)password deviceId:(NSString *)deviceId completion:(void (^)(ResponseData *responseData))completion{ //2.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceId forKey:@"deviceId"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:password forKey:@"password"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"终端授权参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_LockAuth parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东远程开锁接口 * @param streamToken 设备序列号 * @param deviceId 设备id * @param completion 回调block,error为空时表示添加成功 * */ - (void)remoteOpenByHDL:(NSString *)streamToken deviceId:(NSString *)deviceId completion:(void (^)(ResponseData *responseData))completion{ //2.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceId forKey:@"deviceId"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:streamToken forKey:@"streamToken"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"开门参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_RemoteOpen parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东获取临时密码列表接口 * @param deviceId 设备id * @param completion 回调block,error为空时表示成功 * */ - (void)getTempListByHDL:(NSString *)deviceId completion:(void (^)(ResponseData *responseData))completion{ //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceId forKey:@"deviceId"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取临时密码列表参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_TempList parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东添加临时密码接口 * @param tempInfo 临时密码信息 * @param deviceId 设备id * @param completion 回调block,error为空时表示成功 * */ - (void)addTempByHDL:(HDLEZTemInfoModel *)tempInfo deviceId:(NSString *)deviceId completion:(void (^)(ResponseData *responseData))completion{ //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:[tempInfo yy_modelToJSONObject]]; [parameters setValue:deviceId forKey:@"deviceId"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"添加临时密码参数1:%@",parameters); [self requestHttpsPost:API_POST_EZ_AddTemp parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东删除临时密码接口 * @param extVisitorId 临时密码索引 * @param deviceId 设备id * @param completion 回调block,error为空时表示成功 * */ - (void)deleteTempByHDL:(NSString *)extVisitorId deviceId:(NSString *)deviceId completion:(void (^)(ResponseData *responseData))completion{ //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:extVisitorId forKey:@"extVisitorId"]; [parameters setValue:deviceId forKey:@"deviceId"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"删除临时密码参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_DeleteTemp parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 河东获取设备消息 * @param deviceId 设备id * @param pageSize 页面大小 * @param pageNo 当前页 * @param completion 回调block,error为空时表示成功 * */ - (void)getDeviceMessageByHDL:(NSString *)deviceId pageSize:(NSInteger)pageSize pageNo:(NSInteger)pageNo completion:(void (^)(ResponseData *responseData))completion{ //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceId forKey:@"deviceId"]; [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageSize] forKey:@"pageSize"]; [parameters setValue:[NSString stringWithFormat:@"%ld",(long)pageNo] forKey:@"pageNo"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取设备消息参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_DeviceMessage parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 获取镜头隐私遮蔽状态 * @param deviceSerial 设备序列号 * @param completion 回调block,error为空时表示成功 */ - (void)getCoverSwitchStatus:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:@(1) forKey:@"platform"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:@([[GlobalKit shareKit].hdlHomeId integerValue]) forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取设备消息参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_GetCoverSwitchStaus parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 更新接听状态 * @param msgId 消息id * @param answerStatus 接听状态(answer 已接听、no_answer 未接听) * @param completion 回调block,error为空时表示成功 */ - (void)updateAnswerStatusWithMsgId:(NSString *)msgId answerStatus:(NSString *)answerStatus completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:msgId forKey:@"msgId"]; [parameters setValue:answerStatus forKey:@"answerStatus"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsPost:AOI_POST_EZ_UpdateAnswerStatus parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 设置镜头隐私遮蔽状态 * @param deviceSerial 设备序列号 * @param enable 隐私遮蔽状态 * @param completion 回调block,error为空时表示成功 */ - (void)coverSwitchStatus:(NSString *)deviceSerial enable:(NSInteger)enable completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:@(enable) forKey:@"enable"]; [parameters setValue:@(1) forKey:@"platform"]; [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取设备消息参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_GetCoverSwitch parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 获取摄像头智能算法列表和状态 * @param deviceSerial 设备序列号 * @param completion 回调block,error为空时表示成功 */ - (void)getAiSupportDetectionList:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; // [parameters setValue:@(1) forKey:@"platform"]; // [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; // [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取设备消息参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_GetAiSupportList parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 设置摄像头智能算法 * @param deviceSerial 设备序列号 * @param code 智能算法编码 * @param completion 回调block,error为空时表示成功 */ - (void)setAiSupportDetection:(NSString *)deviceSerial code:(NSString *)code completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:code forKey:@"code"]; // [parameters setValue:@(1) forKey:@"platform"]; // [parameters setValue:[NSString stringWithFormat:@"%@",[GlobalKit shareKit].hdlAppKey] forKey:@"appKey"]; // [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取设备消息参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_SetAiSupport parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 获取设备能力集 * @param deviceSerial 设备序列号 * @param completion 回调block,error为空时表示成功 */ - (void)getDeviceCapacity:(NSString *)deviceSerial completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:@(1) forKey:@"platform"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"获取设备能力集参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_GetDeviceCapacity parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /** * @since 设置设备云台镜像 * @param deviceSerial 设备序列号 * @param command 命令 0-上下;1-左右;2-中心 * @param completion 回调block,error为空时表示成功 */ - (void)setPtzMiroor:(NSString *)deviceSerial command:(NSString *)command completion:(void (^)(ResponseData *responseData))completion { //设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:deviceSerial forKey:@"deviceSerial"]; [parameters setValue:@(1) forKey:@"platform"]; [parameters setValue:[GlobalKit shareKit].hdlHomeId forKey:@"homeId"]; [parameters setValue:command forKey:@"command"]; parameters = [self GetSignRequestDictionary:parameters]; NSLog(@"设置设备云台镜像参数:%@",parameters); [self requestHttpsPost:API_POST_EZ_SetPtzMiroor parameters:parameters completion:^(ResponseData *responseData) { if (completion) { completion (responseData); } }]; } /// 刷新token /// @param block 结果 - (void)refreshHDLToken:(void (^)(BOOL isSuccess))block{ //1.设置请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:GlobalKit.shareKit.hdlRefreshToken forKey:@"refreshToken"]; [parameters setValue:@"refresh_token" forKey:@"grantType"]; [parameters setValue:@"APP" forKey:@"platform"]; parameters = [self GetSignRequestDictionary:parameters]; [self requestHttpsBase:API_POST_EZ_RefreshToken parameters:parameters completion:^(ResponseData *responseData) { if (block) { if (responseData) { if(responseData.success){ [[EZSDK sharedInstance] setHDlAccessToken: [NSString stringWithFormat:@"%@%@",responseData.data[@"headerPrefix"], responseData.data[@"accessToken"]] refreshToken:responseData.data[@"refreshToken"]]; block(YES); return; } } block(NO); } }]; // return task; } #pragma mark HttpUtil /// 通用 请求服务器方法 /// @param apiPath 接口地址 /// @param parameters 请求参数 /// @param completion 请求响应参数 - (void)requestHttpsPost:(NSString *)apiPath parameters:(NSMutableDictionary *)parameters completion:(void (^)(ResponseData *responseData))completion{ [self requestHttpsBase:apiPath parameters:parameters completion:^(ResponseData *responseData) { if (completion) { if([responseData.code isEqual:@"10001"]){ //刷新token [self refreshHDLToken:^(BOOL isSuccess) { if (isSuccess) { //刷新token成功,重新请求一次 [self requestHttpsBase:apiPath parameters:parameters completion:^(ResponseData *responseData) { completion(responseData); return; }]; }else{ completion(responseData); } }]; }else{ completion(responseData); } } }]; } /// 通用 请求服务器方法 /// @param apiPath 接口地址 /// @param parameters 请求参数 /// @param completion 请求响应参数 - (void)requestHttpsBase:(NSString *)apiPath parameters:(NSMutableDictionary *)parameters completion:(void (^)(ResponseData *responseData))completion{ //1,创建你得请求url NSString *URL = [GlobalKit shareKit].GlobalRequestHttpsHost; if([self stringIsNullOrEmpty:URL]){ URL = TestRequestHttpsHost; } URL = [NSString stringWithFormat:@"%@%@", URL, apiPath]; NSLog(@"############接口请求url:%@", URL); // NSURLSessionDataTask * task=nil; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; AFHTTPResponseSerializer *responseSerializer = [AFHTTPResponseSerializer serializer]; manager.responseSerializer = responseSerializer; //3.request NSMutableURLRequest * request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"post" URLString:URL parameters:parameters error:nil]; request.timeoutInterval = TIME_OUT; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setValue:GlobalKit.shareKit.hdlAccessToken forHTTPHeaderField:@"Authorization"]; //语言类型 [manager.requestSerializer setValue:[self getCurrentLanguage] forHTTPHeaderField:@"language"]; //4.dataTaskWithRequest [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (completion) { ResponseData *responseData = [[ResponseData alloc] init]; responseData.code = @"-1"; if(responseObject != NULL){ //4.解析拿到的响应数据 NSLog(@"数据返回%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]); NSDictionary * outDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; responseData = [[ResponseData alloc] initWithDictionary:outDic]; } if (!responseData) { responseData = [[ResponseData alloc] init]; } completion(responseData); } }]resume]; // return task; } /** * 基础服务的接口都要校验sign */ -(NSMutableDictionary *)GetSignRequestDictionary:(NSMutableDictionary *)params{ if(params == NULL){ params =[NSMutableDictionary dictionary]; } UInt64 recordTime = [[NSDate date] timeIntervalSince1970]*1000; NSString *hdlServerAppKey = [GlobalKit shareKit].hdlServerAppKey; if (!hdlServerAppKey || hdlServerAppKey.length == 0) { hdlServerAppKey = APP_KEY; } NSString *hdlServerAppSecret = [GlobalKit shareKit].hdlServerAppSecret; if (!hdlServerAppSecret || hdlServerAppSecret.length == 0) { hdlServerAppSecret = SECRET_KEY; } [params setValue:hdlServerAppKey forKey:@"appKey"]; [params setValue:[NSString stringWithFormat:@"%llu",recordTime] forKey:@"timestamp"]; NSLog(@"##########APPKEY:%@, SECRETKEY:%@", hdlServerAppKey, hdlServerAppSecret); //1.对KEY升序 NSArray *keyArray = [params allKeys]; NSArray *sortKeyArray = [keyArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; //2.2 拼接按URL键值对 NSString *newString = @""; for(NSString *key in sortKeyArray){ if(params[key] != NULL){ //Key对应的value强转为NSString NSString *valueStr = [NSString stringWithFormat:@"%@",[params objectForKey:key]]; //检测当前参数是否需要参与校验 if([self IfValueNeedSign:valueStr]){ newString = [newString stringByAppendingString:[NSString stringWithFormat:@"%@=%@&", key,valueStr]]; } } } //2.3 拼接SECRET_KEY newString = [newString substringToIndex:[newString length] - 1]; newString = [newString stringByAppendingString: hdlServerAppSecret]; //2.4 MD5转换+转小写 if([self stringIsNullOrEmpty:newString]){ newString = @""; } NSString* signstr = [self signMD5Encrypt:newString]; [params setValue:signstr forKey:@"sign"]; return params; } /// 字符串判空 /// @param valueStr 传入判断字符 - (BOOL)stringIsNullOrEmpty:(NSString *)valueStr { if((valueStr == nil || [valueStr isKindOfClass:[NSNull class]] || valueStr.length == 0)){ return YES; }else{ return NO; } } /** MD5转换+转小写 */ - (NSString*)signMD5Encrypt:(NSString *)str { const char *cStr = [str UTF8String]; unsigned char digest[CC_MD5_DIGEST_LENGTH]; CC_MD5( cStr, strlen(cStr),digest ); NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [result appendFormat:@"%02x", digest[i]]; return result; } /// /// 判断当前值是否需要参与签名,保持跟云端一致 /// 空字符串不参与 /// 数组,集合,对象不参与 /// /// /// -(bool)IfValueNeedSign:(NSString *)valueStr{ if (( [self stringIsNullOrEmpty:valueStr])//判空字符 || ([[valueStr substringToIndex:1] isEqual:@"{"])//判断是否为对象 || ([[valueStr substringToIndex:1] isEqual:@"["])//判断是否为数组 || ([[valueStr substringToIndex:1] isEqual:@"("])//判断是否为数组 ) { // HDLSDKLog(@"不校验: %@",valueStr); return false; } return true; } /*获取当前系统语言 */ -(NSString *)getCurrentLanguage{ NSArray *languages = [NSLocale preferredLanguages]; NSString *currentLocaleLanguageCode=@"en"; if (languages.count>0) { currentLocaleLanguageCode = languages.firstObject; if ([currentLocaleLanguageCode hasPrefix:@"zh"]) {//中文 currentLocaleLanguageCode = @"cn"; }else {//其它语言 currentLocaleLanguageCode = @"en"; } } return currentLocaleLanguageCode; } @end #pragma mark - 修改记录 //2021-07-07 //V1.1.3 //1.替换为新接口,根据homeId注册萤石子账号方案。