最近项目要求添加一个微信支付的功能,要求是不需要服务端的配合,独立在客户端完成。
开始看官方demo的时候发现客户端只有短短的几行代码便成功了,更关键的是文档中那些参数都解释的含含糊糊。结果花了我好几天的时间才最终弄好。现在细数其辛酸历程。
//调起微信支付
PayReq* req = [[[PayReq alloc] init]autorelease];
req.partnerId = [dict objectForKey:@"partnerid"];
req.prepayId = [dict objectForKey:@"prepayid"];
req.nonceStr = [dict objectForKey:@"noncestr"];
req.timeStamp = stamp.intValue;
req.package = [dict objectForKey:@"package"];
req.sign = [dict objectForKey:@"sign"];
[WXApi sendReq:req];
这就官方文档中最核心的调出支付的代码,我们所需要做的一切都是获取这六个参数。
首先来一个个的解释这些参数
partnerId :这个就是在你申请通过微信商户资料后发到你邮件的中的一个商户号
106A3038-E2CA-46D0-9AFC-B86DF979D588.png
prepayid : 这个是需要向微信服务器提交申请后返回的一个支付交易会话ID,详细的下面会提到。
nonceStr : 这个是你自己生成的一个随机数。
timeStamp : 这个是你生成的一个时间戳。10位!!!不是13位的那个!
package : 这个目前是一个定死的值 Sign=WXPay。
sign : 这个是自己根据参数生成的一个签名!最坑的就是它了!
现在来一个的说如何得到这些参数值
2、nonceStr
这个很简单
NSString * nonce_str = [self md5:[NSString stringWithFormat:@"%d", arc4random() % 10000]];
nonce_str = [nonce_str uppercaseString];
- (NSString *) md5: (NSString *) inPutText
{
const char *cStr = [inPutText UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
] lowercaseString];
}
其实就是一个随机数,怎么生成随你。有个不得不提的地方,这里的noncestr就是你在第一次生成签名时的那个随机数,不用再次生成了!
3、timeStamp
NSString * timeString = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
这个地方需要提示一下
@property (nonatomic, assign) UInt32 timeStamp;
他的类型是这个样的,而你生成的是一个字符串类型的,最后提交的时候需要进行转化的!
4、sign
这里的签名不同于你第一次申请prepayid的签名,这里的生成签名的参数是appid,prepayid,partnerid,timestamp,noncestr,package,这几个排序后再拼接key,最后生成一个sign。
这样一看,其实还是很简答的嘛!果然还是我太蠢了.......好了,如果还是不行,请再看一遍,仔细的看一遍。实在不行,请联系我!