iOS微信H5支付>> 支付完成返回原APP


iOS实现微信H5支付完成后返回原APP而不打开Safari或没反应...

由于公司多个APP都要用微信支付, 需要申请好多APPID, 所以避免这些申请的过程和时间的浪费, 把微信H5支付集成到多款APP上.


下面说一下开发过成:

首先去微信商户后台去申请开通H5支付, 假设支付域名填写的  www.maimaicn.com,注意是顶级域名,不是二级或三级的子域名

服务器端通过统一下单接口从微信拿到支付跳转链接(https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180115115052bedf091fba0369993002&package=2975002856),称为mweb_url,有效期为5分钟。
由于这里是APP调起支付,不是网页H5发起支付,所以这里mweb_url值不需要再拼接上redirect_url参数。
然后移动端进行请求mweb_url,就会调起微信APP支付

可能会出现以下问题:

"出现商家参数格式有误,请联系商家解决"

说明在请求mweb_urlreferer为空导致,设置上就可以,这里我们设置最先在商户后台注册的www.maimaicn.com的一个多级子域名,比如:mai.maimaicn.com如果不是设置商户后台注册的顶级域名的多级子域名,比如:mai.aaa.com. 

会出现 "商家存在未配置的参数,请联系商家解决"

那就把aaa.com注册到商户后台就可以解决了。

到目前为止,你就可能正常支付了,但支付成功后,并不能正常跳回原APP,严重影响了用户体验
解决方案:把referer设置成 : mai.maimaicn.com:// ,scheme设置成: mai.maimaicn.com 就可以直接返回APP了
如是你只有一款APP使用此支付方式,那就可以到此为止了

我把设置 referer的代码贴一下:

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

        /// 配置微信H5支付 WEB的Referer
        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:@"mai.maimaicn.com://” forHTTPHeaderField: @"Referer"];
                    [_webView loadRequest:request];
                });
            });
            return NO;
        }
}

如果你有两款以上APP(比如A,B,C),并都把referer设置成: mai .maimaicn.com ://,scheme设置成: mai .maimaicn.com
用户只安装了其中一款APP(A),此时支付能够成功,并能转回原APP,一点问题没有。如果同时安装了(A,B),就会发现支付能够成功,但成功后页面静止,不能跳回原APP了,也严重影响了用户体验

解决办法:

把referer与scheme设置成注册的顶级域名的多级子域名

A:            referer: mai.maimaicn.com://            scheme: mai.maimaicn.com

B:            referer: tian.maimaicn.com://            scheme: tian.maimaicn.com

C:            referer: jin.maimaicn.com://            scheme: jin.maimaicn.com

通过测试,完美运行。理论上这个解决方案可以支持无数个APP,也同时解决了微信开放平台APP支付的限制个数

你可能感兴趣的:(iOS,编程开发,开发技巧)