JLChen
2021-03-01 a639b63526620ffec824cf51040764151f7c13f8
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
//  EZHttpUtil.m
//  EZOpenSDKDemo
//
//  Created by 陈嘉乐 on 2021/2/26.
//  Copyright © 2021 hikvision. All rights reserved.
//
 
#import "EZHttpUtil.h"
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
 
#define APP_KEY @"HDL-HOME-APP-TEST"
#define SECRET_KEY @"WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss"
 
@implementation EZHttpUtil
 
 
+(NSMutableDictionary *)GetSignRequestDictionary:(NSMutableDictionary *)params{
    if(params == NULL){
        params =[NSMutableDictionary dictionary];
    }
    [params setValue:APP_KEY forKey:@"appKey"];
    [params setValue:@"" forKey:@"timestamp"];
    //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){
            NSString *valueStr = params[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: SECRET_KEY];
    //2.4 MD5转换+转小写
    if(newString == nil || newString == NULL){
        newString = @"";
    }
    NSString* signstr = [self signMD5Encrypt:newString];
    [params setValue:signstr forKey:@"sign"];
    
    return params;
}
 
+ (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;
    
    
}
 
/// <summary>
/// 判断当前值是否需要参与签名,保持跟云端一致
/// 空字符串不参与
/// 数组,集合,对象不参与
/// </summary>
/// <param name="valueStr"></param>
/// <returns></returns>
+(bool)IfValueNeedSign:(NSString *)valueStr{
    if (( (valueStr == nil || [valueStr isKindOfClass:[NSNull class]] || valueStr.length == 0))//判空字符
        || ([[valueStr substringToIndex:1] isEqual:@"{"])//判断是否为对象
        || ([[valueStr substringToIndex:1] isEqual:@"["])//判断是否为数组
        ) {
        return false;
    }
    return true;
}
 
@end