iOS开发-集成一网通支付

这两天一直在搞招行的一网通支付,网上的相关资料少之又少。其官方文档也让人只想呵呵。其支付流程:
1)向后台服务器请求支付URL(这里后台返回的是一个表单,通过loadHTMLString方法加载)。
2)使用UIWebView加载后台服务器请求到的URL,然后在webview代理方法

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

拦截一网通支付键盘,从而完成支付。
3)当支付完成,拦截”支付完成的URL”,从而在UI上作出支付成功提示。
其实现支付的核心代码:

#import "KQWebViewController.h"
#import "NJKWebViewProgress.h"
#import "NJKWebViewProgressView.h"
#import "KQJSModel.h"
#import "KQPayTypeViewController.h"


@interface KQWebViewController ()<NJKWebViewProgressDelegate,UIWebViewDelegate,KQJSModelDelegate,UIGestureRecognizerDelegate>
@property (nonatomic, strong) NJKWebViewProgressView *progressView;
@property (nonatomic, strong) NJKWebViewProgress *progressProxy;
@end

@implementation KQWebViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.automaticallyAdjustsScrollViewInsets = NO;
    [self setupWebView];
    [self setupWebViewUrl];
    [self setupLoadUrlRequst];
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.navigationController.navigationBar addSubview:self.progressView];
    self.progressView.hidden  = YES;


}
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.progressView removeFromSuperview];
    [[CMBWebKeyboard shareInstance] hideKeyboard];

}
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    [[CMBWebKeyboard shareInstance] hideKeyboard];


}
- (void)setupWebView
{
    self.webView = [[UIWebView alloc] init];
    self.webView.x = 0;
    self.webView.y = KQNavBarHeight;
    self.webView.height = KQScreenH - KQNavBarHeight;
    self.webView.width = KQScreenW;
    self.webView.delegate = self;
    self.webView.scalesPageToFit = YES;
    self.webView.scrollView.showsVerticalScrollIndicator = NO;
 self.webView.scrollView.showsHorizontalScrollIndicator = NO;
    [self.view addSubview:self.webView];
}
//设置url,从后台拿到要加载的html内容
- (void)setupWebViewUrl
{

}
//加载网页
- (void)setupLoadUrlRequst
{

    if (self.url) {

        //加载进度条
        [self setupProgressView];
        //加载网页
        NSURL *url = [NSURL URLWithString:self.url];
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
        [self.webView loadRequest:urlRequest];

    }else if(self.htmlContent){//加载本地网页
        //加载进度条
        [self setupProgressView];
        [self.webView loadHTMLString:self.htmlContent baseURL:nil];
    }else{
        NSLog(@"---网页加载失败---");
        UIView *failWebView = [self loadDatalabelText:@"网页加失败,点击重新加载"];
        failWebView.y = KQNavBarHeight + KQCommonPading;
        [self.view addSubview:failWebView];

        failWebView.userInteractionEnabled = YES;
        UITapGestureRecognizer *labelGuideTapG = [[UITapGestureRecognizer alloc] init];
        [labelGuideTapG addTarget:self action:@selector(failWebViewClick)];
        [failWebView addGestureRecognizer:labelGuideTapG];
    }
}

- (void)failWebViewClick
{
    [self.webView reload];
}

//进度条
- (void)setupProgressView
{
    self.progressProxy = [[NJKWebViewProgress alloc] init];
    self.webView.delegate = self.progressProxy;
    self.progressProxy.webViewProxyDelegate = self;
    self.progressProxy.progressDelegate = self;

    CGRect navBounds = self.navigationController.navigationBar.bounds;
    CGRect barFrame = CGRectMake(0, navBounds.size.height - 2, navBounds.size.width, 2);
    self.progressView = [[NJKWebViewProgressView alloc] initWithFrame:barFrame];
    self.progressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;


}
#pragma mark -- WebViewDelegate

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"absoluteString---%@",request.URL.absoluteString);
    //支付完成,发一个通知
    if ([[request URL].absoluteString containsString:@"app/handle/cmbback"]) {
        [self dismissViewControllerAnimated:YES completion:nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:CMBPaySuccessNotfication object:nil];

    }
    //拦截招行的支付键盘,发起支付
    if ([request.URL.host isCaseInsensitiveEqualToString:@"cmbls"]) {
        CMBWebKeyboard *secKeyboard = [CMBWebKeyboard shareInstance];
        [secKeyboard showKeyboardWithRequest:request];
        secKeyboard.webView = webView;

        UITapGestureRecognizer* myTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
        [self.view addGestureRecognizer:myTap]; //这个可以加到任何控件上,比如你只想响应WebView,我正好填满整个屏幕
        myTap.delegate = self;
        myTap.cancelsTouchesInView = NO;
        return NO;
    }
    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [[CMBWebKeyboard shareInstance] hideKeyboard];
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法
    //首先创建我们新建类的对象,将他赋值给js的对象

    KQJSModel *testJO=[[KQJSModel alloc] init];
    testJO.delegate = self;
    context[@"IOSApp"]=testJO;

}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{

}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    NSLog(@"---网页加载失败---");
    UIView *failWebView = [self loadDatalabelText:@"网页加失败,点击重新加载"];
    failWebView.y = KQNavBarHeight + KQCommonPading;
    [self.view addSubview:failWebView];

    failWebView.userInteractionEnabled = YES;
    UITapGestureRecognizer *labelGuideTapG = [[UITapGestureRecognizer alloc] init];
    [labelGuideTapG addTarget:self action:@selector(failWebViewClick)];
    [failWebView addGestureRecognizer:labelGuideTapG];
}

-(void)jSModelGoToPayVC:(int)amount action:(NSString *)action teamid:(NSString *)teamid
{

    KQPayTypeViewController *payVC = [[KQPayTypeViewController alloc] init];
    payVC.money = [NSString stringWithFormat:@"%d",amount];
    payVC.action = action;
    payVC.teamid = teamid;

    KQCommonNavController *nav = [[KQCommonNavController alloc] initWithRootViewController:payVC];
    [self presentViewController:nav animated:YES completion:nil];

}
#pragma mark -- NJKWebViewProgressDelegate
- (void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress
{
    self.progressView.hidden  = NO;
    [self.progressView setProgress:progress animated:YES];
}

#pragma mark - dealloc
- (void)dealloc
{
    [[CMBWebKeyboard shareInstance] hideKeyboard];
    [[NSNotificationCenter defaultCenter] removeObserver:self];

}

最后贴出支付过程的效果图:
第一步:选择支付方式
第二步:支付
第三步:支付完成
搞定,招行一网通支付还是有不少坑呢,毕竟不能和银联、建行有些差距…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值