我遇到这个问题,找了很多资料看。。。最后还是自己领悟的哈哈哈。。。
这个问题出现主要还是因为sign的问题,要重新做一个sign
下面对每个调起参数的详解:
partnerID:商户号,申请商户号的时候,微信发的邮件里面有。
prepayId:统一下单成功后返回的唯一标识
nonceStr:是统一下单的时候做出来的随机数,下单后返回的参数里面有它
timeStamp:文档有说明有,自1970年1月1日 0点0分0秒以来的秒数。注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。
pagekage: 固定值Sign=WXPay
sign: 再次生成的签名,主要出现问题的地方。
下面详细说说签名:key分别是:appid,partnerid,noncestr,timestamp,package,prepayid
代码如下:
+ (NSString *)jumpToBizPayWith:(TYWechatPay *)pay {//TYWechatPay是我做的一个数据模型,按照统一下单返回的数据做的。
NSDictionary *dict = @{
@"appid":pay.appid,//NSString
@"partnerid":pay.mch_id,//NSString
@"noncestr":pay.nonce_str,//NSString
@"timestamp":@(pay.timestamp),//格式是:@(Uint32)
@"package":pay.package,//NSString
@"prepayid":pay.prepay_id//NSString
};
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = pay.mch_id;
req.prepayId = pay.prepay_id;
req.nonceStr = pay.nonce_str;
req.timeStamp = pay.timestamp;
req.package = pay.package;
req.sign = [self getWechatSignWithDict:dict key:signKey];
[WXApi sendReq:req];
return pay.return_msg;
}
//生成签名
+ (NSString *)getWechatSignWithDict:(NSDictionary *)dict key:(NSString *)signKey{
NSArray *keyArr = [self SortWithArr:[dict allKeys]] ;
NSMutableString *desc = [NSMutableString string];
for (NSString *key in keyArr) {
if ([desc length] == 0) {
[desc appendString:key];
[desc appendString:@"="];
}else{
[desc appendString:@"&"];
[desc appendString:key];
[desc appendString:@"="];
}
if (![dict[key] isKindOfClass:[NSString class]]) {
int a = [dict[key] intValue];
[desc appendString:[NSString stringWithFormat:@"%d",a]];
}else{
[desc appendString:dict[key]];
}
}
NSString *stringSignTemp = [NSString stringWithFormat:@"%@&key=%@",desc,signKey];
return [MD5 md532BitUpper:stringSignTemp];
}
//排列key
+ (NSArray *)SortWithArr:(NSArray *)arr{
NSMutableArray *p = [NSMutableArray arrayWithArray:arr];
for (int i = 0; i<[arr count]; i++)
{
for (int j=i+1; j<[arr count]; j++)
{
NSString *a = p[i];
NSString *b = p[j];
if ([a compare:b] > 0)
{
[p replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%@",b]];
[p replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%@",a]];
}
}
}
return p;
}