IOS培训
美国上市IOS培训机构

400-111-8989

热门课程

IOS牛人解决微信H5支付无法直接返回APP的问题

  • 时间:2018-04-10 13:43
  • 发布:iOS培训
  • 来源: iOS开发

你是上帝的宠儿吗?你是IT界的大神吗?你是IOS开发大神吗?你有尝试过用你的满腹才华去解决一些技术上的难题呢?正如这位IOS牛人解决微信H5支付无法直接返回APP的问题一样,可他还有些问题尚待解决,你能帮帮他吗?

IOS牛人开发微信H5支付背景

由于公司的业务需要,为了节省申请开通微信支付的时间和人力,公司决定使用微信h5支付。这样即节省了时间,同时以后所有的APP都能使用h5支付,既方便又快捷。

IOS牛人开发微信H5支付的坎坷之路

首先你在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin,

IOS培训之微信H5支付

通过统一下单后台会从微信拿到这个链接

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856

拿到这个链接之后我们还无法直接加载webView,如果直接加载的话他会提示。

IOS培训-微信H5支付设置提示

进入微信查了一下,发现需要设置Referer这个请求头的参数,当然微信也给出了例子微信h5支付其他常见错误。针对于这个问题在网上搜索了一下发现有专门针对于微信h5支付设置Referer的文章iOSwebView设置Referer,如下:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request avigationType:(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:@"http://www.xxx.com" forHTTPHeaderField: @"Referer"];

[self.myWebView loadRequest:request];

});

});

return NO;

}

}

这个http://www.xxx.com就是你们商户申请H5时提交的授权域名。

IOS牛人开发微信H5支付中遇到的问题

走到这一步,你就可以加载webView进行支付了,但是问题来了,不论是支付成功还是取消支付之后他都会跳转到Safari浏览器,而且打开的内容是就是你设置Referer时的授权域名http://www.xxx.com,这个就是我们的公司的主页。

那么,怎么办呢?最后我们经过协商,只要能支付,不管支付成功或者取消支付,只要停留在微信界面就可以了,然后让用户点击右上角手动返回APP,这个是没有办法的办法了。然后Android那个朋友给我生成了一个链接,这个链接是通过拦截webView访问获取的,然后我试了一下,可以支付,也停留在了微信,于是我高高兴兴地去尝试了一下:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request avigationType:(UIWebViewNavigationType)navigationType

通过webView的代理方法来获取到这个链接,然后进行支付,发现还是一样的会跳转到Safari浏览器,后来又让Android那个哥们拦截一个链接给我,尝试一下不会跳转浏览器,我又试了一下自己的拦截的链接还是会跳转到Safari浏览器。我突然明白了这个是我设置了Referer,不管是用这个:

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856

还是拦截的这个:weixin://wap/pay?prepayid%3Dwx201801151450335872c8f41a0452242290&package=122735683&noncestr=1515999038&sign=0b3590852e847b336e6f0187a0f56ab1

进行支付都是不行的,也都会跳转到Safari。

当时想要不用TFHpple解析HTML内容,但因为头部没有Referer无法解析。最后实在没办法准备放弃的时候,突然想到了设置scheme,既然我可以Safari可以打开APP,那么我这肯定也能做的,于是我又信心满满的开始我的实验了:

首先要设置scheme,假如scheme设置xxxx,,那么你在Safari输入xxxx://就可以打开APP了。做到这就全部明白了,只要设置好Referer和我的scheme对应就行了,然后我开始实验了:

Referer设置:http://www.xxx.com  scheme设置:http://www.xxx.com发现不行。

我突然间发现是不是只要是带有h5的授权的域名就可以呢,于是我把公司的一个链接www.aglhz.com/sub_property_ysq/m/html/introduction.html设置成Referer之后我发现我还是能支付的,犹如突然之间发现了一个新的大陆,太激动了,为了确保准确性进行了各种尝试,发现只要带有域名的都可以。然后我又进行了一个尝试:就是把http://去掉直接把Referer设置成:www.xxx.com,然后也是能支付的。这样就全部OK了,我把Referer设置成:www.xxx.com://这个样式的然后把scheme设置成:www.xxx.com这样的话支付成功或者取消支付都可以直接返回到APP了。

所以h5支付最终返回APP的解决方案是:把Referer设置成:www.xxx.com:// scheme设置成:www.xxx.com就可以直接返回APP了。

IOS培训-微信H5支付解决方案1

IOS培训-微信H5支付解决方案2

IOS牛人开发微信H5支付中需要你的帮助

目前还没有解决多个APP同时使用同一个授权域名时,怎么返回APP的问题,多个APP使用h5支付的话会导致返回错乱的问题。

如果你有过类似的思考,如果你有良好的解决办法,IOS牛人等待你的帮助;如果你看完对IOS很感兴趣,更想利用它创造更多的价值,那么来达内IOS培训机构,与志同道合的人一起进行IOS培训学习,创造未来的无限可能!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容

上一篇:IOS面试进阶篇,提前Get IOS面试新知点!
下一篇:ios培训专家分析给你7个理由跳不跳槽

实用快捷iOS开发经验,36条iOS开发经验总结

互联网上市公司ios开发岗位的面试需求

iOS面试题分享——附BAT常见的iOS面试题

选择城市和中心
贵州省

广西省

海南省