App接入微信H5支付常见错误及原因

在App上接入微信H5支付一般都会遇到一些错误。本文讨论了这些错误的解决方案和背后的原因,希望能让读者能少踩些坑。

错误可以分为两类:一是H5支付域名设置错误,二是URL Scheme跳转App错误。

第一类,H5支付域名设置错误

此类错误一般发生在安卓机器上(网上有人说iOS也遇到类似错误),在微信官方文档里有对这类现象的详细描述。

一般情况下,检查下面两点就能排除这类错误:

  1. 登录商户号对应的商户平台—“产品中心”—“开发配置”,查看设置的H5支付域名是否包含商家发起支付的网页所在的域名。

  2. 在商家发起支付的网页,在发起支付的时候,浏览器会重定向到一个微信的页面(页面地址类似于:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096),这个页面会校验权限和安全性,我们暂且把它叫做微信校验页面。

    为了校验发起支付的域名是否合法,在请求微信校验页面的HTTP请求里,头部(HTTP Header)需要有“Referer”这个字段。了解HTTP的同学可能知道,Referer字段会告诉服务器请求的原始资源的URI。也就是说,Referer会告诉腾讯的服务器,是谁在请求微信校验页面。所以Referer的值应该是商家发起支付的页面的域名。

    通常情况下,浏览器或者WebView会为我们自动加上Referer,但是在安卓的自定义WebView中,无法自动加上Referer。需要在WebView中手动设置Referer,如:

    Map extraHeaders = new HashMap();
    extraHeaders.put("Referer", "商户申请H5时提交的授权域名"
    

第二类,URL Scheme跳转错误

1、无法跳转到微信App

在完成了上述校验后,浏览器或者WebView会被重定向到一个URL Scheme(类似于:weixin://wap/pay?prepayid%3Dwx261541599457545c6f11d41a1106566432&package=1888940394&noncestr=1564126923&sign=1ba23428a32b17d5d03cf032b283379f)。

对于安卓或者iOS的浏览器来说,这种URL Scheme一般可以成功跳转。但是对于安卓自定义WebView和iOS的WKWebView来说,无法使用URL Scheme跳转。

1)安卓自定义WebView

往往我们的app中使用自定义的WebView,会设置很多参数,经测试发现如果为WebView设置了WebViewClient,如下:

webView.setWebViewClient(new WebViewClient() {
    // some logic
}

那么就不能唤起微信支付了,errorCode返回-10,提示“不支持该协议”。我们需要手动调起微信:

 @Override  
        public boolean shouldOverrideUrlLoading(WebView view, String url) {  
            // 如下方案可在非微信内部WebView的H5页面中调出微信支付
            if (url.startsWith("weixin://")) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);
                return true;
            }
            return super.shouldOverrideUrlLoading(view, url);
        }

2) iOS UIWebView

如果iOS端使用的是UIWebView,是可以支持URL Scheme的。但是自iOS 9之后,URL Scheme必须在Info.plist中列为白名单才有效。

打开Info.plist,增加“LSApplicationQueriesSchemes”一行,类型设置为Array,并在这个数组中加入一个条目:“weixin”。

image

3)iOS WKWebView

WKWebView不支持URL Scheme,或者叫默认不支持URL Scheme,需要我们手动调起微信。参考解决方法:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    NSURL *url = navigationAction.request.URL;
    NSString *urlString = (url) ? url.absoluteString : @"";
    if ([urlString containsString:@"weixin://"]) {
        [[UIApplication sharedApplication] openURL:url];
        decisionHandler(WKNavigationActionPolicyCancel);
    }
}

如果你使用UIApplicationopenURL方法打开URL Scheme,你就不需要在Info.plist中把对应的URL Scheme列为白名单。

因为,UIApplicationcanOpenURL会查询Info.plist中LSApplicationQueriesSchemes中的Scheme,如果没有对应的Scheme就返回NO。而当你使用UIApplicationopenURL方法打开一个URL Scheme的时候,并不会调用canOpenURL

2、支付完成后无法从微信App跳转回到我们的App

在调用微信支付的时候,微信允许你设置一个回调URL。在iOS上,支付完成后,微信会调起手机上的Safari浏览器加载这个回调URL。

这个回调URL的逻辑我们无法改变,但是我们可以在回调URL指向的HTML页面里,判断是否是iOS Safari浏览器。如果是Safari,就可以调用我们App自己的URL Scheme。

我们可以在Info.plist里增加一个URL Types:

image

然后在回调页面里合适的时机调用window.location = "testappdemo",注意"testappdemo"是你在Info.plist里设置的URL Scheme。

这样Safari就会调起你的App。但是在调起你的App之前,会询问用户“是否在xxx里打开”

image

总结

不论iOS还是安卓,在浏览器中完成微信H5支付一般是没有问题的,这也是微信H5支付设计的应用场景。

不论在iOS还是安卓App上,接入微信H5支付都可能遇到各种各样的问题,所以微信官方文档提醒:

H5支付不建议在APP端使用,如需要在APP中使用微信支付,请接APP支付

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,100评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,862评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,993评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,309评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,303评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,421评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,830评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,501评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,689评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,506评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,564评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,286评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,826评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,875评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,114评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,705评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,269评论 2 341

推荐阅读更多精彩内容