关于一网通支付
關于一網通支付:
很久沒有更新博客、多半是在學習的路上越走越遠、也是因為最近手頭工作任務比較忙、剛好最近在調研一網通支付、網上的列子也不是很多、如果你去試過你可能會發現
大概都是跑不通的、雖然不難,但是初次集成可能也會遇到很多坑。所以在這里分享一下也會附帶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,或許可以讓你少走很多彎路。
總結
- 上一篇: 淘宝十年资深架构师吐血总结淘宝的数据库架
- 下一篇: 小菊花宝宝课堂开课了,教你认识各种形状—