1.首先確認(rèn)后臺預(yù)支付的訂單是否和微信支付對象PayReq
中的屬性值是否一一對應(yīng)
//需要創(chuàng)建這個支付對象
PayReq *req = [[PayReq alloc] init];
//由用戶微信號和AppID組成的唯一標(biāo)識惠爽,用于校驗微信用戶
req.openID = @" 唯一標(biāo)識";
// 商家id铅搓,在注冊的時候給的
req.partnerId = @"商家 id";
// 預(yù)支付訂單這個是后臺跟微信服務(wù)器交互后杂抽,微信服務(wù)器傳給你們服務(wù)器的,你們服務(wù)器再傳給你
req.prepayId = self.payOrderItem.prepay_id;
// 根據(jù)財付通文檔填寫的數(shù)據(jù)和簽名
//這個比較特殊亡哄,是固定的鸭廷,只能是即req.package = Sign=WXPay
req.package = @"Sign=WXPay";
// 隨機(jī)編碼枣抱,為了防止重復(fù)的,在后臺生成
req.nonceStr = self.payOrderItem.nonce_str;
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
UInt32 timeStamp =[timeSp intValue];
// 這個是時間戳辆床,也是在后臺生成的佳晶,為了驗證支付的
req.timeStamp = timeStamp;
2.確認(rèn)sign 的值,微信中的支付對象有一個sing 屬性讼载,該屬性為簽名轿秧。該屬性的值比較特殊,需要后臺做好二次簽名后才可以直接使用咨堤,如果后臺沒有做二次簽名需要我們自己做的話需要用一下方法對菇篡,sign 值進(jìn)行處理
// 這個簽名也是后臺做的,但是后臺沒有做
req.sign = self.payOrderItem.sign;
req.sign = [self createMD5SingForPayWithAppID:req.openID partnerid:req.partnerId prepayid:req.prepayId package:req.package noncestr:req.nonceStr timestamp:req.timeStamp];
//發(fā)送請求到微信一喘,等待微信返回onResp
[WXApi sendReq:req];
}
-(NSString *)createMD5SingForPayWithAppID:(NSString *)appid_key partnerid:(NSString *)partnerid_key prepayid:(NSString *)prepayid_key package:(NSString *)package_key noncestr:(NSString *)noncestr_key timestamp:(UInt32)timestamp_key{
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
[signParams setObject:appid_key forKey:@"appid"];//微信appid 例如wxfb132134e5342
[signParams setObject:noncestr_key forKey:@"noncestr"];//隨機(jī)字符串
[signParams setObject:package_key forKey:@"package"];//擴(kuò)展字段 參數(shù)為 Sign=WXPay
[signParams setObject:partnerid_key forKey:@"partnerid"];//商戶賬號
[signParams setObject:prepayid_key forKey:@"prepayid"];//此處為統(tǒng)一下單接口返回的預(yù)支付訂單號
[signParams setObject:[NSString stringWithFormat:@"%u",timestamp_key] forKey:@"timestamp"];//時間戳
NSMutableString *contentString =[NSMutableString string];
NSArray *keys = [signParams allKeys];
//按字母順序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
for (NSString *categoryId in sortedArray) {
if ( ![[signParams objectForKey:categoryId] isEqualToString:@""]
&& ![[signParams objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[signParams objectForKey:categoryId] isEqualToString:@"key"]
)
{
[contentString appendFormat:@"%@=%@&", categoryId, [signParams objectForKey:categoryId]];
}
}
//添加商戶密鑰key字段 API 密鑰
[contentString appendFormat:@"key=%@", @"商戶秘鑰"];
NSString *result = [contentString md5String];//md5加密
return result;
}
MD5加密的字符串分類
- (NSString *)md5String
{
if(self == nil || [self length] == 0) return nil;
unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
CC_MD5([self UTF8String], (int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
NSMutableString *ms = [NSMutableString string];
for(i=0;i<CC_MD5_DIGEST_LENGTH;i++)
{
[ms appendFormat: @"%02x", (int)(digest[i])];
}
return [ms copy];
}