根据需求,公司的项目的微信支付和支付宝支付由原生的sdk转为h5支付,做这个过程中遇到了一些问题,做一个简单的记录。
本文主要讲以下几点:
1.在app内调用h5的方法,用于传值已经做一些操作
2.支付过程中使用手机自带的支付宝APP以及微信APP进行支付,不使用网页
1.在app内调用h5的方法
一般是在网页加载完毕后才调用h5的方法,如果在h5页面未加载完毕调用,那样的话会调不了。WKWebView调用h5的方法如下:
h5的方法为:
function payResult(str){
if(str == ‘ture’){
alert(‘登录’);
}
}
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
[SVProgressHUDdismiss];
NSString * jsStr [NSStringstringWithFormat:@"payResult('%@')",@"true"];
[self.webViewevaluateJavaScript:jsStrcompletionHandler:^(id_Nullable result, NSError * _Nullable error) {
NSLog(@"==%@----%@",result, error);
}];
}
亲测有效。
2.由于不能集成微信和支付宝的sdk,但是像支付宝的网页支付步骤又太麻烦,所以希望能调用手机原生的支付宝APP和微信APP,(微信app只能调用客户端,没有网页支付)。实现的方式是拦截请求,拦截到支付请求时直接打开相应的APP。
代码如下:
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
NSLog(@"%@",navigationAction.request.URL.absoluteString);
NSString* reqUrl = navigationAction.request.URL.absoluteString;
if ([reqUrl hasPrefix:@"alipays://"] || [reqUrl hasPrefix:@"alipay://"]) {
[[UIApplication sharedApplication]openURL:navigationAction.request.URL];
//bSucc是否成功调起支付宝
}
if ([reqUrl hasPrefix:@"weixin://"]) {
[[UIApplication sharedApplication]openURL:navigationAction.request.URL];
//bSucc是否成功调起微信
}
decisionHandler(WKNavigationActionPolicyAllow);
}
亲测可用,但这样做有一个问题,就是支付后不能直接跳回原来的app,但如果不集成SDK又想调用手机内原生app的话,只能这样了,如果谁有更好的方法。欢迎在下方留言~~
网友评论
//alipay://alipayclient/?{"requestType":"SafePay","fromAppUrlScheme":"alipays","dataString":"h5_route_token=\"RZ18AseOoQH8kPS7owotGtYJHhs4QRmobilecashierRZ18\"&is_h5_route=\"true\""}
//weixin://wap/pay?appid=wx360638309cc59c4e&noncestr=52bdba949576e6bcec5682a4993bfb58&package=WAP&prepayid=wx29115850053307950b41bfda1719642549&sign=8D12E363AAFDD0B6C84E6DE931AA0C02&signtype=MD5×tamp=1543463930