查看: 842|回复: 0

小程序web-view网页实现微信支付

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2024-5-26 12:56:16 | 显示全部楼层 |阅读模式
web-view网页中可使用JSSDK 1.3.2提供的接口返回小程序页面。 支持的接口有:
  1. 1、wx.miniProgram.navigateTo;
  2. 2、wx.miniProgram.navigateBack;
  3. 3、wx.miniProgram.switchTab;
  4. 4、wx.miniProgram.reLaunch;
  5. 5、wx.miniProgram.redirectTo;
  6. 6、wx.miniProgram.postMessage;
  7. 7、wx.miniProgram.getEnv;
复制代码
h5网页中的js代码示例:
  1. // <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>

  2. // javascript
  3. wx.miniProgram.navigateTo({url: '/path/to/page'})
  4. wx.miniProgram.postMessage({ data: 'foo' })
  5. wx.miniProgram.postMessage({ data: {foo: 'bar'} })
  6. wx.miniProgram.getEnv(function(res) { console.log(res.miniprogram) })
复制代码

小程序中使用webview组件很简单,如上图所示
这里使用本地服务器,用来展示简单的h5网页,如下图:

这是在浏览器中访问的页面展示

这是在小程序web-view组件中访问h5页面,需要注意的是本地开发注意在小程序中勾选不校验合法域名,不然需要先在小程序后台配置业务域名
H5页面代码如下:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>小程序内嵌webview</title>
  6.     <style>
  7.         .btn {
  8.             font-size: 70px;
  9.             color: red;
  10.         }
  11.     </style>
  12. </head>
  13. <body>
  14. <h1>我是webview里的h5页面</h1>
  15. <a id="desc" class="btn">点击支付</a>

  16. <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
  17. <script>
  18.     console.log(location.href);

  19.     let payOk = getQueryVariable("payOk");
  20.     console.log("payOk", payOk)

  21.     if(payOk){//支付成功
  22.         document.getElementById('desc').innerText="支持成功"
  23.         document.getElementById('desc').style.color="green"
  24.     }else{
  25.         document.getElementById('desc').innerText="点击支付"
  26.     }

  27.     //获取url里携带的参数
  28.     function getQueryVariable(variable) {
  29.         var query = window.location.search.substring(1);
  30.         var vars = query.split("&");
  31.         for (var i = 0; i < vars.length; i++) {
  32.             var pair = vars[i].split("=");
  33.             if (pair[0] == variable) {
  34.                 return pair[1];
  35.             }
  36.         }
  37.         return (false);
  38.     }

  39.     function jumpPay() {
  40.         let orderId = Date.now();//这里用当前时间戳做订单号(后面使用你自己真实的订单号)
  41.         let money = 1;//订单总金额(单位分)
  42.         let payData = {orderId: orderId, money: money};

  43.         let payDataStr = JSON.stringify(payData);//因为要把参数传递给小程序,所以这里需要转为字符串
  44.         const url = `../wePay/wePay?payDataStr=${payDataStr}`;
  45.         wx.miniProgram.navigateTo({
  46.             url: url
  47.         });
  48.         // console.log("点击了去支付", url)
  49.         console.log("点击了去支付")
  50.     }
  51. </script>
  52. </body>
  53. </html>
复制代码
上述h5代码暂时无啥可讲的,我们使用了当前的时间戳作为订单号,然后传入一个1分钱,将参数传递给小程序需要使用JSON.stringify将参数转为字符串。

该页面必须引入jweixin-1.3.2.js,否则无法使用网页跳转小程序,H5页面跳转小程序的方法如下:

  1. const url = `../wePay/wePay?payDataStr=${payDataStr}`;
  2. wx.miniProgram.navigateTo({
  3.       url: url
  4. });
复制代码
这里要和小程序页面保持一致,payDataStr是我们要传入小程序的参数。

这是小程序页面中的支付目录
来看看小程序支付js文件代码:

这就是小程序中接受h5传参的js支付代码
小程序中获取到订单号,然后通过小程序端取得支付参数然后调用wx.requestPayment()方法,如下图:


这是在小程序中自定义了支付函数
小程序支付JS端完整代码如下:

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

  8.     let that = this;
  9.     wx.cloud.callFunction({
  10.       name: "pay",
  11.       data: {
  12.         orderId: payData.orderId,
  13.         money: payData.money
  14.       },
  15.       success(res) {
  16.         console.log("获取成功", res)
  17.         that.goPay(res.result);
  18.       },
  19.       fail(err) {
  20.         console.log("获取失败", err)
  21.       }
  22.     })
  23.   },

  24.   //微信支付
  25.   goPay(payData) {
  26.     wx.requestPayment({
  27.       timeStamp: payData.timeStamp,
  28.       nonceStr: payData.nonceStr,
  29.       package: payData.package,
  30.       signType: 'MD5',
  31.       paySign: payData.paySign,
  32.       success(res) {
  33.         console.log("支付成功", res)
  34.         //你可以在这里支付成功以后,再跳会webview页,并把支付成功状态传回去
  35.         wx.navigateTo({
  36.           url: '../webview/webview?payOk=true',
  37.         })
  38.       },
  39.       fail(res) {
  40.         console.log("支付失败", res)
  41.       }
  42.     })
  43.   }
  44. })
复制代码
源码地址:https://github.com/qiushi123/xiaochengxu_demos

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部