先來幾個微信官方鏈接灶似,接入指南
1奶赔、1.8.6之后微信使用了Universal Links方式跳轉(zhuǎn)碾阁,這篇文章是1.8.6的接入指引https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html
2、sdk下載鏈接 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
3予权、IOS開發(fā)要點說明 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
說幾個重點:
1昂勉、下載sdk到工程中,配置工程扫腺,SDK必要的dylib或者framework文件岗照,確保在Link Binary With Libraries里加入以下Library
SystemConfiguration.framework,
libz.dylib,
libsqlite3.0.dylib,
libc++.dylib
CoreTelephony.frame
上面這些在官方的demo配置里有,你可以照著配一下,運行成功就行了
2谴返、按照接入指引進(jìn)行接入煞肾,在appdelegate里注冊appid和Universal Links,Universal Links必須為一個https的鏈接,如果你想看微信支付的log日志嗓袱,可以在注冊之前籍救,輸入如下代碼
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString * _Nonnull log) {
NSLog(@"WX-------%@", log);
}];
這個可以告知你哪個步驟有問題
3、在你需要的類里面調(diào)起微信渠抹,步驟一般是這樣的
①客戶端請求server的預(yù)支付訂單接口蝙昙,server會返回預(yù)支付的信息
②返回成功之后,用下面的結(jié)構(gòu)調(diào)起微信
//調(diào)起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = weakSelf.payModel.wxPrePayItem.partnerid;
req.prepayId = weakSelf.payModel.wxPrePayItem.prepayid;
req.nonceStr = weakSelf.payModel.wxPrePayItem.noncestr;
UInt32 timeStamp =[weakSelf.payModel.wxPrePayItem.timestamp intValue];
req.timeStamp= timeStamp;
req.package = weakSelf.payModel.wxPrePayItem.package;
req.sign = weakSelf.payModel.wxPrePayItem.paySign;
[WXApi sendReq:req completion:nil];
③ [WXApi sendReq:req completion:nil];這句話就是調(diào)起微信的意思梧却,之后你需要采集微信的回調(diào)奇颠,這個地方需要設(shè)置一個單例類,因為微信返回拉起我們的應(yīng)用是在appdelegate里面的這個方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options: (NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
if ([url.host isEqualToString:@"pay"]) {
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
return YES;
}
這個方法需要傳一個delegate放航,這個delegate就是回調(diào)onResp:(BaseResp *)resp的地方烈拒,而這個地方,需要把這個方法拋出去到你使用的類里广鳍,所以delegate寫這個單例荆几,單例里需要寫兩個回調(diào)方法,拋一個代理赊时,
+(instancetype)sharedManager {
static dispatch_once_t onceToken;
static WXApiManager *instance;
dispatch_once(&onceToken, ^{
instance = [[WXApiManager alloc] init];
});
return instance;
}
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[PayResp class]]){
//支付返回結(jié)果吨铸,實際支付結(jié)果需要去微信服務(wù)器端查詢
NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付結(jié)果"];
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付結(jié)果:成功!";
NSLog(@"支付成功-PaySuccess祖秒,retcode = %d", resp.errCode);
if ([self.delegate respondsToSelector:@selector(paySuccessWithResp:)]) {
[self.delegate paySuccessWithResp:resp];
}
break;
default:
strMsg = [NSString stringWithFormat:@"支付結(jié)果:失數ā!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"錯誤竭缝,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
if ([self.delegate respondsToSelector:@selector(payErrorWithResp:)]) {
[self.delegate payErrorWithResp:resp];
}
break;
}
}else {
}
}
- (void)onReq:(BaseReq *)req {
}
④在你調(diào)起微信那個類里面房维,寫
[WXApiManager sharedManager].delegate = self;
之后就是把那兩個delegate拋出去就可以了。
記住使用delegate的時候統(tǒng)一到WXApiManager里做處理就行抬纸,系統(tǒng)回調(diào)給微信的代理入口都是 [WXApiManager sharedManager]就OK
重點:1咙俩、在info.plist里面配置兩個微信的跳轉(zhuǎn)白名單,在URLType里配置你的appid
2松却、delegate的唯一性,不要給微信的delegate到處設(shè)置“self”溅话,這樣回調(diào)回來就找不到代理方法了晓锻,從而就找不到要回調(diào)的位置