場景描述
- 1缎讼、WKWebView 加載H5頁面收夸,下單
- 2、點擊支付按鈕血崭,調(diào)起微信客戶端支付
- 3卧惜、支付完成,返回APP并刷新頁面
現(xiàn)象描述
因公司業(yè)務需要夹纫,調(diào)試現(xiàn)象如下:
公司前端開發(fā)一套H5頁面咽瓷,和APP端功能類似(提供給第三方集成使用)
客戶完成下單,點擊微信支付捷凄,調(diào)起微信APP忱详,支付完成或者取消支付后,直接跳轉(zhuǎn)進入Safari瀏覽器跺涤,而非返回APP
解決方案
選中‘TARGETS’一欄,在‘info’中的‘LSApplicationQueriesSchemes’添加‘weixin’桶错,已添加過的可以忽略此步驟
- 2航唆、由H5頁攔截請求,跳轉(zhuǎn)到微信院刁,代碼如下
// 實際使用時可以攔截weixin://wap/pay前綴的判斷
#pragma mark - WKNavigationDelegate
//! WKWeView在每次加載請求前會調(diào)用此方法來確認是否進行請求跳轉(zhuǎn)
- (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出現(xiàn)在第二步驟的請求攔截URL中享潜,此URL前綴為‘https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb’困鸥,
查看此URL中的redirect_url,修改為‘redirect_url=account.test.com://’剑按,//后可以添加自定義內(nèi)容
選中‘TARGETS’一欄,在‘info’中的‘URL Types’添加一項艺蝴,URL Schemes 填寫‘a(chǎn)ccount.test.com’
AppDelegate中實現(xiàn)
// 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中實現(xiàn)
在viewDidLoad中監(jiān)聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(payResult:) name:@"test" object:nil];
- (void)payResult:(NSNotification *)noti {
// 可以先調(diào)用一次goback 解決weixin:pay出現(xiàn)的白屏問題
// [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];
}
最后編輯于 :
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者