版权声明:本文发布于上海竖排网络科技有限公司知乎专栏田甜,由本人撰写,现摘抄于个人掘金,学习复习 作者: xteamer成员: 清泓
【摘要】首先,你编程的Xcode版本必须和iOS系统对应,比如说,iOS13版本的苹果手机,如果用Xcode10,就会运行失败,不是你的软件错误,而是因为苹果官方的强制措施,因为手机升级了,编写iOS的程序也要升级。本问主要介绍的解决方案是iOS混合应用在支付成功或者取消支付返回的时候会直接跳转到safari浏览器中。
ios微信支付[1]成功之后或者是取消支付的时候会跳转到Safari浏览器,这就很尴尬了,完全无用户体验啊。Android可以直接返回到APP,iOS不行
首先在Xcode中,选择工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin[2]
然后通过统一下单后台会从微信拿到这么个链接wx.tenpay.com/cgi-bin/mmp…?prepay_id=wx20180112315115052bedf091fba0369993002&package=2975002856给你
拿到这个链接之后还无法直接加载webView,如果直接加载的话他会提示
进入微信查了一下,发现需要设置Referer这个请求头的参数,当然微信也给出了例子微信h5支付其他常见错误。针对于这个问题在网上搜索了一下发现有专门针对于微信h5支付设置Referer的文章iOSwebView设置Refere
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSDictionary *headers = [request allHTTPHeaderFields];
BOOL hasReferer = [headers objectForKey:@"Referer"] != nil;
if (hasReferer) {
// .. is this my referer?
return YES;
} else {
// relaunch with a modified request dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSURL *url = [request URL];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setHTTPMethod:@"GET"];
[request setValue:@"www.xxx.com" forHTTPHeaderField: @"Referer"]; [self.myWebView loadRequest:request];
});
});
return NO;
}
}
这个www.xxx.com是商户申请H5时提交的授权域名.
走到这一步就可以加载webView进行支付,但是问题来了,不论是支付成功还是取消支付之后他都会跳转到Safari浏览器,而且打开的内容是是设置Referer时的授权域名www.xxx.com
那么,怎么办呢,然后Android那边我生成了一个weixin://wap/pay?prepayid%3Dwx201801151450335872c8f41a0452242290&package=122735683&noncestr=1515999038&sign=0b3590852e847b336e6f0187a0f56ab1这样的链接,这个链接是通过拦截webView访问获取的,然后试了一下,可以支付,也停留在了微信,于是尝试了一下。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
通过webView的代理方法来获取到这个链接,然后进行支付,发现还是一样的会跳转到Safari浏览器,不管是用wx.tenpay.com/cgi-bin/mmp…?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856还是拦截的weixin://wap/pay?prepayid%3Dwx201801151450335872c8f41a0452242290&package=122735683&noncestr=1515999038&sign=0b3590852e847b336e6f0187a0f56ab1进行支付都是不行的,都会跳转到Safari。
不用TFHpple解析HTML内容吧,但是仔细一想不行的,因为头部没有Referer,无法解析。
设置scheme,假如scheme设置xxxx,那么在Safari输入xxxx://就可以打开APP了。做到这就全部明白了,只要设置好Referer和scheme对应就行了。
Referer设置:www.xxx.com scheme设置:www.xxx.com发现不行
突然间发现是不是只要是带有h5的授权的域名就可以呢,于是把公司的一个链接shupai.downline.com设置成Referer之后我发现我还是能支付的,然后为了确保准确性进行了各种尝试,发现只要带有域名的都可以,然后进行了一个尝试:就是把http://去掉直接把Referer设置成:[http://www.xxx.com](link.zhihu.com/?target=htt…](link.zhihu.com/?target=htt…
所以最终返回APP的解决方案是:把Referer设置成:www.xxx.com:// scheme设置成:www.xxx.com就可以直接返回APP了。
谨记,需要把URL Types设置成自动化
解决不同多渠道打包的时候wxpay支付成功跳转错误到其他app 上。
这个是重点!!!!
多渠道app各自设置自己的域名。
以上就是全部内容,自己在实际开发中遇到的问题,也是得到了很好的解决,欢迎提问,技术交流的非常乐意。如果想了解我们公司技术架构,非常欢迎私聊,建立长久的合作关系。请多多指教。