iOS-H5微信支付问题总结(WKWebView篇)
2019-05-10 本文已影响0人
同心圆圈
场景描述
- 1、WKWebView 加载H5页面,下单
- 2、点击支付按钮,调起微信客户端支付
- 3、支付完成,返回APP并刷新页面
现象描述
因公司业务需要,调试现象如下:
公司前端开发一套H5页面,和APP端功能类似(提供给第三方集成使用)
客户完成下单,点击微信支付,调起微信APP,支付完成或者取消支付后,直接跳转进入Safari浏览器,而非返回APP
解决方案
- 1、调起微信前的设置
选中‘TARGETS’一栏,在‘info’中的‘LSApplicationQueriesSchemes’添加‘weixin’,已添加过的可以忽略此步骤
- 2、由H5页拦截请求,跳转到微信,代码如下
// 实际使用时可以拦截weixin://wap/pay前缀的判断
#pragma mark - WKNavigationDelegate
//! WKWeView在每次加载请求前会调用此方法来确认是否进行请求跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
// 先打印此方法拦截的所有请求
// NSLog(@"\n ==== %@" ,navigationAction.request.URL.absoluteString);
// decisionHandler(WKNavigationActionPolicyAllow);
// return ;
NSURLRequest *request = navigationAction.request;
NSString *scheme = [request.URL scheme];
if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {
if ([scheme isEqualToString:@"weixin"]) {
decisionHandler(WKNavigationActionPolicyCancel);
BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL];
if (canOpen) {
[[UIApplication sharedApplication] openURL:request.URL];
}
return;
}
decisionHandler(WKNavigationActionPolicyAllow);
}
decisionHandler(WKNavigationActionPolicyAllow);
}
- 3、APP端设置Referer (在WKWebView的request中设置)
[request setValue:@"account.test.com://" forHTTPHeaderField:@"Referer"];
说明:account.test.com为微信后台注册二级域名(可以找服务端人员要),
一级域名也可以,其中一级域名格式www.xxx.com,二级域名格式xxx.xxx.com
- 4、服务端redirect_url的修改,关于redirect_url的说明,可以查看微信支付官方文档
redirect_url出现在第二步骤的请求拦截URL中,此URL前缀为‘https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb’,
查看此URL中的redirect_url,修改为‘redirect_url=account.test.com://’,//后可以添加自定义内容
- 5、URL Types配置
选中‘TARGETS’一栏,在‘info’中的‘URL Types’添加一项,URL Schemes 填写‘account.test.com’
- 6、支付取消或完成后刷新问题
AppDelegate中实现
// iOS 9.0
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if ([url.absoluteString containsString:@"account.test.com://"]) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:url];
}
return YES;
}
WebViewController中实现
在viewDidLoad中监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payResult:) name:@"test" object:nil];
- (void)payResult:(NSNotification *)noti {
// 可以先调用一次goback 解决weixin:pay出现的白屏问题
// [self backClick];
//https://www.baidu.com
//http://192.168.1.14:9871/default/index
NSURL *newUrl = [NSURL URLWithString:@"https://www.baidu.com"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:newUrl];
[request setValue:@"account.test.com://" forHTTPHeaderField:@"Referer"];
[_webView loadRequest:request];
}