摘要

微信h5支付测试时,发现使用Safari iframe的方式无法呼起微信app进行支付。本文首先讲述了微信支付的流程、随后进行了两个测试与网上的搜索等进行了一系列的探索,得到了可以证实的结论。

零、背景

微信h5支付流程如下图所示:
1、用户在商户侧完成下单,使用微信支付进行支付;
2、由商户后台向微信支付发起下单请求(调用统一下单接口);
3、统一下单接口返回支付相关参数给商户后台,包括:支付跳转url(参数名“mweb_url”);
4. 商户重定向到mweb_url,调起微信支付中间页,客户进行支付,点击支付完成回调到商户的买单页 or 商户指定的redirect_url,至此,客户端流程结束。
5. 其他流程,在此不解释。普通商户微信h5支付官方地址
【过程4解析】:当用户重定向到mweb_url后,微信会返回一个呼起微信app的scheme串,形如如下代码描述:

mweb_url串 : https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx06203454877852b3d995061c1369865961&package=2470898687
scheme串:weixin://wap/pay?prepayid%3Dwx06203454877852b3d995061c1369865961&package=2470898687&noncestr=1533558901&sign=06c9a12b39e341a2dfe9d68e470edbfa


微信h5支付(普通商户)流程

一、前序

在做微信的h5支付时,发现在Safari中使用iframe无法呼起微信客户端的问题。
现象A: h5支付,不使用iframe,直接redirect到预下单返回的mweb_url,火狐、chrome、Safari均可以呼起微信支付。
现象B: h5支付,使用iframe,将返回的mweb_url设置到iframe中的src,火狐、chrome均可以呼起微信支付,唯独Safari中无法呼起(ios的其他浏览器也做过尝试,是可以呼起的)。

现象A前端代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>spy test h5 pay</title>
</head>
<body><h1>h5 pay test</h1>
<p>测试商品 0.01元</p>
<form id="payFrom" name="payform" action="https://您的后台处理地址" method="post"><input type="text" name="operFlag" value="h5pay"><input type="button" style="background-image:url(wechaticon.png);" value="微信支付"></form>
</body>
</html>

现象A后端代码:

//与微信交互获取到mweb_url,在此省略
response.sendRedirect(mweb_url );//重定向

现象B前端代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>spy test h5 pay</title> <script src="/script/jquery-3.3.1.min.js"></script>
<script src="/script/jQuery.form.js"></script><script type="text/javascript">function submitform(){  $('#payForm').ajaxSubmit(  //ajax方式提交表单{url: '您的地址',type: 'post',dataType: 'json',success: function (data) {$('#payIframe').attr({"src":data.url});//src 是赋值成功的}})}</script>
</head>
<body><h1>h5 pay test</h1>
<p>测试商品 0.01元</p>
<iframe id="payIframe" name="payIframe" style="width:200px;height:200px" sandbox="allow-same-origin allow-top-navigation allow-forms allow-scripts"></iframe><form id="payForm" name="payForm" action="#" method="post" target="payIframe"><input type="text" name="operFlag" value="h5pay1">
</form>
<input type="button" style="background-image:url(wechaticon.png);" onclick="submitform()" value="微信支付">
</body>
</html>

现象B后端代码:

//与微信交互获取到mweb_url,在此省略
results = "{\"url\":\""+ mweb_url +"\"}";
response.setContentType("application/json;charset=UTF-8");
response.setHeader("catch-control", "no-catch");
PrintWriter out = response.getWriter();
out.write(results);
out.flush();
out.close();
return;  

可以看到现象B的form表单中,target是iframe,针对无法呼起来的原因,博主做了如下探索。

二、探索

在调试阶段,当我们使用mweb_url请求微信时,可以看到微信的返回中的一段代码:下图中url是呼起app的scheme串,赋值给了top.location.href,因为我们是从iframe发出去的,当response回来后,存在于iframe中,那么top.location 便指向了我们前端自己的jsp,即form所在的jsp中。随后,如图箭头所示,浏览器根据scheme协议,跳转到微信app,这个逻辑是没有任何问题的(至少其他浏览器总是可以呼起app的)。

测试1:

为了证明我的推理,由于微信的返回我们无法控制,于是拷贝了内容到h5wxjs.jsp,并alert top.location.href对象,如下是h5wxjs.jsp.

<script type="text/javascript">window.onload=function()
{var url="weixin://wap/pay?prepayid%3Dwx06203454877852b3d995061c1369865961&package=2470898687&noncestr=1533558901&sign=06c9a12b39e341a2dfe9d68e470edbfa";var redirect_url="";alert(top.location.href);//弹出2top.location.href=url;
}</script>

在测试的jsp中,引入h5wxjs.jsp:

var tmp_url = "https://你的地址/h5wxjs.jsp";
alert(location.href); //弹出1
$("#payIframe").attr("src",tmp_url);//src 是赋值成功的

测试发现,依然是其他浏览器均可以呼起app,而Safari无法呼起,同本文前序中的测试现象B,并且两次弹出都是同一个对象(注释的弹出1和弹出2)。

测试2:

我们抛弃h5wxjs.jsp,直接在测试jsp中做如下测试:

function submitform(){
var tmp_url ="weixin://wap/pay?prepayid%3Dwx06203454877852b3d995061c1369865961&package=2470898687&noncestr=1533558901&sign=06c9a12b39e341a2dfe9d68e470edbfa";location.href = tmp_url; //ok
//top.location.href=tmp_url; //ok
//window.location.href= tmp_url; //ok
// window.top.location.href = tmp_url;//ok
return;
}

实现证明,如上的4句赋值,包括Safari在内的所有浏览器均可以呼起微信app,同本文前序的测试现象A。

测试1和测试2证明了:

Safari做了安全控制,从iframe发出去的请求得到的response中,无法使用scheme协议呼起app。 此博文的博主也遇到了同样的问题,只不过是无法呼起支付宝app。参考:Safari iframe 无法呼起支付宝app
【备注:简书中 cls 的答复,其实并没有解决本质问题】
为了证明这点,我又使用苹果真机,Safari调试,可以看到请求微信后收到了response,但是并没有呼起微信app的过程。调试方法参考:苹果真机调试Safari

摘自网上的回复:



结论

  1. 使用scheme 协议呼起app,基本所有浏览器目前均是可以的。
  2. 使用iframe,scheme协议呼起app,Safari浏览器在ios9+系统后是行不通的,ios7\8还是可以的。
  3. 据说chrome 25以后也不会支持iframe内 scheme协议呼起app。
  4. 如果要在ios9+ 系统,Safari呼起app,可以使用universal link协议(博主没有亲自尝试)。
    univisal link唤起app
    univisal link解决呼起app可参考

感谢

在此特别感谢我师父陈立全、孙彦杰、白长昊同事,北京零度在线科技有限公司朋友的帮助。

Safari iframe方式无法呼起微信app之问题探索相关推荐

  1. 第三方(网页/小程序)唤醒微信app小结

    第三方(网页/小程序)唤醒微信app小结 在实际业务中,要在第三方网页或者小程序实现唤醒微信app,其实很简单,贴代码: <a href="weixin://">< ...

  2. JAVA微信APP支付接口整合

    2019独角兽企业重金招聘Python工程师标准>>> 上次我们看到了支付宝的APP支付工具,那么这次就来封装封装微信的APP支付;如果已经清楚了支付宝的支付流程,那么微信支付也和它 ...

  3. 第三方支付——微信app支付

    微信App支付 前言 本篇文章将结合自己实际开发经验,从一下几个方面介绍微信app支付,什么是微信app支付?支付流程是什么样的? 前期需要准备些什么?结合官方文档和实际代码带大家走流程. 正文 微信 ...

  4. 京东开普勒php接口,IOS菜鸟初学第十五篇:接入京东开普勒sdk,呼起京东app打开任意京东的链接-Go语言中文社区...

    我之前写了一篇关于接入京东联盟sdk的文章,但是最近,由于这个原因,如下图 导致需要重新集成京东的sdk,但是由于某种原因,因为android和ios端不统一,android接入的是京东开普勒的SDK ...

  5. 《移动App测试的22条军规》—App测试综合案例分析23.4节测试微信App的手势操作...

    本节书摘来自异步社区<移动App测试的22条军规>一书中的App测试综合案例分析,第23.4节测试微信App的手势操作,作者黄勇,更多章节内容可以访问云栖社区"异步社区" ...

  6. 微信支付来了,微信App来了,微信能力来了

    异常火爆的微信公众平台大会,传达出哪些信息? A-A+ 罗超 2013-11-19 07:07 57 微信腾讯投稿头条 5000人报名,400人参加的微信公众平台合作伙伴大会,异常火爆,连主办方在场外 ...

  7. 什么软件可以测试自己有没有近视,微信APP中怎么测试自己的视力

    现在很多人都是比较关注自己眼睛视力的,如果不好好保护自己的眼睛,是很容易导致眼睛近视近视的,而近视眼俗称为短视眼,只能够看清楚近距离的东西,远了就会看不清.可想而知这个对我们会造成多大的影响.很多人每 ...

  8. 使用Python操控手机微信app(最新教程)

    /1 前言/ 最近在做手机APP自动化测试,需要安appium,并配置环境变量,网上虽然有很多教程,但是随着版本的更新总有各种各样的坑,本文以亲身踏坑经历给大家详细介绍一下如何正确安装appium. ...

  9. Appium 手机 App 自动化代码说明_启动微信app

    #coding=utf-8 from appium import webdriver desired_caps = { 'platformName': 'Android', 'platformVers ...

最新文章

  1. centos 非root用户(普通用户)替换yum安装软件方法
  2. Python超简单容易上手的画图工具库
  3. 无法从“const char [10]”转换为“char *”
  4. 深入理解浏览器解析和执行过程
  5. C++中的4个类型转换关键字
  6. webpack+react+es6开发模式
  7. 整理的部分Java和C#不同点
  8. 【UVA12230】Crossing Rivers(概率/期望)
  9. matlab 绘制一个二维正弦曲线(repmat)
  10. 数据结构 复习攻略 新手必看
  11. FPGA——基于Verilog HDL语言的交通信号灯控制系统
  12. AndroMDA中的用例图和活动图介绍(MagicDraw)
  13. 写作之: 算法流程图latex代码和范例
  14. 浏览器播放RTSP视频流几种解决方案
  15. microchip-02之MCC工具安装
  16. 解决ERROR: Cannot uninstall ‘llvmlite‘. It is a distutils installed project and thus we cannot accurat
  17. 『python思考』关于列表的浅复制和深复制的理解
  18. 微软最爽命令行工具将成 Win11 默认终端
  19. root面具怎么授权,面具root权限
  20. 体重预测[线性回归]

热门文章

  1. Restful API是什么?初探Restful API,传统接口写法与Restful API接口写法区别
  2. 百度SEO:如何进行网站关键字挖掘!
  3. 回望2019:江城芜湖的“科技智变”
  4. 使用Word模板导出Word后,表格后面产生空白页
  5. YunOS切入智能家居 欲将人、物、服务三网合一
  6. 燕山大学数据结构与算法课程实践——ISBN号识别系统的设计与开发
  7. 全球及中国射频器件市场规模格局与投资战略决策报告2022版
  8. golang 升级到新版本_golang升级
  9. where 空集_空集MØ联手Snakehips好听虐心歌曲Don't Leave (别走)
  10. altera 设计--仿真--下载