iOS H5调微信支付与回调

转载自:https://www.jianshu.com/p/30ca8b2c1235

我这里用的是WKWebView,首先要实现WKNavigationDelegate协议

1、由H5页跳转微信客户端--WKNavigationDelegate方法

该方法是决定H5页面是否允许跳转的

-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler{

    WKNavigationActionPolicy  actionPolicy = WKNavigationActionPolicyAllow;//允许

    NSString*urlString = [[navigationAction.request URL] absoluteString];

    urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"跳转:>>>???>>%@",urlString);

    //打开微信

    if([urlString containsString:@"weixin://wap/pay?"]) {

        actionPolicy =WKNavigationActionPolicyCancel;//不允许跳转

        NSURL*url = [NSURL URLWithString:urlString];

        if([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {

            [[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {

            }];

        }else{

            [[UIApplication sharedApplication]openURL:webView.URL];

        }

    }

    decisionHandler(actionPolicy); //这句是必须加上的,不然会异常

}

 

2、从微信客户端跳回APP

很多小伙伴儿都遇到回跳的问题,点击“完成”或“取消”跳到了Safari却跳不回APP。

1、配置 URL Types   添加schemes:www.xxxx.com

 

2、配置 Referer

[request setValue:@"www.xxxx.com://" forHTTPHeaderField:@"Referer"];

3、服务器回调的URL中一定要写成  www.xxxx.com:// , 如果一定要拼接,可以让后台区分一下,如果是iOS 前面一定要写成 www.xxxx.com:// ,不然跳不回APP。

注意:www.xxxx.com 此域名一定是H5授权的域名,如果是二级域名,可以写成:aaa.xxxx.com

3、支付回来页面不刷新或产生空白页

一般支付完不管完成与否都要调一下回调地址来刷新支付页面的,但问题是iOS的回调地址中一定要写成 www.xxxx.com:// 这样的格式才能跳回来,但是调回来后没有执行回调地址,页面又刷新不了,或者跳回来后是个空白页,这又产生了一个新的问题。当点击微信支付页上的“完成”或“取消”返回APP时,会调用 AppDelegate 中的 openURL: 方法

-(BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{ 

    // url.scheme 就是 www.xxxx.com ,你只需要在这做一个判断,如果是 www.xxxx.com 你就给外部发一个通知,那外部接收到这个通知,刷新界面就行了。

那么问题又来了,刷新方法是什么呢??

刷新地址也就是支付完的回调地址,后台可以把回调地址拼接在 www.xxxx.com:// 后面,例如:www.xxxx.com://http://www.baidu.com 。 那么 url 就是 www.xxxx.com:// http://www.baidu.com ,你向外部发通知时把 url 作为参数传出去即可 

if ([url.scheme containsString:@"www.xxxx.com"]) {                                                                                          

[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshWXH5Pay" object:nil userInfo:@{@"url":url}];                  

 }                                                                                                                                                                                                                      

}

//这是外部接收、处理通知的方法                                                                                                                                                                -(void)refreshOrderData:(NSNotification*)notifi{                                                                                                                   

NSDictionary*dic = notifi.userInfo;                                                                                                                                             

NSString*url = [NSString stringWithFormat:@"%@",dic[@"url"]];                                                                                          

NSString*urlStr = [url substringFromIndex:14];  //截取 www.xxxx.com:// http://www.baidu.com    后面的部分                                                                                                    

[self.webView loadRequest:[self getRequest:urlStraction:nil]];

}



作者:861488970
链接:https://www.jianshu.com/p/30ca8b2c1235
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值