一、準備工作
1.必須通過微信審核的微信APPID 不然就沒法實現微信支付功能
2.查看iOS微信支付官方文檔去集成到你的工程文件中?微信支付官方文檔
這兩步做好后就可以開始調用微信支付接口來支付了,下面看具體怎么做
二 調起微信支付接口
2.1 集成微信支付SDK后在你的 AppDelegate.m 中注冊微信的APPID
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
//微信支付
[WXApi ?registerApp:@"你的APPID" ?withDescription:@"最好是填APP名"];
}
2.2 ?從自己的服務器獲取訂單的預支付信息,前提是服務器端已經調用了微信的統一下單接口
從服務器獲取的信息中的信息是:
appid = 123456789;//從服務器獲取的
"mch_id" = 1426349502;
"nonce_str" = Jtk3gcIfmsyYKyx7;
"prepay_id" = wx2017010311540938e8e489660575993008;
"result_code" = SUCCESS;
"return_code" = SUCCESS;
"return_msg" = OK;
sign = 562787A84AE02285F6AB3509C174491B;
"trade_type" = APP;
先看代碼,再說明存在的坑
NSDate*datenow = [NSDatedate];//現在時間,你可以輸出來看下是什么格式
//時間轉時間戳的方法:
NSString*timeSp = [NSStringstringWithFormat:@"%ld", (long)[datenowtimeIntervalSince1970]];
NSLog(@"timeSp:%ld",(long)[timeSpintegerValue] );//時間戳的值
NSMutableDictionary*dic = [NSMutableDictionarydictionaryWithCapacity:10];
dic[@"appid"] =@"你的APPID";//可以寫死,也可以寫成 從服務器獲取的appid,
dic[@"partnerid"] = responseObject[@"result"][@"mch_id"];//商戶ID
dic[@"prepayid"] = responseObject[@"result"][@"prepay_id"];
dic[@"noncestr"] = responseObject[@"result"][@"nonce_str"];
dic[@"timestamp"] = [NSStringstringWithFormat:@"%ld",(long)[timeSpintValue]];
dic[@"package"] =@"Sign=WXPay";
BZLog(@"=====%@",dic);
NSMutableString*contentString=[NSMutable Stringstring];
NSArray*keys = [dicallKeys];
//按字母順序排序
NSArray*sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(idobj1,idobj2) {
return[obj1 compare:obj2 options:NSNumericSearch];
}];
BZLog(@"+++++%@",sortedArray);
//拼接字符串
for(NSString*categoryIdinsortedArray) {
if(![[dic objectForKey:categoryId] isEqualToString:@""]
&& ![[dic objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[dic objectForKey:categoryId] isEqualToString:@"key"]
)
{
[contentString appendFormat:@"%@=%@&", categoryId, [dicobjectForKey:categoryId]];
}
}
//添加商戶密鑰key字段API密鑰
[contentStringappendFormat:@"key=%@",@"575fe81f69ad0dc054c35f478de8d70e"];
BZLog(@"contentString%@",contentString);
NSString*md5SignStr = [BZNetworkingManage MD5StrWithSignStr:contentString];//md5加密
//調起微信支付
PayReq*req= [[PayReqalloc]init];
req.partnerId= dic[@"partnerid"];//商戶ID
req.prepayId= dic[@"prepayid"];
req.nonceStr= dic[@"noncestr"];
UInt32timeStamp =[dic[@"timestamp"]intValue];
req.timeStamp= timeStamp;
req.package=@"Sign=WXPay";
req.sign= md5SignStr;
[WXApisendReq:req];
存在的坑:
1.可能在調起微信后,只出現了一個確定按鈕的界面的,點擊確定返回回調值是 -2 ,出現這個問題所在的原因是req屬性值錯了,最有可能的原因是sign 錯了
1.從服務器獲取的預支付信息中有簽名 sign ,開始的時候我也直接用這個 sign 賦值給req.sign ,但是出現了調起微信后只出現一個確定按鈕,這就是sign的坑所在,不能用服務器返回的sign傳過去,需要重新簽名。具體參照上面的代碼。