最新项目中遇到H5页面中调用微信、支付宝客户端支付的需求,虽然这并不是推荐的做法,但是需求确实存在。。。加载h5页面点击支付调起需要支付的客户端(微信或者支付宝)。
微信支付解决方案:
1.首先要设置好你自己项目中的scheme, LSApplicationQueriesSchemes 中添加weixin;
2.你点击支付的时候,在shouldStartLoadWithRequest回调方法中会获取到https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?。。。。类似这种的连接,这就是你的支付链接,webView加载完成后就可以调起微信/支付宝进行支付了。
3.支付完成后无论成功失败,都会调转到Safari浏览器中。
4.要想支付完成后跳回app,我们就需要拦截回调的URL地址,回调的URL中一定不要拼接redirect_url, 不然还是会跳转到浏览器中。
5.最后把Referer设置成:www.xxx.com:// scheme设置成:www.xxx.com就可以直接返回APP了。(www.xxx.com 这个必须是H5授权的域名)。
支付宝支付解决方案:
1.首先要设置好你自己项目中的scheme, LSApplicationQueriesSchemes 中添加alipay;
2.跟微信支付一样,在shouldStartLoadWithRequest回调中拦截UrlScheme,并替换为项目中设置的UrlScheme。
代码如下:
//UIwebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
//微信
NSString *wxPre = @"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?";
if ([request.URL.absoluteString hasPrefix:wxPre]) {
//微信支付链接不要拼接redirect_url,如果拼接了还是会返回到浏览器的
NSString *string1 = request.URL.absoluteString;
//把redirect_url以及后面的参数全删掉
NSString *string2 = [string1 stringByReplacingOccurrencesOfString:@"redirect_url=http://www.xxx.com/ad_list.php" withString:@""];
NSURL *newURL = [NSURL URLWithString:string2];
//新建webView
UIWebView *web = [[UIWebView alloc]initWithFrame:CGRectZero];
[self.view addSubview:web];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableURLRequest* newResult = [NSMutableURLRequest requestWithURL:newURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[newResult setHTTPMethod:@"GET"];
[newResult setValue:@“www.xxx.com://" forHTTPHeaderField: @"Referer"];
[web loadRequest:newResult];
});
});
}
//支付宝
NSString *reqUrl = request.URL.absoluteString;
if ([reqUrl hasPrefix:@"alipays://"] || [reqUrl hasPrefix:@"alipay://"]) {
reqUrl = [self URLDecodeString:reqUrl];
//替换fromAppUrlScheme 为 本APP的UrlSheme
NSString *newStr = [self changeScheme:request.URL.absoluteString];
NSString *encodeValue = [newStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:encodeValue];
[[UIApplication sharedApplication]openURL:url options:nil completionHandler:nil];
return NO;
}
return YES;
}
//替换UrlScheme
- (NSString *)changeScheme:(NSString *)str{
NSArray *paramsArr = [str componentsSeparatedByString:@"?"];
NSDictionary *dict = [self jsonToMessageDict:paramsArr.lastObject];
NSMutableDictionary *mDict = [NSMutableDictionary dictionaryWithDictionary:dict];
mDict[@"fromAppUrlScheme"] = @"your Url Scheme";
NSString *jsonStr = mDict.mj_JSONString; //MJExtension
return [NSString stringWithFormat:@"%@?%@",paramsArr.firstObject,jsonStr];
}
- (NSDictionary *)jsonToMessageDict:(id)messageJson{
NSDictionary *messageDict = [NSJSONSerialization JSONObjectWithData:[messageJson dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
return messageDict ? : @{};
}
- (NSString *)URLDecodeString:(NSString *)str{
NSString *decodeString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)str, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodeString;
}