微信支付SDK中需要实现的各种算法

前言:

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;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值