IOS嵌入web App拉起微信支付,支付後直接打開Safari瀏覽器問題

語言: CN / TW / HK

1、查看微信支付平台的回調地址

  • 也可以自定義url schemes添加到微信回調地址(最多可添加5個)

WechatIMG64.jpeg

2、Xcode添加配置

image.png

image.png

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);

} ```

GitHub Demo地址