2024-06-07 13:38:31 +08:00

322 lines
15 KiB
Objective-C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// HBApiParams.m
// FlyChat1
//
// Created by Liv on 2022/3/6.
//
#import "HBApiParams.h"
#import <sys/utsname.h>
#import <mach/mach.h>
#import "CommonCrypto/CommonDigest.h"
#import "NSString+AES.h"
@implementation HBApiParams
/**
client:结构为获取的当前的终端信息,参考字面义
clientVer:当前开发的前端app、pc、h5版本号参与验签
cont:请求包体内容内容为空时则直接接留空,参与验签
timestamp:时间戳,毫秒值,参与验签
clientType请求终端传值为ios android h5 web;参与验签
apiVer调用接口版本默认为1 ;参与验签
验签key:使用sha1(终端类型)转hex值获取
以上验签字段使用key=value结构拼接按照字段排序key即可
生成的验签串如下:
apiVer=1&clientType=web&clientVer=1&cont=哈哈哈&timestamp=1572760249513&key=CA84D1343B96BAA8137C943ED1860E522CACB238
再将验签串进行md5加密转hex获得sign的值如下
最终生成的签名内容为:A6218946715FF5272527BFEADE70D022
***/
+ (NSDictionary *)fetchPostParams:(id)info encryption:(BOOL)encryption{
NSMutableDictionary * tempInfo = [NSMutableDictionary dictionary];
[tempInfo addEntriesFromDictionary:@{@"client":[self fetchClient]}];
[tempInfo addEntriesFromDictionary:@{@"clientVer":@"1"}];
[tempInfo addEntriesFromDictionary:@{@"apiVer":[self fetchApiVer]}];
[tempInfo addEntriesFromDictionary:@{@"clientType":[self fetchClientType]}];
[tempInfo addEntriesFromDictionary:@{@"timestamp":[self fetchTimestamp]}];
[tempInfo addEntriesFromDictionary:@{@"param":@"param"}];
if (info) {
NSError *error;
NSString * infoJson = @"{}";
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:info options:0 error:&error];
if (jsonData) {
infoJson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
if (encryption) {
infoJson = [infoJson aci_encryptWithAES];
[tempInfo addEntriesFromDictionary:@{@"cont":infoJson}];
} else {
[tempInfo setValue:info forKey:@"cont"];
}
} else {
[tempInfo addEntriesFromDictionary:@{@"cont":@""}];
}
[tempInfo addEntriesFromDictionary:@{@"sign":[self fetchMD5Sha1Sign:tempInfo]}];
if ([tempInfo[@"cont"] isKindOfClass:[NSString class]] && [tempInfo[@"cont"] isEqualToString:@""]) {
[tempInfo removeObjectForKey:@"cont"];
}
return tempInfo;
}
+ (NSDictionary *)fetchClient{
NSDictionary * clientDic = @{@"deviceId": [self fetchCurrentDeviceModel],
@"osType":@"iOS",
@"deviceType":@"ios",
@"osVersion":@"1.0",
@"appVersion":[self fetchAppVersion]};
return clientDic;
}
+ (NSString *)fetchCurrentDeviceModel{
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSASCIIStringEncoding];
if ([deviceModel isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if ([deviceModel isEqualToString:@"iPhone3,2"]) return @"iPhone 4";
if ([deviceModel isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
if ([deviceModel isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([deviceModel isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
if ([deviceModel isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)";
if ([deviceModel isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)";
if ([deviceModel isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (GSM+CDMA)";
if ([deviceModel isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)";
if ([deviceModel isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (GSM+CDMA)";
if ([deviceModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([deviceModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([deviceModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([deviceModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
if ([deviceModel isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
// 日行两款手机型号均为日本独占可能使用索尼FeliCa支付方案而不是苹果支付
if ([deviceModel isEqualToString:@"iPhone9,1"]) return @"iPhone 7";
if ([deviceModel isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus";
if ([deviceModel isEqualToString:@"iPhone9,3"]) return @"iPhone 7";
if ([deviceModel isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus";
if ([deviceModel isEqualToString:@"iPhone10,1"]) return @"iPhone_8";
if ([deviceModel isEqualToString:@"iPhone10,4"]) return @"iPhone_8";
if ([deviceModel isEqualToString:@"iPhone10,2"]) return @"iPhone_8_Plus";
if ([deviceModel isEqualToString:@"iPhone10,5"]) return @"iPhone_8_Plus";
if ([deviceModel isEqualToString:@"iPhone10,3"]) return @"iPhone X";
if ([deviceModel isEqualToString:@"iPhone10,6"]) return @"iPhone X";
if ([deviceModel isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
if ([deviceModel isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
if ([deviceModel isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";
if ([deviceModel isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max";
if ([deviceModel isEqualToString:@"iPhone12,1"]) return @"iPhone 11";
if ([deviceModel isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro";
if ([deviceModel isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max";
if ([deviceModel isEqualToString:@"iPhone12,8"]) return @"iPhone SE2";
if ([deviceModel isEqualToString:@"iPhone13,1"]) return @"iPhone 12 mini";
if ([deviceModel isEqualToString:@"iPhone13,2"]) return @"iPhone 12";
if ([deviceModel isEqualToString:@"iPhone13,3"]) return @"iPhone 12 Pro";
if ([deviceModel isEqualToString:@"iPhone13,4"]) return @"iPhone 12 Pro Max";
if ([deviceModel isEqualToString:@"iPhone14,1"]) return @"iPhone 13 mini";
if ([deviceModel isEqualToString:@"iPhone14,2"]) return @"iPhone 13";
if ([deviceModel isEqualToString:@"iPhone14,3"]) return @"iPhone 13 Pro";
if ([deviceModel isEqualToString:@"iPhone14,4"]) return @"iPhone 13 Pro Max";
if ([deviceModel isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([deviceModel isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([deviceModel isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([deviceModel isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([deviceModel isEqualToString:@"iPod5,1"]) return @"iPod Touch (5 Gen)";
if ([deviceModel isEqualToString:@"iPad1,1"]) return @"iPad";
if ([deviceModel isEqualToString:@"iPad1,2"]) return @"iPad 3G";
if ([deviceModel isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
if ([deviceModel isEqualToString:@"iPad2,2"]) return @"iPad 2";
if ([deviceModel isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
if ([deviceModel isEqualToString:@"iPad2,4"]) return @"iPad 2";
if ([deviceModel isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)";
if ([deviceModel isEqualToString:@"iPad2,6"]) return @"iPad Mini";
if ([deviceModel isEqualToString:@"iPad2,7"]) return @"iPad Mini (GSM+CDMA)";
if ([deviceModel isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)";
if ([deviceModel isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM+CDMA)";
if ([deviceModel isEqualToString:@"iPad3,3"]) return @"iPad 3";
if ([deviceModel isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)";
if ([deviceModel isEqualToString:@"iPad3,5"]) return @"iPad 4";
if ([deviceModel isEqualToString:@"iPad3,6"]) return @"iPad 4 (GSM+CDMA)";
if ([deviceModel isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)";
if ([deviceModel isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)";
if ([deviceModel isEqualToString:@"iPad4,4"]) return @"iPad Mini 2 (WiFi)";
if ([deviceModel isEqualToString:@"iPad4,5"]) return @"iPad Mini 2 (Cellular)";
if ([deviceModel isEqualToString:@"iPad4,6"]) return @"iPad Mini 2";
if ([deviceModel isEqualToString:@"iPad4,7"]) return @"iPad Mini 3";
if ([deviceModel isEqualToString:@"iPad4,8"]) return @"iPad Mini 3";
if ([deviceModel isEqualToString:@"iPad4,9"]) return @"iPad Mini 3";
if ([deviceModel isEqualToString:@"iPad5,1"]) return @"iPad Mini 4 (WiFi)";
if ([deviceModel isEqualToString:@"iPad5,2"]) return @"iPad Mini 4 (LTE)";
if ([deviceModel isEqualToString:@"iPad5,3"]) return @"iPad Air 2";
if ([deviceModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
if ([deviceModel isEqualToString:@"iPad6,3"]) return @"iPad Pro 9.7";
if ([deviceModel isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7";
if ([deviceModel isEqualToString:@"iPad6,7"]) return @"iPad Pro 12.9";
if ([deviceModel isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9";
if ([deviceModel isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2";
if ([deviceModel isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3";
if ([deviceModel isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3";
if ([deviceModel isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4";
if ([deviceModel isEqualToString:@"i386"]) return @"Simulator";
if ([deviceModel isEqualToString:@"x86_64"]) return @"Simulator";
return deviceModel;
}
+ (NSString *)fetchTimestamp{
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0]; // 获取当前时间0秒后的时间
NSTimeInterval time = [date timeIntervalSince1970]*1000;// *1000 是精确到毫秒(13位),不乘就是精确到秒(10位)
return [NSString stringWithFormat:@"%.0f", time];
}
+ (NSString *)fetchAppVersion {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
return app_Version;
}
+ (NSString *)fetchApiVer{
NSString * apiVer = @"1";
return apiVer;
}
+ (NSString *)fetchClientType{
NSString * clientType = @"iOS";
return clientType;
}
+ (NSString *)fetchMD5Sha1Sign:(NSDictionary *)info {
NSString * signStr = [self fetchSignStr:info];
NSString * key = [[self sha1WithString:[self fetchClientType]] uppercaseString];
signStr = [signStr stringByAppendingFormat:@"&key=%@",key];
NSString * signComp = [ [self MD5String:signStr] uppercaseString] ;
return signComp;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ (NSString *)MD5String:(NSString *)signStr {
const char *cstr = [signStr UTF8String];
unsigned char result[16];
CC_MD5(cstr, (CC_LONG)strlen(cstr), result);
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
#pragma clang diagnostic pop
+ (NSString *)sha1WithString:(NSString *)string {
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [self sha1WithData:data];
}
+ (NSString *)sha1WithData:(NSData *)data {
unsigned char *digest = NULL;
// Malloc a buffer to hold hash.
digest = malloc(CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char));
memset(digest, 0x0, CC_SHA1_DIGEST_LENGTH);
CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
NSString *result = [self sha1WithDigest:digest];
if (digest) {
free(digest);
}
return result;
}
+ (NSString *)sha1WithDigest:(const unsigned char *)digest {
if (!digest) {
return nil;
}
NSMutableString *result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char)];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[result appendFormat:@"%02x",digest[i]];
}
return result;
}
+ (NSString *)fetchSignStr:(NSDictionary *)info {
NSString * signStr = @"";
NSArray*sortedKeys=[[info allKeys]sortedArrayUsingSelector:@selector(compare:)];
for(NSString * key in sortedKeys){
if ([key isEqualToString:@"client"]) {
continue;
}
id value = [info objectForKey:key] ;
if ([key isEqualToString:@"cont"] && [value isKindOfClass:[NSString class]] && [value length] == 0) {
continue;
}
NSString * valueStr = @"";
if ([value isKindOfClass:[NSArray class]] ) {
valueStr = [self stringWithArray:value];
valueStr = [valueStr stringByAppendingString:@"}"];
}else if ([value isKindOfClass:[NSDictionary class]]){
valueStr = [NSString stringWithFormat:@"%@}",[self stringWithDict:value]];
}else if ([value isKindOfClass:[NSString class]]){
valueStr = value;
}
NSString * tempKeyV = [NSString stringWithFormat:@"%@=%@&",key,valueStr];
signStr = [signStr stringByAppendingFormat:@"%@",tempKeyV];
}
if (signStr.length >0) {
signStr = [signStr substringToIndex:signStr.length-1];
}
return signStr;
}
+ (NSString*)stringWithArray:(NSArray*)array {
NSString*str =@"[";
for(id obj in array) {
if([obj isKindOfClass:[NSDictionary class]]) {
str = [self stringWithDict:obj];
str = [str stringByAppendingFormat:@"}"];
}else if([obj isKindOfClass:[NSArray class]]) {
str = [self stringWithArray:obj];
str = [str stringByAppendingFormat:@"]"];
}
if([str length] !=1) {
str = [str stringByAppendingString:@","];
}
}
return str;
}
+ (NSString*)stringWithDict:(NSDictionary*)dict{
NSArray*keys = [dict allKeys];
NSArray*sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
return[obj1 compare:obj2 options:NSNumericSearch];
}];
NSString*str =@"{";
for(NSString*categoryId in sortedArray) {
id value = [dict objectForKey:categoryId];
if([value isKindOfClass:[NSDictionary class]]) {
value = [self stringWithDict:value];
value = [NSString stringWithFormat:@"%@}",value];
}
if([str length] !=1) {
str = [str stringByAppendingString:@","];
}
str = [str stringByAppendingFormat:@"\"%@\":\"%@\"",categoryId,value];
}
return str;
}
@end