需求
近期因为公司业务需求,需要接入建行支付,包含建行龙支付和建行分期,因为分期只需要接入H5即可,龙支付需要H5和APP之间切换,故此将接入步骤详细记录下来,方便他人再次接入的时候,少入坑。(真的要吐槽下建行的文档,不够详细)。
配置信息
1.首先需要在plist中进行scheme白名单配置,如下图:
image
2.plist 的 NSAppTransportSecurity 字段添加相应的 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 里面配置回调scheme,如下图中的此处的值很重要,我在集成的时候,就是因为这个值,导致整个支付流程走不下去,在支付中,安装了建行的app,建行支付页面的时候,也跳转到了建行APP中的支付页面,当我点击右上角返回按钮或者支付完成后,点击完成时,因为下图中的url schemes没有配置好,导致点击建行相关app回调按钮时,建行的app直接挂了。
上面两张图是建行给的文档信息,后来进过反复试验,发现第三张图中的schemes,是第一张或者第二张图中 该字段 THIRDAPPINFO 所对应的值,后来将改值填入,需要说明的是,这个值生成有有规则的,具体需要和后端人员商讨。这个值真的很重要。
发起支付
1.在发起支付时,应该需要和后端调用接口,然后获取去相关的url或者参数.
- (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回调
#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中做相应的处理,才能知道支付结果
网友评论