本人最近公司打算在App中集成微信支付、支付寶支付等支付功能,我果斷跟經(jīng)理說這個(gè)比較容易做,幾個(gè)小時(shí)就可以做完。。。但是天網(wǎng)恢恢啊,這件事情教會(huì)我了一個(gè)道理,做人莫裝逼,裝逼招雷劈!好了,廢話不多說,直接上干貨!
今天這個(gè)文章就只講微信支付吧,支付寶的有空再寫點(diǎn)自己的使用心得~!
第一:你需要有微信開發(fā)平臺(tái)的開發(fā)者賬號(hào),(網(wǎng)址https://open.weixin.qq.com/,或者自行百度“微信open”,支付寶支付同理,下同),并將你要集成的應(yīng)用在你的開發(fā)者賬號(hào)中注冊(cè),并獲取支付權(quán)限(一般這步不需要程序員考慮,都是客戶自己獲取的,你只需要知道,沒有支付權(quán)限的應(yīng)用,不可以集成支付)。
第二:注冊(cè)完你的應(yīng)用,通過審核之后,你會(huì)獲得開放平臺(tái)給你發(fā)放屬于這個(gè)應(yīng)用的AppID和AppSecret
第三:在開發(fā)平臺(tái)的資源中心(或者叫文檔中心,SDK中心什么的),下載IOS的SDK(文檔也可以下載下來方便查閱)。我這次的Demo是之前集成過ShareSDK的分享和第三方登錄,所以直接用的ShareSDK中的微信SDK。
第四:將下載好的SDK拷貝到工程文件夾中,然后再工程中AddFilesTo“你的工程”,
第五:這是最重要的一步,就是導(dǎo)入SDK后可能會(huì)有編譯報(bào)錯(cuò),這個(gè)問題主要是因?yàn)閷?dǎo)入時(shí)缺少了各個(gè)庫文件,其中報(bào)錯(cuò)有幾種類型的報(bào)錯(cuò)
(1)"OBJC_CLASS$_CTTelephonyNetworkInfo" 報(bào)錯(cuò)
這個(gè)報(bào)錯(cuò)你只需在圖下第5步的時(shí)候添加一個(gè)『CoreTelephony.framework』的庫文件就OK
(2)"Undefined symbols for architecture armv7:"報(bào)錯(cuò)
這個(gè)報(bào)錯(cuò)你也只需要重復(fù)第一步的操作,添加一個(gè)『libz.tbd』跟一個(gè)『libc++.tbd』的庫文件
再加入一個(gè)『SystemConfiguration.framework』跟『libsqlite3.tbd』庫文件,基本上95%是沒有問題的了~!
最后你導(dǎo)入微信的庫文件總共為四個(gè)如圖
第六:在配置文件中的 URL Types 將你申請(qǐng)到的微信 URL Schemes填入其中
第七:代碼部分
在AppDelegate中導(dǎo)入:
(1)#import "WXApi.h"
(2)#import "WXApiObject.h"
(3)遵守WXApiDelegate
(4)在application:didFinishLaunchingWithOptions方法里面寫入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[[SendMsgToWeChatViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
} else {
self.viewController = [[[SendMsgToWeChatViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
//向微信注冊(cè)
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
return YES;
}
(5)跳轉(zhuǎn)進(jìn)入微信
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
// 跳轉(zhuǎn)到URL schema中配置的地址
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
(6)微信支付
#pragma mark - 微信支付
- (void)WeiXinPay{
// 判斷 用戶是否安裝微信
if([WXApi isWXAppInstalled])
{
// 調(diào)起微信支付
PayReq* wxreq = [[PayReq alloc] init];
wxreq.openID = @"WXAppId";
wxreq.partnerId = @"partnerId";
wxreq.prepayId = @"prepayId";
wxreq.nonceStr = @"nonceStr";
wxreq.timeStamp = 11; //timeStamp
wxreq.package = @"package";
wxreq.sign = @"sign";
[WXApi sendReq:wxreq];
}
else
{
// 您未安裝微信
}
}
貌似微信從1.5版本其就支持沒有安裝微信用戶也可以調(diào)用微信具體調(diào)用方法是:
+ (BOOL)sendAuthReq:(SendAuthReq)req viewController:(UIViewController)viewController delegate:(id<WXApiDelegate>)delegate;
但是作者本人還未實(shí)驗(yàn)過,等這幾天公司的事情的支付做的差不多了,我到時(shí)再補(bǔ)上代碼給大家~!
(7)支付后回調(diào)方法
- (void)onResp:(BaseResp*)resp
{
// 判斷是否是媒體消息
if([resp isKindOfClass:[SendMessageToWXResp class]])
{
// 對(duì)錯(cuò)誤碼進(jìn)行判斷 再做相對(duì)應(yīng)的操作
}
if([resp isKindOfClass:[PayResp class]]){
// 支付返回結(jié)果,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
switch (resp.errCode) {
case WXSuccess:{
// 支付結(jié)果:成功!
break;
}
default:{
// 支付結(jié)果:失敗!
break;
}
}
}
}