这两天一直在搞招行的一网通支付,网上的相关资料少之又少。其官方文档也让人只想呵呵。其支付流程:
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];
}
最后贴出支付过程的效果图:
搞定,招行一网通支付还是有不少坑呢,毕竟不能和银联、建行有些差距…