iOS 接入建行龙支付说明

需求

近期因为公司业务需求,需要接入建行支付,包含建行龙支付和建行分期,因为分期只需要接入H5即可,龙支付需要H5和APP之间切换,故此将接入步骤详细记录下来,方便他人再次接入的时候,少入坑。(真的要吐槽下建行的文档,不够详细)。

配置信息

1.首先需要在plist中进行scheme白名单配置,如下图:


image

2.plist 的 NSAppTransportSecurity 字段添加相应的 NSExceptionDomains:

    NSExceptionDomains
    
    ibsbjstar.ccb.com.cn
    
         NSExceptionAllowsInsecureHTTPLoads
         
         NSExceptionRequiresForwardSecrecy
         
        NSIncludesSubdomains
        
    
 
  1. 在URL Types 里面配置回调scheme,如下图中的此处的值很重要,我在集成的时候,就是因为这个值,导致整个支付流程走不下去,在支付中,安装了建行的app,建行支付页面的时候,也跳转到了建行APP中的支付页面,当我点击右上角返回按钮或者支付完成后,点击完成时,因为下图中的url schemes没有配置好,导致点击建行相关app回调按钮时,建行的app直接挂了。
image
image

image

上面两张图是建行给的文档信息,后来进过反复试验,发现第三张图中的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 *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中做相应的处理,才能知道支付结果

你可能感兴趣的:(iOS 接入建行龙支付说明)