這幾天一直沒(méi)細(xì)搞橘荠,后臺(tái)那邊說(shuō)在弄著我這邊就沒(méi)管礁遣,但是好幾天了還沒(méi)有成功,自己也翻閱了下官方文檔和其他項(xiàng)目碗殷。發(fā)現(xiàn)大部分的簽名都是后臺(tái)搞得精绎,所以我就記錄下防止以后再出現(xiàn)類似情況⌒科蓿總結(jié)了以下幾點(diǎn)代乃。
1.首先確認(rèn)后臺(tái)預(yù)支付的訂單是否和微信支付對(duì)象PayReq中的屬性值是否一一對(duì)應(yīng)
PayReq*request = [[PayReqalloc]init];
// 商家id,在注冊(cè)的時(shí)候給的
request.partnerId= [objDictobjectForKey:@"mch_id"]?:@"";
// 預(yù)支付訂單這個(gè)是后臺(tái)跟微信服務(wù)器交互后仿粹,微信服務(wù)器傳給你們服務(wù)器的搁吓,你們服務(wù)器再傳給你
?request.prepayId= [objDictobjectForKey:@"prepay_id"]?:@"";
// 根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名//這個(gè)比較特殊,是固定的吭历,只能是即req.package = Sign=WXPay
?request.package= [objDictobjectForKey:@"package"]?:@"";
// 隨機(jī)編碼擎浴,為了防止重復(fù)的,在后臺(tái)生成
?request.nonceStr= [objDictobjectForKey:@"nonce_str"]?:@"";
// 這個(gè)是時(shí)間戳毒涧,也是在后臺(tái)生成的贮预,為了驗(yàn)證支付的
inttimestam = [[objDictobjectForKey:@"timestamp"]intValue];
?request.timeStamp= (uint32_t)timestam;
//后臺(tái)的簽名 ? ? ? ? ? ? ? ? ? ? ??
?request.sign= [objDictobjectForKey:@"sign"]?:@"";
//自己的簽名
request.sign = [self createMD5SingForPayWithAppID:[objDict objectForKey:@"appid"]?:@"" partnerid:request.partnerId prepayid:request.prepayId package:request.package noncestr:request.nonceStr timestamp:request.timeStamp];
[WXApisendReq:requestcompletion:^(BOOLsuccess) {
FBLog(@"微信支付結(jié)果::::%@",success==YES?@"1":@"2");
?}];
2.確認(rèn)sign 的值贝室,微信中的支付對(duì)象有一個(gè)sing 屬性,該屬性為簽名仿吞。該屬性的值比較特殊滑频,需要后臺(tái)做好二次簽名后才可以直接使用,如果后臺(tái)沒(méi)有做二次簽名需要我們自己做的話需要用一下方法對(duì)唤冈,sign 值進(jìn)行處理
-(NSString*)createMD5SingForPayWithAppID:(NSString*)appid_keypartnerid:(NSString*)partnerid_keyprepayid:(NSString*)prepayid_keypackage:(NSString*)package_keynoncestr:(NSString*)noncestr_keytimestamp:(UInt32)timestamp_key{
? ? ? ? NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
? ? ? ? [signParamssetObject:appid_keyforKey:@"appid"];//微信appid 例如wxfb132134e5342
? ? ? ? [signParamssetObject:noncestr_keyforKey:@"noncestr"];//隨機(jī)字符串
? ? ? ? [signParamssetObject:package_keyforKey:@"package"];//擴(kuò)展字段? 參數(shù)為 Sign=WXPay
? ? ? ? [signParamssetObject:partnerid_keyforKey:@"partnerid"];//商戶賬號(hào)
? ? ? ? [signParamssetObject:prepayid_keyforKey:@"prepayid"];//此處為統(tǒng)一下單接口返回的預(yù)支付訂單號(hào)
? ? ? ? [signParamssetObject:[NSStringstringWithFormat:@"%u",timestamp_key]forKey:@"timestamp"];//時(shí)間戳
? ? ? ? NSMutableString*contentString? =[NSMutableStringstring];
? ? ? ? NSArray*keys = [signParamsallKeys];
? ? ? ? //按字母順序排序
? ? ? ? NSArray*sortedArray = [keyssortedArrayUsingComparator:^NSComparisonResult(idobj1,idobj2) {
? ? ? ? ? ? return [obj1 compare:obj2 options:NSNumericSearch];
? ? ? ? }];
? ? ? ? //拼接字符串
? ? ? ? for(NSString*categoryIdinsortedArray) {
? ? ? ? ? ? if(![[signParamsobjectForKey:categoryId]isEqualToString:@""]
? ? ? ? ? ? ? ? && ![[signParamsobjectForKey:categoryId]isEqualToString:@"sign"]
? ? ? ? ? ? ? ? && ![[signParamsobjectForKey:categoryId]isEqualToString:@"key"]){
? ? ? ? ? ? ? ? [contentStringappendFormat:@"%@=%@&", categoryId, [signParamsobjectForKey:categoryId]];
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //添加商戶密鑰key字段? API 密鑰
? ? ? ? [contentStringappendFormat:@"key=%@", @"自己項(xiàng)目的商戶秘鑰"];
? ? NSString*result = [selfmd5String:contentString];//md5加密
? ? returnresult;
}
3.MD5加密
- (NSString*)md5String:(NSMutableString*)contentString{
? ? if(self==nil|| [contentStringlength] ==0)returnnil;
? ? unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
? ? CC_MD5([contentString UTF8String], (int)[contentString lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
? ? NSMutableString *ms = [NSMutableString string];
? ? for(i=0;i<CC_MD5_DIGEST_LENGTH;i++){
? ? ? ? [msappendFormat:@"%02x", (int)(digest[i])];
? ? }
? ? return[mscopy];
}