百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Android WebView 调起H5支付,提示商家参数格式有误

zhezhongyun 2025-02-03 16:12 36 浏览


题记

—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每?天。

重要消息

精通点的可以查看这里 精述
https://gitbook.cn/gitchat/author/5ae043915efcf9715e37c733

Flutter 从入门实践到开发一个APP之UI基础篇 视频
https://edu.csdn.net/course/detail/25543

flutter从入门 到精通 系列文章
https://blog.csdn.net/zl18603543572/article/details/93532582

1 引言

场景描述:在APP 中使?webView 显示第三?H5, H5中涉及到微信?付流程,?法正常?付,提示 "商家参数格式有误,请联系商家解决"。

参照微信H5 ?付开发官??档

https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1

描述?


?般提示出错,我们可以先去微信商户管理平台查看配制,

https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F

当然出错后,也不急着去商户后台去查看配制,因为在开发微信?付功能初期这些都是已经配制好的,当然是在其平台?如 浏览器、Ios UIWebview 等都可以正常的调起?付,那说明在商户后台的配制是没有问题的,不过我们也可以再次去查看?下商户后台配制的具体值。

描述?

参照微信H5 ?付开发官??档常?问题

https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4


1 引?

1.1 线索分析


在?络发?变动的情况会出现此提示之?

也有提到 "如果是APP?调起H5?付,需要在webview中?动设置referer",具体内容如下

那么到这?,我们可以?动的在 Android WebView 中添加头 referer ,这个请求头

  • 简?之,HTTP Referer是header的?部分,当浏览器向web服务器发送请求的时候,?般会带上Referer,告诉服务器我是从哪个??链接过来的,服务器 籍此可以获得?些信息?于处理。?如从我主?上链接到?个朋友那?,他的服务器就能够从HTTP Referer中统计出每天有多少?户点击我主?上的链接访问他的?站。
  • Referer其实应该是英?单词Referrer,不过拼错的?太多了,所以编写标准的?也就将错就错了

在安卓WebView中?动配制请求头 referer

然后再次使? 安卓 WebView 来加载 H5 项?,然后发起微信?付,然后发起成功

分析:

当没有在Android WebView 中添加头 referer 请求头,同样的 H5 项?,分别在 在 Android WebView 、浏览器、ios UIWebVie 中访问打开,浏览器、ios UIWebVie 中,都可以正常调起?付,只有 Android WebView中微信?付调起失败,提示商家参数格式有误

当 在Android WebView 中添加头 referer(这个值对应的微信商户平台后台配制的值) 请求头,再次访问同样的 H5 项?,再次调起微信?付,成功。

然后使?抓包?式进?步分析:

在浏览器中对其加载?络分析

然后在 Android WebView 、ios UIWebView 中加载H5 项? 然后对 Android ios中的WebView 配制抓包代替,然后访问 H5 项?

得出结论 请求头 referer 并没有丢失,然后进?步 抓包分析得出结论 在 Android ios 中加载 H5 项?,请求头 referer配制的信息 与商户管理后台配制的??,并没有丢失或者是配制错误(当然在ios UIWebView 能?付成功也可以说明)

那么问题来了,在Android WebView 中 如果不配制 请求头 referer 调起失败,我们需要找出原因

在 Android WebView 中 没有设置 referer 请求 header 前

        mWebView.setWebViewClient(new WebViewClient() {
            @Override

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                
                //使用WebView加载显示url
                view.loadUrl(url);
                //返回true
                return true;
            }
            
            
            // Handle API 21+
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                ///获取请求uir
                String url = request.getUrl().toString();
                ///获取RequestHeader中的所有 key value
                Map lRequestHeaders = request.getRequestHeaders();
                for (Map.Entry lStringStringEntry : lRequestHeaders.entrySet()) {
                    Log.d("测试header", lStringStringEntry.getKey() + "  " + lStringStringEntry.getValue());
                }
                return super.shouldInterceptRequest(view, request);
            }
        });


然后 在控制台中查看 调起?付那?下请求的信息

对应的抓包?具中数据


分析数据 得出: 发起微信?付时 referer 丢失


https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id= 后?省略

然后在 Android 中?动配制 referer 后,H5 微信?付调起成功,抓包数据


        
        mWebView.setWebViewClient(new WebViewClient() {
        
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                
                try {
                    if (url.startsWith("http:") || url.startsWith("https:")) {
                        HashMap lStringStringHashMap = new HashMap<>();
                        if (!TextUtils.isEmpty(mReffer)) {
                            lStringStringHashMap.put("referer", mReffer);
                            view.loadUrl(url, lStringStringHashMap);
                        } else {
                            view.loadUrl(url, lStringStringHashMap);
                        }
                    } else {
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                    }
                    return true;
                } catch (Exception e) {
                
                }
                //使用WebView加载显示url
                view.loadUrl(url);
                //返回true
                return true;
            }
            
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();
            }
            
            
            // Handle API 21+
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                ///获取请求uir
                String url = request.getUrl().toString();
                ///获取RequestHeader中的所有 key value
                Map lRequestHeaders = request.getRequestHeaders();
                Log.e("测试URI",url);
                for (Map.Entry lStringStringEntry : lRequestHeaders.entrySet()) {
                    Log.d("测试header", lStringStringEntry.getKey() + "  " + lStringStringEntry.getValue());
                }
                if (lRequestHeaders.containsKey("Referer")) {
                    mReffer = lRequestHeaders.get("Referer");
                }
                return super.shouldInterceptRequest(view, request);
            }
        });

结论来了: 在调微信 H5 ?付

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb

请求头 referer 丢失 。

关于 Referer 丢失的问题

?先 referer 是由客户端的浏览器发送到服务器上,且在客户端可以通过 document.referrer 来获取,也就是说referer的发送实际上是?个浏览器?为,发送与否的决定权是在浏览器??。虽然这样说,但是HTTP协议对什么情况下,浏览器该发送,什么情况下不该发送有着严格的规定。

  • 1.当?站使?refresh字段进?跳转的时候,?多数浏览器不发送referer
  • 2.从?户从?个HTTPS的?站点击链接到另?个HTTP的?站时,不发送referer
  • 3.html5中,a标签的rel = "noreferrer", 可以让浏览器不发送referer
  • 4.使?Data URI scheme链接的,浏览器也不发送referer
  • 5.使?Content Security Policy, 也可以让浏览器不发送referer
  • 6.在html头部中使?meta标签来控制不让浏览器发送referer
  • 7.在发起?付的时候 android WebView 过滤了 referer,解决?式就是
///在H5项目中发起支付时 
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb

///一般可使用 但会导致 在 android WebView 中丢失referer

下?两种?式 android WebView 中不会丢失referer



    
document.form.method= "post"; document.form.action= "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?支付信息 "; document.form.submit();


jQuery动态创建form表单提交


    var action='https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?支付信息 ' 
    var form = $("
") form.attr('action', action) form.attr('method', 'post') //追加到body,不显示,然后提交 form.appendTo("body") form.css('display', 'none') form.submit()


2.2 分析? HTTPS变HTTP


有时候需要在API项?中?成?些URL链接返回 但是服务器端已经配置了?持HTTPS,通过HTTPS访问的时候?成的URL仍然是HTTP

从 HTTPS 站点跳到 HTTP 站点 丢失了 Referer,反过来从HTTP到HTTPS是没问题的 不会丢失 Referer

从前端请求到 API 整个都没有问题 全部项?已经全线部署了 HTTPS , Referer 信息也有携带 然后只有到最后?步微信的?付请求URL的时候 Referer 就丢失了

相关推荐

DNF无色流派还在继续,重力之泉龙战八荒测评

作者:礁石22222前言本篇为115级套装天天鉴栏目,来帮助各位读者对于新版本的装备有一个更清晰的认知。115级套装分为了稀有到太初5个品级,所有套装的稀有品级属性是一致的,从神器开始出现分歧。通过积...

《暗黑破坏神2重制版》常用符文之语P3

大家好我是游戏小白,继续补充一下《暗黑破坏神2重制版》常用的符文之语,主要给大家总结一下前期过渡常用符文之语。没看过之前关于符文之语总结的小伙伴可以翻翻前面的文章。1、钢铁符文之语钢铁造价极低但性价比...

魔兽怀旧服:P1一款法系BIS披风,获取方式隐蔽,需完成875个任务

在魔兽怀旧服WLK版本,依旧存在许多实用的制造业装备,特别是在P1阶段,制造业装备的耐用性和性价比是最高的,不仅可以帮助玩家快速过渡到团本,甚至还有个别制造业装备超越了团本掉落的强度,除了玩家近期讨论...

分手类型——过渡阶段

过度阶段一.内涵:类似于反复期,在这个阶段儿可能会出现两种可能性。1.感性想分手,但理性上舍不得。感性上我完全不想跟他相处,但理性上我又觉得他身上有很多对我有利的,对我未来有机会有利的东西。二.理性...

《最后的信仰》新手开局保姆级指南职业选择、属性加点与开荒策略

《最后的信仰》作为类魂动作游戏,开局选择直接影响开荒体验。本文针对新手玩家,从职业特性、属性分配到武器过渡,提炼高效开荒公式,助你避开陷阱,快速掌握战斗节奏。一、职业选择:斗士/盗贼优先,法系/...

DNF回血秘方揭示,夏日前买必看篇

作者:辽宁吴彦祖前言(省流速览)夏日礼包购买理由:夏日礼包是DNF四大礼包之一(新春&耕耘&夏日&金秋),错过销售日期后续想获得部分道具难度极大。主打暖暖时装、特色补齐、海量打...

DNF手游:55级粉装有大作用!强化继承大法,可节省大量幸运符

55级粉装的自身属性,实际上比较一般,但它可以用来作为“过渡胚子”,能够帮大家节省很多幸运符和宇宙精华!1、强化继承大法因为不断有玩家翻出了55级团本武器,这把武器肯定是当前版本毋庸置疑的版本答案,但...

魔兽世界50级职业任务装备如何选择,手把手教学

魔兽世界50级职业任务,我们装备应该如何选择,今天分身一个文章告诉你,我们知道BWL开放,也会开放50级的职业任务,那么50级的职业任务,对某些职业来说还是非常重要的,因为给的装备。有的甚至可以用到7...

暗牧的T5与散件如何取舍?认准自己的团队地位才最重要

牧师作为《魔兽世界》中的老牌职业历经许久已经收获了不少的信仰者,而在笔者看来牧师的最大特色便是风格完全不同的三系专精,在TBC时期,Raid本中的牧师大多为神牧,而戒律牧基本只活跃在竞技场和战场上,而...

DNF:魂异界传说宝珠曝光!属性设计一般般,男枪第五转职专属

魂异界地下城“炒冷饭”,定位新春活动副本,奖励道具覆盖面广,涉及白金徽章、转职书、矛盾材料等等。解锁魂异界次元等级,还能兑换传说宝珠,属性也逐渐浮出水面,却比较鸡肋,“抠门”发挥的淋漓尽致!太“抠门”...

SwiftUI入门五:让视图和过渡动起来

在使用SwiftUI的时候,无论效果在哪里,我们都可以单独的让视图的变化动起来,或者让视图的状态的变化动态化。SwiftUI会为我们处理那些组合的、层叠的以及可中断的动画的复杂性。在这个教程中,我们会...

DNF:又是变强的一年?2024耕耘礼包提升率揭晓

作者:assddde前言国服耕耘礼包的内容已经爆料了。对去年拉满耕耘的奶系职业的而言,今年的提升点为纹章加入了1%的增益量增幅。对C而言,今年换装称号中还加入了buff换装词条。而对于错过了新春套的C...

魔兽世界:TBC第一阶段还有必要刷T4套吗,D3套能否过渡到T5套?

T4套真的不如D3套?TBC怀旧服P1阶段目前已经走过大半,作为这个阶段装备等级最高的套装T4套装,游戏中有很大争议。比如猎人玩家会选择D3套,直接跳过T4到T5阶段,而法师甚至会选择继续使用T3套装...

《异世界勇者》390版本开荒&amp;毕业攻略——狂暴战

虽然说这个版本是防战的本命版本,但是从大家催更的频率来看,狂暴战依旧是碾压的优势,今天给大家分享一下390版本狂暴战的毕业游玩思路,希望对你有帮助。今天给大家带来的是手动速刷版的攻略,想要挂机过本需要...

飞飞重逢:装备属性卡全攻略,五色神卡助你战力飙升快速获取

在游戏中,装备属性卡是提升战斗力的关键道具,它能赋予装备特殊的元素属性,不仅大幅提升攻击力,还能针对不同怪物打出克制伤害。属性卡分为火、水、风、土、电五种元素,每种都能为装备附加独特的攻击特效。那么如...