美文网首页Mac开发
iOS 接入建行龙支付说明

iOS 接入建行龙支付说明

作者: summer_shi | 来源:发表于2019-11-29 10:56 被阅读0次

    需求

    近期因为公司业务需求,需要接入建行支付,包含建行龙支付和建行分期,因为分期只需要接入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>
    
    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<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中做相应的处理,才能知道支付结果

    相关文章

      网友评论

        本文标题:iOS 接入建行龙支付说明

        本文链接:https://www.haomeiwen.com/subject/jwvwwctx.html