微信小程序webview跳转外链安卓失败

问题描述

公司项目最近在对接工行聚富通支付通道,其中微信支付接口流程有点特殊:

需要调用工行的H5V3接口,这个接口是一个post请求,request body是一系列加密数据,响应结果是一个重定向的页面,页面内容是选择支付方式,选择完成后是一个重定向。

按照此要求,整理后有以下几个技术点(总结过程就不描述了):

  1. 由于从H5V3接口调用成功开始,都是一系列的重定向页面,所以只能使用小程序的外链跳转方式(也就是webview)进行;
  2. 由于H5V3接口是post接口,而webview只支持get方式提交数据,只能考虑由服务端提供一个get接口,返回一个页面,页面加载完成后自动请求H5V3接口;
  3. H5V3接口中参数需要进行加密、签名操作,且依赖后端配置项,也就意味着接口参数需要提前生成后传递给H5V3接口;

服务器返回一个页面

以下内容只在springboot项目中进行讨论,springMvc项目可以参考平移,其他项目参考使用
方式一:项目中使用引擎模板加载页面,并返回给前端
如果项目已经有模板引擎,此方式很简单;但是如果项目是严格前后端分离(所谓严格前后端分离是指,代码和部署都是分开两套内容)项目,使用此方法有点不合适。
方式二:由RestController接口以流的方式返回页面
很明显,作者使用就是改方法。其实实现方式也很简单:

  1. 设置响应的content-type为text/html;charset=utf-8;
    response.setContentType("text/html;charset=utf-8;");
  2. 将页面字符串写入响应体中
    response.getWriter().write(htmlString);

说明:

  1. content-type中的**charset=utf-8;**可选择性配置,如果页面无中文或无转码需求,这可省去;
  2. 页面内容可以是简单一套html标签,如<div>xxxxxxx</div> ,也可以是完整页面如:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
<div>
    <div style="margin: 200px auto; text-align: center">正在加载...</div>
</div>
<script>
    window.onload = function () {
        function submit() {
            console.log('........................');
        }
        submit();
    }
</script>
</body>
</html>
但是

测试完美通过,都按照预期进行跳转,然后就上线了。然后就不出意外的出意外了:苹果系统能正常跳转,安卓的卡在后端返回的页面上,既不显示页面内容,也没有往下跳转。一开始,以为是对方网络有问题,也没关注到系统差异。过了一天,运维同事来说,那个客户还是不跳转,一直在一个空白页上。然后看了同事的(苹果),能正常,不信邪,我自己来,然后我的手机也卡在了空白页上。小程序开发工具上正常跳转,想着是不是系统差异导致的,其他同事帮忙找了下资料,然后说conten-type不能加utf-8,但是毕竟本地是正常的,直接上生产测试好像不太科学。
然后突然想到个问题,既然这个空白页其实是一个外链,会不会是链接本身有问题,在微信浏览器中打开试试能不能正常?然后,安卓手机微信中点击这个webview链接地址提示一个“请使用浏览器打开下载文件 ”,同时卡在空白页面。
问题大概就出在这里了。既然定为到问题,那就能从本地确认了。

  1. 尝试去掉utf-8,然并卵。直接不会到controller
  2. 然后果断把参数全删了,进到controller;看来是请求参数的问题了。
  3. 分析参数构成:一个url地址(H5V3地址)、一个json字符串(H5V3参数) —> 可能是参数内容被认定为不安全,被拦了;参数内容换为简单参数,正常到controller; —> json数据截取一小段带特殊字符的数据,保留url完整数据 ----> 正常到达controller(其实内心已经猜到,大概率是因为数据量的问题)
问题找到了:因为数据量过大导致微信内置浏览器(安卓)认定其为一个文件,需要进行下载,不会将其作为一个http请求。

既然找到了问题,要解决就很简单了。把json数据扔到redis,然后给前端返回一个code,前端在请求这个页面时带上code,根据code从redis中获取到json数据,组装页面,返回给前端。完美解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值