前言:
iOS版的微信支付SDK中需要实现,随机数算法,获取时间戳,签名算法,MD5加密算法,一下是我所实现的这些算法,已经应用到项目了,都是按照微信支付文档上的要求实现的。
1、随机数算法
实现一个由数字和大写字母随机组成的32位长的字符串。
///获取微信支付需要的随机数
+ (NSString *)paymentWechatNonceString {
NSArray *sampleArray = @[@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9",
@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J",
@"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T",
@"U", @"V", @"W", @"X", @"Y", @"Z"];
NSMutableString *randomString = [NSMutableString string];
for (NSInteger i = 0; i<32; ++i) {
[randomString appendString:sampleArray[random()%32]];
}
return [randomString copy];
}
2、获取系统时间戳
要求必须是从1970年1月1号开始到现在的时间,单位是秒,长度10位。
///获取微信支付需要的时间戳,单位(秒)
+ (UInt32)paymentWechatTimestamp {
NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] * 1000;
return interval;
}
3、获取签名算法
(1):
设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
(2):
在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
///获取微信支付需要的签名
+ (NSString *)paymentWechatSign:(NSDictionary *)dic {
NSMutableString *stringA = [NSMutableString string];
//按字典key升序排序
NSArray *sortKeys = [[dic allKeys] sortedArrayUsingSelector:@selector(compare:)];
//拼接格式 “key0=value0&key1=value1&key2=value2”
for (NSString *key in sortKeys) {
[stringA appendString:[NSString stringWithFormat:@"%@=%@&", key, dic[key]]];
}
//拼接商户签名,,,,kShopSign 要和微信平台上填写的密钥一样,(密钥就是签名)
[stringA appendString:[NSString stringWithFormat:@"key=%@", kShopSign]];
//MD5加密
NSString *stringB = [PaymentAlgorithmObject MD5:[stringA copy]];
//返回大写字母
return stringB.uppercaseString;
}
4、MD5算法
md5算法使用iOS系统API自带的函数实现。
引入所需类库
#import<CommonCrypto/CommonDigest.h>
封装算法实现
///iOS系统API自带MD5加密算法
+ (NSString *)MD5:(NSString *)input {
const char *cStr = [input UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, (CC_LONG)strlen(cStr), digest );
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}