微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析


Posted in Javascript onAugust 16, 2019

前言

小程序支持webview以后,我们开发的好多h5页面,就可以直接在小程序里使用了,比如我们开发的微信商城,文章详情页,商品详情页,就可以开发一套,多处使用了。我们今天来讲一讲。在小程序的webview里实现微信支付功能。因为微信不允许在小程序的webview里直接调起微信支付。所以我们这节课就要涉及到小程序和webview的交互了。

老规矩先看效果。

因为这里涉及的东西比较多,录gif太多,没法上传,我就录制了一段视频出来。

https://v.qq.com/x/page/t0913iprnay.html

原理

先说下实现原理吧,实现原理就是我们在webview的h5页面里实现下单功能,然后点击支付按钮,我们点击支付按钮的时候会跳转到小程序页面,把订单号,订单总金额,传递到小程序里,然后小程序里使用订单号和订单金额去调起微信支付,实现付款,付款成功或者失败时都会有回调。我们再把对应的回调传递给webview,刷新webview里的订单和支付状态。

一,定义webview显示h5页面

关于webview的使用,我就不做讲解了,官方文档里写的很清楚,用起来也很简单。

https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

webview很简单,就是用一个webview组件,显示我们的网页。

二,定义h5页面

我这里启动一个本地服务器,用来展示一个简单的h5页面。

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

上图是我在浏览器里显示的效果。

接下来我们在小程序的webview里显示这个页面,也很简单,只需要把我们的src定义为我们的本地网页链接就可以了。

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

这里有一点需要注意

因为我们是本地链接,我们需要到开发者工具里把这一项给勾选。

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

三,来看下h5页面代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>小程序内嵌webview</title>
  <style>
    .btn {
      font-size: 70px;
      color: red;
    }
  </style>
</head>
<body>
<h1>我是webview里的h5页面</h1>
<a id="desc" class="btn" onclick="jumpPay()">点击支付</a>

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
<script>
  console.log(location.href);
  let payOk = getQueryVariable("payOk");
  console.log("payOk", payOk)
  if(payOk){//支付成功
    document.getElementById('desc').innerText="支持成功"
    document.getElementById('desc').style.color="green"
  }else{
    document.getElementById('desc').innerText="点击支付"
  }
  //获取url里携带的参数
  function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split("=");
      if (pair[0] == variable) {
        return pair[1];
      }
    }
    return (false);
  }
  function jumpPay() {
    let orderId = Date.now();//这里用当前时间戳做订单号(后面使用你自己真实的订单号)
    let money = 1;//订单总金额(单位分)
    let payData = {orderId: orderId, money: money};

    let payDataStr = JSON.stringify(payData);//因为要吧参数传递给小程序,所以这里需要转为字符串
    const url = `../wePay/wePay?payDataStr=${payDataStr}`;
    wx.miniProgram.navigateTo({
      url: url
    });
    // console.log("点击了去支付", url)
    console.log("点击了去支付")
  }
</script>
</body>
</html>

h5代码这里不做具体讲解,只简单说下。我们就是在点击支付按钮时,用当前时间戳做为订单号(因为订单号要保证唯一),然后传一个订单金额(单位分),这里节约起见,就传1分钱吧,花的是自己的钱,心疼。。。。

关键点说一下

1, 必须引入jweixin,才可以实现h5跳转小程序。

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>

2,跳转到小程序页面的方法

const url = `../wePay/wePay?payDataStr=${payDataStr}`;
wx.miniProgram.navigateTo({
   url: url
 });

这里要和你小程序的页面保持一致。payDataStr是我们携带的参数

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

四,小程序支付页

来看下我们的小程序支付页

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

小程序支付页功能很简单,就是来接收我们h5传过订单号和订单金额。然后去调起微信支付,实现支付。支付成功和支付失败都有对应的回调。

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

支付我们这里实用的小程序云开发来实现的支付,核心代码只有10行。由于支付不是本节的重点,所以这里不做具体讲解。感

兴趣的同学可以去看我写的文章和我录的视频

小程序支付文章:https://www.jianshu.com/p/2b391df055a9

小程序支付视频:https://edu.csdn.net/course/play/25701/310742

下面把小程序接收参数和支付的完整代码贴出来给大家

Page({
 //h5传过来的参数
 onLoad: function(options) {
  console.log("webview传过来的参数", options)
  //字符串转对象
  let payData = JSON.parse(options.payDataStr)
  console.log("orderId", payData.orderId)

  let that = this;
  wx.cloud.callFunction({
   name: "pay",
   data: {
    orderId: payData.orderId,
    money: payData.money
   },
   success(res) {
    console.log("获取成功", res)
    that.goPay(res.result);
   },
   fail(err) {
    console.log("获取失败", err)
   }
  })
 },

 //微信支付
 goPay(payData) {
  wx.requestPayment({
   timeStamp: payData.timeStamp,
   nonceStr: payData.nonceStr,
   package: payData.package,
   signType: 'MD5',
   paySign: payData.paySign,
   success(res) {
    console.log("支付成功", res)
    //你可以在这里支付成功以后,再跳会webview页,并把支付成功状态传回去
    wx.navigateTo({
     url: '../webview/webview?payOk=true',
    })
   },
   fail(res) {
    console.log("支付失败", res)
   }
  })
 }
})

代码里注释很清楚,这里有一点,就是我们支付成功后,需要告诉h5我们支付成功了,通知h5去刷新订单或者支付状态。

到这里我们就完整的实现了小程序webview展示h5页面,并且做到了h5和小程序的交互,实现了小程序webview的支付功能。
是不是很简单呢。

源码地址

https://github.com/qiushi123/xiaochengxu_demos

微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于JavaScript中原型继承中的一点思考
Jul 25 Javascript
页面只能打开一次Cooike如何实现
Dec 04 Javascript
多引号嵌套的变量命名的问题
May 09 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
jQuery的几个我们必须了解的特点
May 03 Javascript
Angular4 中常用的指令入门总结
Jun 12 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
Oct 26 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
Mar 25 Javascript
VueQuillEditor富文本上传图片(非base64)
Jun 03 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
Aug 16 #Javascript
jQuery zTree插件使用简单教程
Aug 16 #jQuery
微信小程序 如何保持登录状态
Aug 16 #Javascript
JS事件流与事件处理程序实例分析
Aug 16 #Javascript
javascript事件监听与事件委托实例详解
Aug 16 #Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
Aug 16 #Javascript
详解Vue中组件传值的多重实现方式
Aug 16 #Javascript
You might like
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
require.js的用法详解
2015/10/20 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
Python多层装饰器用法实例分析
2018/02/09 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python实现DDos攻击实例详解
2019/02/02 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
高中课前三分钟演讲稿
2014/08/18 职场文书
成绩报告单家长评语
2014/12/30 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang