主要寫下關鍵
發起支付
- (NSString *)jumpToBizPayWithDic:(NSDictionary *)dict {
if (![WXApi isWXAppInstalled]) {
return @"該裝置沒有安裝微信";
}
if (![WXApi isWXAppSupportApi]) {
return @"該裝置不支援微信";
}
if(dict != nil){
NSString *orderId = [dict objectForKey:@"ordersn"];
UInt32 timeStamp = [self stamp];
NSString *nonceStr = [dict objectForKey:@"nonceStr"];
NSString *package = @"Sign=WXPay";
NSString *md5sign = [self signWithappid:wx_appid
andnoncestr:nonceStr
andpackage:package
andpartnerid:PARTNER_Id
andprepayid:orderId
andtimestamp:timeStamp
andkey:PARTNER_Id_key];
//調起微信支付 主要參數:
PayReq* req = [[PayReq alloc] init];
req.partnerId = PARTNER_Id; // 商戶id 這個是固定的,必須wx124
req.prepayId = orderId; // 訂單号 這個是背景傳回的(是預付訂單号)
req.nonceStr = nonceStr; // 随機數 (需要背景傳回,不能自己生産,因為要保持一緻)
req.timeStamp = timeStamp; // 時間戳 (可以自己生成,也可以背景傳回)
req.package = package; // 擴充字段 (微信要求暫時傳@"Sign=WXPay")
req.sign = md5sign; // 這個簽名最關鍵,也最容易出錯,基本都被坑在這裡(自己生成的,生成方法下面有)
BOOL flag = [WXApi sendReq:req];
return @"";
}else{
return @"伺服器傳回錯誤,未擷取到json對象";
}
}
簽名生成方法(方法名沒有大寫,因為微信參數拼接的時候,參數名要求全小寫,怕出錯,是以全部是是複制進去的……)
//最坑的地方,需要仔仔細細的看文檔,參數有順序,是以我把順序已經寫死了。key必須放在最後。需要把7個參數拼接一起,然後md5編碼(注意還是大寫)。
- (NSString *)signWithappid:(NSString *)appid
andnoncestr:(NSString *)noncestr
andpackage:(NSString *)package
andpartnerid:(NSString *)partnerid
andprepayid:(NSString *)prepayid
andtimestamp:(UInt32)timestamp
andkey:(NSString *)key{
NSString *string = [NSString stringWithFormat:@"appid=%@&noncestr=%@&package=%@&partnerid=%@&prepayid=%@×tamp=%@&key=%@",appid,noncestr,package,partnerid,prepayid,[NSString stringWithFormat:@"%u",timestamp],key];
NSString * md5str = [self md5: string];
NSString *us = md5str.uppercaseString;
return us;
}
md5編碼方式:
- (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[];
CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
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]
];
}
最後附一個簽名檢查工具,官方的 https://pay.weixin.qq.com/wiki/tools/signverify/
其實我是遇到另外一個更坑的東西。 appid和商戶的key是boss直接給我的,安卓那邊已經實作了支付,是以認為這兩個參數是沒問題的 當我被"商戶下單id非法"這個問題坑了很久很久之後登陸開放平台,發現建立應用的時候沒有勾選iOS……