在URL Scheme中設置php
SystemConfiguration.frameworkios
Security.framework算法
CoreTelephony.frameworksql
Foundation.frameworkjson
UIKit.frameworkapi
libsqlite3.0.tbd服務器
libz.tbd微信
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];app
wechat,wexinide
從服務端獲取支付須要的參數
PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"10000100";
request.prepayId= @"1101000000140415649af9fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= @"1397527777";
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq:request];
-(void)onResp:(BaseResp*)resp{ if ([respisKindOfClass:[PayRespclass]]){ PayResp*response=(PayResp*)resp; switch(response.errCode){ caseWXSuccess: //服務器端查詢支付通知或查詢API返回的結果再提示成功 NSlog(@"支付成功"); break; default: NSlog(@"支付失敗,retcode=%d",resp.errCode); break; } } }
@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios"
返回的數據格式以下
{
"appid":"wxb4ba3c02aa476ea1",
"partnerid":"1305176001",
"package":"Sign=WXPay",
"noncestr":"60adcb1dcd5d0e8fe903822313810988",
"timestamp":1473724660,
"prepayid":"wx20160913075740396ab1584b0080984714",
"sign":"483F092E7384602E8E7F7ABA3E9F9FC1"
}
- (IBAction)payWXWithMonicSever:(UIButton *)sender { //============================================================ // V3&V4支付流程實現 // 注意:參數配置請查看服務器端Demo // 更新時間:2015年11月20日 //============================================================ NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios"; //解析服務端返回json數據 NSError *error; //加載一個NSURL對象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; //將請求的url數據放到NSData對象中 NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if ( response != nil) { NSMutableDictionary *dict = NULL; //IOS5自帶解析類NSJSONSerialization從response中解析出數據放到字典中 dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; NSLog(@"url:%@",urlString); if(dict != nil){ NSMutableString *retcode = [dict objectForKey:@"retcode"]; if (retcode.intValue == 0){ NSMutableString *stamp = [dict objectForKey:@"timestamp"]; //調起微信支付 PayReq* req = [[PayReq alloc] init]; 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]; //日誌輸出 NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign ); return ; }else{ NSLog(@"%@",[dict objectForKey:@"retmsg"]); return ; } }else{ NSLog(@"%@",@"服務器返回錯誤,未獲取到json對象"); return ; } }else{ NSLog(@"%@",@"服務器返回錯誤"); return ; } }
預支付訂單接口通常由服務器調用,app本地測試時也能夠使用
驗證簽名是否正確能夠用微信提供的這個網頁,若是本地的簽名結果和網頁上一致那就完成了。
http://mch.weixin.qq.com/wiki/tools/signverify/
本地調試能夠使用微信sdk中的payRequsestHandler 類進行,下面的步驟通常不須要進行。協助後臺開發調試纔會使用。至關於從生成預支付訂單到調起微信支付sdk的步驟所有在客戶端完成。
//建立支付簽名對象 payRequsestHandler *reqHandler = [payRequsestHandler alloc]; //初始化支付簽名對象 [reqHandler init:WX_APP_ID mch_id:WX_MCHID]; //設置密鑰 [reqHandler setKey:WX_PARTNER_ID]; //價格*100 NSString *priceString=@"1"; NSString *orderName=@"測試標題"; NSString *identifierForVendor = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; //獲取到實際調起微信支付的參數後,在app端調起支付 NSMutableDictionary *dict = [reqHandler getPrepayWithOrderName:orderName price:priceString device:identifierForVendor]; NSLog(@"dict%@",dict); //在payRequestHandle.mm文件裏調用該方法 if(dict == nil){ //錯誤提示 NSString *debug = [reqHandler getDebugifo]; NSLog(@"debug %@",debug); NSLog(@"%@\n\n",debug); }else{ NSLog(@"%@\n\n",[reqHandler getDebugifo]); //[self alert:@"確認" msg:@"下單成功,點擊OK後調起支付!"]; NSMutableString *stamp = [dict objectForKey:@"timestamp"]; //調起微信支付 PayReq* req = [[PayReq alloc] init]; req.openID = [dict objectForKey:@"appid"]; 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]; NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign ); }
通常發現問題就是支付失敗,能夠逐步檢查
1,是否獲取到預支付id,
若是獲取成功說明微信支付參數配置正確,第一步簽名算法正確,獲取失敗則檢查這些內容
2,是否付款成功
失敗,檢查第二步簽名和調起微信sdk的參數
微信支付的金額是以分爲單位,支付0.01 元須要在訂單中傳遞price 爲1。
業務介紹
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
詳細開發步驟
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
微信支付SDK和demo下載地址
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
預支付接口文檔
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
http://www.jianshu.com/p/94dcc220b2aa