iOS開發(fā)微信支付的方法
本文實(shí)例為大家分享了iOS開發(fā)微信支付的具體代碼,供大家參考,具體內(nèi)容如下
首先我們到微信開放平臺,下載相應(yīng)的SDK。微信的官方文檔感覺說的很簡單,沒有支付寶那么詳細(xì),在這里說下集成SDK到我們的工程中。
下載好demol后(最新版本SDKSample_v2.0.2_V3pay),看到有個(gè)SDKExport的文件;
你可以直接將這個(gè)文件夾添加到你的工程中,或者你自己新建一個(gè)文件夾,將里面那三個(gè)文件粘貼到你新建的文件夾中,并添加到你的工程中;
接下來就是添加相應(yīng)地庫文件;
我們看到demol中有個(gè)WXApiManager.h和WXApiManager.m文件,因?yàn)樗锩鏁玫?所以這里我們直接將demol中的這兩個(gè)文件也拖進(jìn)我們工程中;
庫文件添加好之后,就是實(shí)現(xiàn)我們的微信支付功能;
點(diǎn)擊支付的button,完成支付;
引入頭文件:
#import "ViewController.h" #import "WXApiObject.h" #import "WXApi.h" - (void)viewDidLoad { ? ? [super viewDidLoad]; ? ? UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom]; ? ? btn.frame =CGRectMake(100, 100, 100, 50); ? ? [btn setTitle:@"點(diǎn)擊支付" forState:UIControlStateNormal]; ? ? btn.backgroundColor = [UIColor magentaColor]; ? ? [btn addTarget:self action:@selector(weixinPay) forControlEvents:UIControlEventTouchUpInside]; ? ? [self.view addSubview:btn]; } //在這里我們要判斷用戶是否安裝微信,如果未安裝是不能夠支付,因?yàn)槲⑿挪恢С志W(wǎng)頁支付,不像支付寶那樣,如果用戶未安裝支付寶,它會自動跳轉(zhuǎn)網(wǎng)頁支付,如果安裝,則會跳轉(zhuǎn)到支付寶客戶端進(jìn)行支付;微信則不可以,所以要判斷下; - (void)weixinPay { //判斷用戶是否安裝微信 ? if ([WXApi isWXAppInstalled]) { ? ? ? ? ?NSString *res = [self doClickZhiFu]; ? ? ? ? ?if( ![@"" isEqual:res] ){ ? ? ? ? UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失敗" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; ? ? ? ? [alter show]; ? ? ? ? ?} ? ? ? }else{ ? ? ? //未安裝微信給出提示信息 ? ? ? ? ?MBProgressHUD * hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; ? ? ? ? ? ? hud.mode = MBProgressHUDModeText; ? ? ? ? ? ? hud.labelText = @"您未安裝微信,請選擇其他方式支付!"; ? ? ? ? ? ? hud.labelFont = [UIFont systemFontOfSize:13]; ? ? ? ? ? ? hud.removeFromSuperViewOnHide = YES; ? ? ? ? ? ? hud.color = [UIColor grayColor]; ? ? ? ? ? ? hud.minSize = CGSizeMake(300, 100); ? ? ? ? ? ? [hud hide:YES afterDelay:2]; ? ? ? ?} } - (NSString *)doClickZhiFu { ? ? //============================================================ ? ? // V3&V4支付流程實(shí)現(xiàn) ? ? // 注意:參數(shù)配置請查看服務(wù)器端Demo ? ? // 更新時(shí)間:2015年11月20日 ? ? //============================================================ ? ? //在那里使用的url是微信里面的,在實(shí)際開發(fā)中,換成我們自己的url即可,讓后臺返回的參數(shù)就按照微信里面的來,這樣我們下邊就不用改什么了,只換個(gè)url即可(需要跟后臺商定,一般都是需要傳參數(shù)的); ? ? NSString *urlString ? = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios"; ? ? //解析服務(wù)端返回json數(shù)據(jù) ? ? NSError *error; ? ? //加載一個(gè)NSURL對象 ? ? NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; ? ? //將請求的url數(shù)據(jù)放到NSData對象中 ? ? NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; ? ? if ( response != nil) { ? ? ? ? NSMutableDictionary *dict = NULL; ? ? ? ? //IOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中 ? ? ? ? dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; ? ? ? ? if(dict != nil){ ? ? ? ? ? ? NSMutableString *retcode = [dict objectForKey:@"retcode"]; ? ? ? ? ? ? if (retcode.intValue == 0){ ? ? ? ? ? ? ? ? NSMutableString *stamp ?= [dict objectForKey:@"timestamp"]; ? ? ? ? ? ? ? ? //這里的數(shù)據(jù)就是從上面那個(gè)url請求之后獲取到消息結(jié)構(gòu)體里面的內(nèi)容 ? ? ? ? ? ? ? ? //調(diào)起微信支付 ? ? ? ? ? ? ? ? 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"]; ? ? ? ? ? ? ? ? //最關(guān)鍵的就是這里發(fā)送請求到微信, ? ? ? ? ? ? ? ? [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{ ? ? ? ? ? ? ? ? return [dict objectForKey:@"retmsg"]; ? ? ? ? ? ? } ? ? ? ? }else{ ? ? ? ? ? ? return @"服務(wù)器返回錯(cuò)誤,未獲取到j(luò)son對象"; ? ? ? ? } ? ? }else{ ? ? ? ? return @"服務(wù)器返回錯(cuò)誤"; ? ? } }
在AppDelegate.h操作,引入頭文件
#import "AppDelegate.h" #import "WXApi.h" #import "WXApiManager.h" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ? ? // Override point for customization after application launch. ? ? //向微信注冊wxd930ea5d5a258f4f,在微信平臺注冊后獲取的 ? ? [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"]; ? ? return YES; } //微信支付回調(diào)的結(jié)果,在這里可以做你想要的操作 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //寫了一個(gè)單例來處理微信支付結(jié)果的回調(diào),處理在WXApiManager文件中操作 ? ? return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; }
在WXApiManager.h文件中會有個(gè)微信支付的支付結(jié)果回調(diào),在這里可以處理你要的業(yè)務(wù)邏輯操作,如跳轉(zhuǎn)到指定頁面等等,方法可以使用通知,參照iOS 支付寶使用文章中的支付結(jié)果的處理;
#pragma mark - WXApiDelegate - (void)onResp:(BaseResp *)resp { ? ? if ([resp isKindOfClass:[SendMessageToWXResp class]]) { ? ? ? ? if (_delegate ? ? ? ? ? ? && [_delegate respondsToSelector:@selector(managerDidRecvMessageResponse:)]) { ? ? ? ? ? ? SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp; ? ? ? ? ? ? [_delegate managerDidRecvMessageResponse:messageResp]; ? ? ? ? } ? ? } else if ([resp isKindOfClass:[SendAuthResp class]]) { ? ? ? ? if (_delegate ? ? ? ? ? ? && [_delegate respondsToSelector:@selector(managerDidRecvAuthResponse:)]) { ? ? ? ? ? ? SendAuthResp *authResp = (SendAuthResp *)resp; ? ? ? ? ? ? [_delegate managerDidRecvAuthResponse:authResp]; ? ? ? ? } ? ? } else if ([resp isKindOfClass:[AddCardToWXCardPackageResp class]]) { ? ? ? ? if (_delegate ? ? ? ? ? ? && [_delegate respondsToSelector:@selector(managerDidRecvAddCardResponse:)]) { ? ? ? ? ? ? AddCardToWXCardPackageResp *addCardResp = (AddCardToWXCardPackageResp *)resp; ? ? ? ? ? ? [_delegate managerDidRecvAddCardResponse:addCardResp]; ? ? ? ? } ? ? }else if([resp isKindOfClass:[PayResp class]]){ ? ? ? ? //支付返回結(jié)果,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢 ? ? ? ? NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付結(jié)果"]; ? ? ? ? switch (resp.errCode) { ? ? ? ? ? ? case WXSuccess:{ ? ? ? ? ? ? ? ? strMsg = @"支付結(jié)果:成功!"; ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? ? ? default:{ ? ? ? ? ? ? ? ? strMsg = [NSString stringWithFormat:@"支付結(jié)果:失敗!retcode = %d, retstr = %@", resp.errCode,resp.errStr]; ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil]; ? ? ? ? [alert show]; ? ? } }
以下為可能出現(xiàn)錯(cuò)誤:
有時(shí)候你會發(fā)現(xiàn)在測試的時(shí)候,點(diǎn)擊微信支付,調(diào)到微信界面時(shí)只有一個(gè)確定按鈕,出現(xiàn)這樣的情況大多數(shù)都是我們簽名錯(cuò)誤,才導(dǎo)致的;
1.檢查接口傳遞的字段是否都正確;
2.package = @”Sign=WXPay” 注意服務(wù)器傳來的是不是一樣的,不是就會出現(xiàn)錯(cuò)誤;
3.如果你app同時(shí)使用了友盟分享(含微信分享)和微信支付。如果你沒有處理好這個(gè)兩個(gè)SDK register的順序,就會出現(xiàn)這種情況。
解決辦法:改變兩者的register步驟。先調(diào)用友盟,然后調(diào)用微信。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IOS中NSPredicate和NSRegularExpression校驗(yàn)正則表達(dá)式區(qū)別
本文文章通過實(shí)例代碼給大家講述了在IOS開發(fā)中NSPredicate和NSRegularExpression校驗(yàn)正則表達(dá)式區(qū)別,需要的朋友趕快學(xué)習(xí)下吧。2018-01-01解析iOS應(yīng)用開發(fā)中對設(shè)計(jì)模式中的抽象工廠模式的實(shí)現(xiàn)
這篇文章主要介紹了解析iOS應(yīng)用開發(fā)中對設(shè)計(jì)模式中的抽象工廠模式的實(shí)現(xiàn),示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-03-03iOS開發(fā)教程之登錄與訪客的邏輯實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之登錄與訪客的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04iOS開發(fā)Masonry與Frame布局差異示例詳解
這篇文章主要為大家介紹了iOS開發(fā)Masonry與Frame布局差異示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11