评论

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

小程序webview内实现微信支付

小程序支持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很简单,就是用一个webview组件,显示我们的网页。

二,定义h5页面

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

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

这里有一点需要注意

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

三,来看下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是我们携带的参数

四,小程序支付页

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

小程序支付页功能很简单,就是来接收我们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的支付功能。
是不是很简单呢。

源码地址

1,关注“编程小石头”公号,回复“webview”即可获取源码

2,也可以到我github下载源码

https://github.com/qiushi123/xiaochengxu_demos

点赞 8
收藏
评论

17 个评论

  • hello Sydney
    hello Sydney
    11-01

    如果h5是从好几级进来的,支付成功后跳转的页面,再返回,之前的层级页面就没了呀,A--B--C(支付)。只能回到C,AB页面就消失了呀

    11-01
    赞同
    回复
  • 浪里小白龙
    浪里小白龙
    04-24

    这里有个体验不好的地方,

    就是支付完成回到webview页面,

    页面刷屏重新加载页面。

    有没有不重新加载,就同步支付状态的方法?

    04-24
    赞同
    回复 1
    • 雷疯
      雷疯
      06-06
      如果是H5显示支付结果或处理订单状态等操作可能真没啥好办法,除非业务都迁移到小程序里。
      06-06
      回复
  • 都是夜归人
    都是夜归人
    2023-08-12

    我的自定义tabBar加H5 就会被全屏,tabBar被遮挡,楼主怎么实现的呀?或者发下代码块;谢谢

    2023-08-12
    赞同
    回复 1
    • 小葱
      小葱
      04-29
      请问您解决这个问题了吗?我也遇到这个问题
      04-29
      回复
  • 🇧 🇴 🇼 🇪 🇳
    🇧 🇴 🇼 🇪 🇳
    2021-09-07
    请问小程序向H5可以传递数组对象吗?我在小程序JSON.stringify(res.data)
    H5页面JSON.parse(pdfList) 然后就给我报错了  请问怎么传递数组对象啊
    


    2021-09-07
    赞同
    回复 1
    • 川
      2022-01-17
      这个应该要pdfList.data吧,pdfList不是JSON对象
      2022-01-17
      回复
  • 貌似祸害
    貌似祸害
    2020-09-11

    h5主体和小程序主体不一样的时候怎么办呢

    2020-09-11
    赞同
    回复 3
    • wj
      wj
      2020-09-14
      这个有结论不?费用到小程序还是H5了?
      2020-09-14
      回复
    • 貌似祸害
      貌似祸害
      2020-11-02回复wj
      我们后来还是把支付页做成原生的了,在webview里跳转对应的支付页
      2020-11-02
      回复
    • 🐠
      🐠
      2021-03-08回复wj
      费用如何到H5能做吗
      2021-03-08
      回复
  • 阿巴阿巴
    阿巴阿巴
    2020-07-06

    成功了吗?

    2020-07-06
    赞同
    回复
  • core
    core
    2020-07-02

    今天试了下,小程序webview中能唤起h5的支付了。问了微信研发部的人,说没有做限制。都不知道什么时候可以了,记得以前一直不可以

    2020-07-02
    赞同
    回复 7
    • 骄阳
      骄阳
      2020-07-06
      请问,你说的H5的支付,是公众号支付还是小程序支付
      2020-07-06
      回复
    • core
      core
      2020-07-06回复骄阳
      公众号
      2020-07-06
      回复
    • 正在输入_
      正在输入_
      2020-07-14
      你们在正式环境下也可以唤起支付吗?我勾选不校验合法域名和业务域名可以正常,不勾选就会提示access_denied .合法域名和业务域名都有配置
      2020-07-14
      回复
    • core
      core
      2020-07-15回复正在输入_
      在正式环境,微信禁用了部分api
      2020-07-15
      1
      回复
    • 跌
      2020-07-30
      意思是正式环境webview还是不能直接使用h5支付了?
      2020-07-30
      回复
    查看更多(2)
  • Chya
    Chya
    2020-06-16

    是怎么做到本地开发的。。我的关注点比较奇特

    2020-06-16
    赞同
    回复
  • Admin ²º²⁴
    Admin ²º²⁴
    2020-05-08

    这个模式,本质上还是小程序支付的吧?没有到H5支付?

    2020-05-08
    赞同
    回复
  • 2020-04-21

    楼主这个功能有上线的小程序吗

    2020-04-21
    赞同
    回复

正在加载...

登录 后发表内容