支付调起说明
支付调起说明
iOS:
- (void)webView:(WKWebView _)webView decidePolicyForNavigationAction:(WKNavigationAction _)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
application openURL:
方法跳转微信及支付宝应用- (BOOL)application:(UIApplication _)app openURL:(NSURL _)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> \*)options
示例代码
#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSLog(@"发送请求-----》%@", navigationAction.request.URL.absoluteString);
NSURLRequest *request = navigationAction.request;
NSURL *url = request.URL;
NSString *scheme = [navigationAction.request.URL scheme];
UIApplication *application = [UIApplication sharedApplication];
NSString *absoluteString = navigationAction.request.URL.absoluteString;
// decode for all URL to avoid url contains some special character so that it wasn't load.
NSLog(@"Current URL is %@",absoluteString);
static NSString *endPayRedirectURL = nil;
//三方购买
if ([scheme isEqualToString:@"test02-live.vhall.com"]) {
// 打开客户端
[application openURL:url
options:@{}
completionHandler:^(BOOL success) {
NSLog(@"客户端跳转%@", success ? @"完成" : @"失败");
}];
// 取消当前请求
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
// 解决跳转到本地支付宝App不返回的问题
// 判断URL是否以alipays://或者alipay://开头
if ([absoluteString hasPrefix:@"alipays://"] || [absoluteString hasPrefix:@"alipay://"]) {
// 定义支付宝URL的前缀
NSString *prefixString = @"alipay://alipayclient/?";
// 将URL中的alipays替换为test02-live.vhall.com
NSString *urlString = [[self xh_URLDecodedString:absoluteString] stringByReplacingOccurrencesOfString:@"alipays" withString:CompanyFirstDomainByWeChatRegister];
// 如果URL以前缀字符串开头,则对URL进行特殊处理
if ([urlString hasPrefix:prefixString]) {
// 获取前缀字符串的范围
NSRange rang = [urlString rangeOfString:prefixString];
// 获取前缀字符串后面的部分
NSString *subString = [urlString substringFromIndex:rang.length];
// 将前缀和后面的部分拼接起来,并对拼接后的字符串进行URL编码
NSString *encodedString = [prefixString stringByAppendingString:[self xh_URLEncodedString:subString]];
// 将编码后的字符串转换为NSURL对象
url = [NSURL URLWithString:encodedString];
}
// 打开支付宝客户端
[application openURL:url
options:@{}
completionHandler:^(BOOL success) {
NSLog(@"支付宝跳转%@", success ? @"完成" : @"失败");
}];
// 取消当前请求
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
//解决微信支付后为返回当前应用的问题
// 判断是否需要重定向
if ([absoluteString hasPrefix:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb"] && ![absoluteString hasSuffix:[NSString stringWithFormat:@"redirect_url=%@://",CompanyFirstDomainByWeChatRegister]]) {
// 取消当前请求
decisionHandler(WKNavigationActionPolicyCancel);
NSString *redirectUrl = nil;
// 判断URL中是否包含redirect_url参数
if ([absoluteString containsString:@"redirect_url="]) {
NSRange redirectRange = [absoluteString rangeOfString:@"redirect_url"];
// 获取redirect_url参数后面的值
endPayRedirectURL = [absoluteString substringFromIndex:redirectRange.location+redirectRange.length+1];
// 将redirect_url参数的值替换为当前应用程序的URL Scheme,并重新构造URL
redirectUrl = [[absoluteString substringToIndex:redirectRange.location] stringByAppendingString:[NSString stringWithFormat:@"redirect_url=%@://",CompanyFirstDomainByWeChatRegister]];
}else {
// 在URL末尾添加redirect_url参数,并将其值设置为当前应用程序的URL Scheme
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;
}
// 判断scheme是否为http或者https
if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) {
// 取消当前请求
decisionHandler(WKNavigationActionPolicyCancel);
// 判断scheme是否为weixin
if ([scheme isEqualToString:@"weixin"]) {
// 如果endPayRedirectURL不为空,使用其加载新页面
if (endPayRedirectURL) {
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:endPayRedirectURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:XDX_URL_TIMEOUT]];
}
}else if ([scheme isEqualToString:[NSString stringWithFormat:@"%@",CompanyFirstDomainByWeChatRegister]]) {
// 对于其他scheme,可以进行特殊处理
}
// 如果URL中包含weixin://,打开微信客户端
if ([navigationAction.request.URL.absoluteString hasPrefix:@"weixin://"]) {
[application openURL:url
options:@{}
completionHandler:^(BOOL success) {
NSLog(@"微信跳转%@", success ? @"完成" : @"失败");
}];
}
return;
}
decisionHandler(WKNavigationActionPolicyAllow);
}
// URL解码
- (NSString *)xh_URLDecodedString:(NSString *)urlString {
NSString *string = urlString;
// 调用CFURLCreateStringByReplacingPercentEscapesUsingEncoding函数对URL进行解码
NSString *decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)string, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}
// URL编码
- (NSString *)xh_URLEncodedString:(NSString *)urlString {
NSString *string = urlString;
// 调用CFURLCreateStringByAddingPercentEscapes函数对URL进行编码
NSString *encodedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)string,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8));
return encodedString;
}
Android:
WebViewClient#shouldOverrideUrlLoading
方法去监听跳转地址和点击提交重定向的地址startActivity(intent)
方法跳转微信及支付宝应用示例代码
//1. WebView 传入Referer
Map<String,String> webviewHead =new HashMap<>();
webviewHead.put("Referer", "https://live.vhall.com");
webView.loadUrl(url,webviewHead);
//2. 监听scheme 跳转 原生唤起 app 支付
webView.setWebViewClient(new WebViewClient() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if(!url.startsWith("http"))
{
PackageManager packageManager = getPackageManager();
Log.e("========",url);
try {
//打开 scheme
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), "未安装应用", Toast.LENGTH_SHORT).show();
}
return true;
}
return false;
}
.....
}
H5 唤起微信支付技术要点

修改 redirect_url
设置 webView 请求 header 中的 Referer 字段
www.xxxx.com://
的格式。注意
redirect_url=www.xxxx.com://
,因为在第一次检测到后会重新加载该地址,该地址中同时包含 https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb
,会形成循环冲突。所以判断条件如下:
H5 唤起支付宝支付技术要点
配置 scheme
注意
alipays://
或者alipay://
开头,则将 URL 中的alipays
替换为微吼的域名live.vhall.com
,并对 URL 进行特殊处理;修改于 2025-05-27 13:00:42