关于一网通支付:
很久没有更新博客、多半是在学习的路上越走越远、也是因为最近手头工作任务比较忙、刚好最近在调研一网通支付、网上的列子也不是很多、如果你去试过你可能会发现
大概都是跑不通的、虽然不难,但是初次集成可能也会遇到很多坑。所以在这里分享一下也会附带demo,方便以后的开发者吧
对于三方的支付,这个大概是最令人讨厌的,先吐槽一下,没什么demo,仅仅有个java demo,也可能考虑客户端开发不需要。但是这确实会带来很多歧义的东西,不多说
先看集成过程
首先一网通支付,并不像银联支付,以及支付宝或者微信那样,配置一下,调用sdk提供的对外方法,一网通支付才去的是web提交表单的形式,对于iOS开发者而言看似简单
却有很多坑,对于iOS客户端来如果想完成有两个选择或者WebView或者WKWebView,到目前为止很多项目大概都是在用WKWebView,两种实现都会在下面提供,WebView
和WkWebView,对比而言从性能上WKWebView是绝对优势的,这里就不去讨论
首先WebView集成:
- (void)testWebView
{
self.webView = [[UIWebView alloc]init];
self.webView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) ;
self.webView.delegate = self;
[self.view addSubview:self.webView];
NSString *payUrl = @"http://121.15.180.66:801/netpayment/BaseHttp.dll?MB_EUserPay";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:payUrl]];
[request setHTTPMethod:@"POST"];
NSString *jsonRequestData = [NSString stringWithFormat:@"jsonRequestData=%@",[self payJson]];
NSData *data = [jsonRequestData dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[self.webView loadRequest:request];
}
payUrl:是一网通提供的测试地址
jsonRequestData:这里要注意,否则很容易出现1123,参数不对的情况,
payJson:这里参考一网通提供的报文,也需要注意下
关于WKWebView集成:
WKWebView:如果正常情况下,按照WebView集成方式就可以了,也不需要分WK或者Web,WKWebView在这方面存在bug,可以去网上搜一下
当然对于通过post提交form网上也有解决方案,一种是通过请求的方式,一种是js的方式,处理这个也是按照js的方式来处理
- (void)testWkWebView
{
self.needLoadJSPOST = YES;
self.wkWebView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.wkWebView.navigationDelegate = self;
self.wkWebView.UIDelegate = self;
NSString *path = [[NSBundle mainBundle] pathForResource:@"JSPOST" ofType:@"html"];
NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[self.wkWebView loadHTMLString:html baseURL:[[NSBundle mainBundle] bundleURL]];
[self.view addSubview:self.wkWebView];
}
// 加载完成的代理方法
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
if (self.needLoad) {
[self postRequestWithJS];
self.needLoad = NO;
}
}
// 调用JS发送POST请求
- (void)postRequestWithJS {
NSString *urlStr = @"http://121.15.180.66:801/netpayment/BaseHttp.dll?MB_EUserPay";
NSString *jscript = [NSString stringWithFormat:@"post('%@', '%@');", urlStr,[self convertToJsonData]];
[self.wkWebView evaluateJavaScript:jscript completionHandler:^(id object, NSError * _Nullable error) {
self.needLoad = NO;
}];
}
对于JSPOST而言就是为了处理这种请求
<html>
<head>
<script>
function post(path, params) {
var method = "post";
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "jsonRequestData");
hiddenField.setAttribute("value", params);
form.appendChild(hiddenField);
document.body.appendChild(form);
form.submit();
}
</script>
</head>
<body>
</body>
特别需要注意的:调用方式 post('URL', {'key': 'value'})
注意jsonRequestData,因此只需要处理json,否则又会让你怀疑人生
以及convertToJsonData:json
以上只是集成后面会继续对完成支付的调用等来进行处理不同的产品处理方式可能不一样,就不做叙述。
当然多半是网上查资料,有很多参考。只是很多都没有跑通,提供一个demo,或许可以让你少走很多弯路。