需求
近期因?yàn)楣緲I(yè)務(wù)需求,需要接入建行支付,包含建行龍支付和建行分期,因?yàn)榉制谥恍枰尤際5即可,龍支付需要H5和APP之間切換,故此將接入步驟詳細(xì)記錄下來(lái),方便他人再次接入的時(shí)候,少入坑。(真的要吐槽下建行的文檔,不夠詳細(xì))。
配置信息
1.首先需要在plist中進(jìn)行scheme白名單配置,如下圖:
image
2.plist 的 NSAppTransportSecurity 字段添加相應(yīng)的 NSExceptionDomains:
<key>NSExceptionDomains</key>
<dict>
<key>ibsbjstar.ccb.com.cn</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
- 在URL Types 里面配置回調(diào)scheme,如下圖中的此處的值很重要,我在集成的時(shí)候,就是因?yàn)檫@個(gè)值,導(dǎo)致整個(gè)支付流程走不下去,在支付中,安裝了建行的app,建行支付頁(yè)面的時(shí)候,也跳轉(zhuǎn)到了建行APP中的支付頁(yè)面,當(dāng)我點(diǎn)擊右上角返回按鈕或者支付完成后,點(diǎn)擊完成時(shí),因?yàn)橄聢D中的url schemes沒(méi)有配置好,導(dǎo)致點(diǎn)擊建行相關(guān)app回調(diào)按鈕時(shí),建行的app直接掛了。
image
image
image
上面兩張圖是建行給的文檔信息,后來(lái)進(jìn)過(guò)反復(fù)試驗(yàn),發(fā)現(xiàn)第三張圖中的schemes,是第一張或者第二張圖中 該字段 THIRDAPPINFO 所對(duì)應(yīng)的值,后來(lái)將改值填入,需要說(shuō)明的是,這個(gè)值生成有有規(guī)則的,具體需要和后端人員商討。這個(gè)值真的很重要。
發(fā)起支付
1.在發(fā)起支付時(shí),應(yīng)該需要和后端調(diào)用接口,然后獲取去相關(guān)的url或者參數(shù).
- (void)loadBBCWithUrlStr:(NSString*)urlStr {
if (urlStr.length > 0) {
dispatch_async(dispatch_get_main_queue(), ^{
NSURLRequest *webRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]
cachePolicy:NSURLRequestReturnCacheDataElseLoad
timeoutInterval:30];
[self.webView loadRequest:webRequest];
});
}
}
2.處理WebView回調(diào)
#pragma mark - UIWebViewDelegate
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
self.currentLoadUrl = request.URL.absoluteString;
NSString *currentLoadUrl = [self.currentLoadUrl uppercaseString];
NSURLComponents *components = [[NSURLComponents alloc] initWithString:self.currentLoadUrl];
NSArray<NSURLQueryItem *> *items = components.queryItems;
__block BOOL paySuccess = NO;
[items enumerateObjectsUsingBlock:^(NSURLQueryItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj.name isEqualToString:@"SUCCESS"]) {
if ([obj.value isEqualToString:@"Y"]) {
paySuccess = YES;
*stop = YES;
}
}
}];
if (paySuccess) { //建行分期成功攔截
if (self.successBlock) {
self.successBlock(nil);
}
[self.navigationController popViewControllerAnimated:YES];
return YES;
}
NSString *urlScheme = [[request URL] scheme];
if ([urlScheme isEqualToString:@"mbspay"]) {
if ([[UIApplication sharedApplication] canOpenURL:[request URL]]) {
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:request.URL options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:request.URL];
}
return NO;
}
}
return YES;
}
后記
理論上建行app取消支付和支付完成后,還是需要在AppDelegate中做相應(yīng)的處理,才能知道支付結(jié)果