將所有POST參數(shù)(sign除外)進(jìn)行字典排序,組成字符串:
比如:(根據(jù)首字母排序,參數(shù)間用&相連,字典轉(zhuǎn)成json格式)
ap_id=20140723007148&biz_conte={"outTradeNo":201503201",toalAmount":
"8.8",discountAmount":8.",unDiscountAmount":80",subject": 掃碼支付",godsDetail": [{"godsI":
"aple-01",godsName":ipad",godsCategory":78230",price":8.8",quantiy":1"}],"operatorId":
"op01",storeId":pudong01",terminalId":t_01",timeExpire":
"20150329101"}&charset=utf-8&method=alipay.trade.precate×tamp=2017-0724 03:750
解決辦法:
1.首先傳入的是參數(shù)字典.
2.獲取字典的所有key
3.創(chuàng)建一個可變字符串
4.將key和value對應(yīng)用’=’相連起來
5.其中value是字典的話,就轉(zhuǎn)成json格式,再相連
6.如果有空格,換行等等的格式字符,就將其替換掉
示例:
NSMutableString *contentString =[NSMutableString string];
NSDictionary* dict = [self convertToDict];
NSArray *keys = [dict allKeys];
//按字母順序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
for (NSString *categoryId in sortedArray) {
if (![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"timestamp"]){
if([categoryId isEqualToString:@"biz_content"]){
NSError *error = nil;
NSDictionary* bizDict = [dict objectForKey:@"biz_content"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:bizDict options:NSJSONWritingPrettyPrinted error: &error];
NSMutableData *tempJsonData = [NSMutableData dataWithData:jsonData];
NSString* jsonString1 = [[NSString alloc] initWithData:tempJsonData encoding:NSUTF8StringEncoding];
NSString *jsonString2 = [jsonString1 stringByReplacingOccurrencesOfString:@" : " withString:@":"];
[contentString appendFormat:@"biz_content=%@&",jsonString2];
}else{
[contentString appendFormat:@"%@=%@&", categoryId, [dict valueForKey:categoryId]];
}
}
}
//添加key字段
[contentString appendFormat:@"timestamp=%@", [dict objectForKey:@"timestamp"]];
NSString *strUrl1 = [contentString stringByReplacingOccurrencesOfString:@" " withString:@""];
// NSString *strUrl2 = [strUrl1 stringByReplacingOccurrencesOfString:@"\t" withString:@""];
NSString *strUrl3 = [strUrl1 stringByReplacingOccurrencesOfString:@"\n" withString:@""];
上述代碼中,timestamp是最后的一個key,是不用用&相連的,所以拿出來單獨拼接.biz_content是一個字典,所以也單獨進(jìn)行判斷,轉(zhuǎn)成json格式進(jìn)行拼接,這樣就完成待簽名字符串的整理了.