0
点赞
收藏
分享

微信扫一扫

iOS 对请求参数进行签名相关问题及对应解决方案

小知识,大挑战!本文正在参与“​​程序员必备小知识​​”创作活动。

引言

本文是梳理粉丝对博文:​​【对请求参数进行签名】请求参数按照ASCII码从小到大排序、拼接、加密(采用递归的方式进行实现)​​的相关问题及对应解决方案。


I、签名数组ASCII码排序优化

1.1 优化数组元素的排序

记录一个用户反馈的bug,修改内容如下图: iOS 对请求参数进行签名相关问题及对应解决方案_数组


​数组的地方,我的规则是[] 表示数组,数组元素是用,分隔[,,,] 进行递归拼接的。​​ 如果你认为数组ASCII码排序的地方是错误的话,你可以打印排序之后的字符串,看排序与你服务侧的拼接规则哪里不一样。把规则修改为与后台的数组排序规则一致即可。


/**
- 处理key对应的Value是数组的情况

*/
+ (NSString *)sortedDictionaryArr:(NSArray *)arr {


NSMutableString *contentString =[NSMutableString string];

#pragma mark - ******** 可选

arr = [self sortedArrBykey:sortedArray];//

for ( id obj in arr ) {



NSString * tmp = @"";

if(contentString.length<1 || [contentString isEqualToString:@""]){//



}
else{
[contentString appendString:@","];


}





if( [obj isKindOfClass:NSDictionary.class]){



tmp = [self sortedDictionary:obj];







}

// 数组就[]

else if( [obj isKindOfClass:NSArray.class]){


tmp = [self sortedDictionaryArr:obj];


tmp = [NSString stringWithFormat:@"%@%@%@",@"{",tmp,@"}"];


}
else{

tmp= obj;



}






[contentString appendFormat:@"%@",tmp];



}


contentString = [NSString stringWithFormat:@"%@%@%@",@"[",contentString,@"]"];




return contentString;



}

例子:编辑门店的商品的价格 请求报文:

{
"adjustStocks" : [
{
"nnewStockNum" : "0",
"productId" : "1280072986512433152",
"newStockNum" : "0",
"oldStockNum" : "0",
"storeId" : "25063",
"productSkuId" : "1280072986516627456",
"batchNo" : ""
}
],
"modifyPrices" : [
{
"tagId" : "25063",
"productNewPrice" : "5",
"productSkuId" : "1280072986516627456",
"type" : "1",
"productId" : "1280072986512433152",
"productOldPrice" : "33"
}
]
}

签名元字符串的ASCII码排序

adjustStocks=[batchNo=&newStockNum=0&nnewStockNum=0&oldStockNum=0&productId=1280072986512433152&productSkuId=1280072986516627456&storeId=25063]&modifyPrices=[productId=1280072986512433152&productNewPrice=55&productOldPrice=5&productSkuId=1280072986516627456&tagId=25063&type=1]&appsecret=4f7b71

1.2 新增集合元素排序:

对于数组排序,我的初步想法是,先按照数组元素的class类型进行分组,其中的子数组是字符串类型的话,就对其进行排序之后再重新组合到新的数组中。然后再进行遍历递归拼接

/**

1、新增集合元素排序:对于数组排序,我的初步想法是,先按照数组元素的class类型进行分组,其中的子数组是字符串类型的话,就对其进行排序之后再重新组合到新的数组中。然后再进行遍历递归拼接

*/
+ (NSMutableArray *)sortedArrBykey:(NSArray *)array {




// 对数组先按照class类型进行排序

//1)取出分组

// NSArray *arDistinct = [array valueForKeyPath:@"@distinctUnionOfObjects.class"];// 无法获取到字典class类型

// NSMutableArray *classArr = [NSMutableArray arrayWithArray:arDistinct];

NSMutableArray *strclassArr = [NSMutableArray array];
NSMutableArray *nostrclassArr = [NSMutableArray array];


for (NSObject* obj in array) {


if([obj isKindOfClass:NSString.class]){


[strclassArr addObject:obj];
}else{

[nostrclassArr addObject:obj];


}

}


// 4)按照日期进行分组
NSMutableArray* sortedArray = [NSMutableArray array];


strclassArr = [strclassArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj1 compare:obj2 options:NSNumericSearch];

}];





[sortedArray addObjectsFromArray:strclassArr];
[sortedArray addObjectsFromArray:nostrclassArr];







return sortedArray;


}

1.3 微信支付参数值为空不参与排序的处理方案

参数为空的 只要排序之前从字典移除即可。


规则的原因 :签名只对针对重要的字段,值可空的参数可不必参加


II、其他编译相关问题

2.1 为什么我下载demo后,在xcode12中允许报错:library not found for -lAXIndicatorView;请问怎么解决?

iOS 对请求参数进行签名相关问题及对应解决方案_数组_02

原因:这是找不到 CocoaPods库 AXIndicatorView。是 AXWebViewController库依赖于它

iOS 对请求参数进行签名相关问题及对应解决方案_iOS_03iOS 对请求参数进行签名相关问题及对应解决方案_iOS_04

  • 解决方法: 你更新 pod 'AXWebViewController' 即可。


1、只更新指定的库,其它库忽略:​​pod update AXWebViewController --verbose --repo-update ​


2、pod update会更新所有的类库,获取最新版本的类库

​​cocoapods 用法文章:

exit 0%                                                                                                                           ➜  retail git:(develop) ✗ cat ~/bin/knpod
#!/bin/sh

#该命令只安装新添加的库,已更新的库忽略

pod install --verbose --no-repo-update
#该命令只更新指定的库,其它库忽略
#pod update 库名 --verbose --no-repo-update

exit 0% ➜ retail git:(develop) ✗


举报

相关推荐

0 条评论