IOS嵌入web App拉起微信支付,支付後直接打開Safari瀏覽器問題
1、查看微信支付平台的回調地址
- 也可以自定義url schemes添加到微信回調地址(最多可添加5個)
2、Xcode添加配置
3、WKWebView的代理方法
```
define XDX_URL_TIMEOUT 30
static const NSString *CompanyFirstDomainByWeChatRegister = @"restaurant.pengyuns.comm";
- (void)webView:(WKWebView )webView decidePolicyForNavigationAction:(WKNavigationAction )navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURLRequest request = navigationAction.request; NSString scheme = [request.URL scheme];
NSString *absoluteString = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding]; NSLog(@"Current URL is %@",absoluteString);
// 攔截schemes跳轉 回到支付頁面 if ([absoluteString isEqualToString:[NSString stringWithFormat:@"%@://",CompanyFirstDomainByWeChatRegister]]) { decisionHandler(WKNavigationActionPolicyCancel); [self.webView goBack]; // 根據web支付場景自行處理 return; }
static NSString *endPayRedirectURL = nil;
// 解決微信支付後為返回當前應用 if ([absoluteString hasPrefix:@"http://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"] && ![absoluteString hasSuffix:[NSString stringWithFormat:@"redirect_url=%@://",CompanyFirstDomainByWeChatRegister]]) { decisionHandler(WKNavigationActionPolicyCancel);
NSString *redirectUrl = nil; if ([absoluteString containsString:@"redirect_url="]) {
NSRange redirectRange = [absoluteString rangeOfString:@"redirect_url"]; endPayRedirectURL = [absoluteString substringFromIndex:redirectRange.location+redirectRange.length+1]; redirectUrl = [[absoluteString substringToIndex:redirectRange.location] stringByAppendingString:[NSString stringWithFormat:@"redirect_url=%@://",CompanyFirstDomainByWeChatRegister]];
} else {
redirectUrl = [absoluteString stringByAppendingString:[NSString stringWithFormat:@"&redirect_url=%@://",CompanyFirstDomainByWeChatRegister]];
}
NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:redirectUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT]; newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields; [newRequest setValue:[NSString stringWithFormat:@"%@",CompanyFirstDomainByWeChatRegister] forHTTPHeaderField:@"Referer"]; newRequest.URL = [NSURL URLWithString:redirectUrl]; [webView loadRequest:newRequest];
return; }
if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) { decisionHandler(WKNavigationActionPolicyCancel);
if ([scheme isEqualToString:@"weixin"]) {
if (endPayRedirectURL) { [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:endPayRedirectURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT]]; }
} else if ([scheme isEqualToString:[NSString stringWithFormat:@"%@",CompanyFirstDomainByWeChatRegister]]) {
}
// 原生拉起微信支付 NSLog(@"handler Url:%@", request.URL.absoluteString); BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL];
if (canOpen) {
if ([navigationAction.request.URL.absoluteString hasPrefix:@"weixin://"]) { [[UIApplication sharedApplication] openURL:navigationAction.request.URL options:@{} completionHandler:nil]; }
} else {
UIAlertController alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"你尚未安裝微信APP" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction cancelAction = [UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleCancel handler:nil]; [alert addAction:cancelAction]; [self presentViewController:alert animated:YES completion:nil]; } return; }
decisionHandler(WKNavigationActionPolicyAllow);
} ```