小程序-<web-view>嵌套H5页面支付功能

背景:小程序未发布前,公司使用vue框架搭建了管理系统,为了减少开发成本,微信提供了web-view来帮助已有系统能在小程序上发布,详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能,导致用户体验很不友好,所以为了解决这个问题,本人研究了一下,以下是研究过程中遇到的问题及解决办法。

解决思路:用JSSDK接口提供的wx.miniProgram.navigato({url: url}),跳转到过渡页面wePay,在wePay.js中处理调取微信支付接口的功能,支付成功与否,跳转到小程序包含web-view页面,动态修改url,就可跳转到H5中的指定页面,

第一步:如何本地调试?

开启小程序<web-view src="{{ url }}">

开启vue页面,这个使用本地服务,把支付页面的地址,写入上面的 url 里面

第二步: 因vue中已经提供在微信中的支付功能,所以另外只需判断若在小程序中,如何进行支付。

vue中点击支付按钮后的操作如下:(ps:这里是围绕我的业务需求,提供思路,不是通用。关键词搜索: 重点)

//isInWeixin: function () {
//		let ua = window.navigator.userAgent.toLowerCase();
//		return (ua.match(/MicroMessenger/i) == 'micromessenger');
//	    },
//
//	isInWxMiniProgram: function () {
//		return window.__wxjs_environment === 'miniprogram';
//	},
data(){
 return{
     isInWxWeb: $.Util.isInWeixin() && !$.Util.isInWxMiniProgram(),
     isInMiniProgram: $.Util.isInWxMiniProgram(),
 }
}, 
doPayment () {
              if (this.paying) {
                  $.Msg.info('正在支付中...');
                  return;
              }
              // 检查积分
              if (this.paymentPointsSum && this.paymentPointsSum > this.memberPoints) {
                  $.Msg.error('您的积分不够了');
                  return;
              }
              // 检查金额
              if (this.paymentAmountSum < this.amountSumForVCard) {
                  $.Dlg.error('储值卡支付金额不能大于支付总金额');
                  return;
              }
              let paymentAmountForWx = $.Util.formatNum(this.paymentAmountSum - this.amountSumForVCard);
              if (paymentAmountForWx) {
                  if ( ! this.hasWxMchId) {
                      $.Dlg.error('该商户尚未申请开通微信支付权限,您还无法使用微信支付。');
                      return;
                  }

                  // if ( ! this.isInWxWeb) {
                  //     $.Dlg.error('请通过微信公众号进入系统,然后再通过微信支付。');
                  //     return;
                  // }
              }
              let productOrderList = [];
              for (let p of this.productList) {
                  if (p.productCnt > 0) {
                      productOrderList.push({productId: p.productId, count: p.productCnt});
                  }
              }
              let paymentCards = [], idx = 0;
              for (let mc of this.memberCardList) {
                  if (mc.payment && this.memberCardChecks[idx]) {
                      paymentCards.push({mcId: mc.mcId, amount: mc.payment});
                  }
                  idx++;
              }
              if (this.orderRemark && this.orderRemark.length > 500) {
                  $.Dlg.error('购买备注不能超过500字');
                  return;
              }
              let args = {
                  memberId: $.data.user.memberId,
                  productOrderList: productOrderList,
                  paymentMemberCardList: paymentCards,
                  orderRemark: this.orderRemark,
                  isFromMp: this.isInWxWeb ? null : true,
              };
              if (this.from && this.from === 'cart') {
                  args.from = 'cart';
              }
              this.paying = true;
              $.Req.service($.SvName.MALL_ORDER_CREATE, args, (ret) => {
                  if (ret.paymentCashAmount > 0) { // 启动微信支付
                      this.callWxPay(ret.orderId, ret);
                  } else {
                      this.paying = false;
                      $.Dlg.success('订单支付成功!');
                      this.$router.push('/mall/member-mall-order');
                  }
              }, true, (err) => {
                  $.Dlg.error(err);
                  this.paying = false;
              });
          },
          callWxPay (orderId, ret) {
              let args = {
                  "appId": ret.wxParam.appId,
                  "nonceStr": ret.wxParam.nonceStr,
                  "package": null,//重点:因小程序和维系公众号获取package方式不同,这里须分开赋值
                  "signType": ret.wxParam.signType,
                  "timeStamp": ret.wxParam.timeStamp,
                  "paySign": ret.wxParam.paySign,
              };
              let tradeNo = ret.wxParam.tradeNo;
              if(this.isInWxWeb){
                args.package = "prepay_id=" + ret.wxParam.prepayId
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest', args,
                    (res) => {
                      if (res.err_msg === "get_brand_wcpay_request:ok") {
                        let args2 = {tradeNo: tradeNo, orderId: orderId, from: this.from};
                        $.Req.service($.SvName.MALL_ORDER_PAY_FINISH, args2, (ret) => {
                          this.paying = false;
                          $.Dlg.success('订单支付成功!');
                          this.$router.push('/mall/member-mall-order');
                        });
                      } else {
                        $.Dlg.error('支付失败,请稍候重试。');
                        this.paying = false;
                      }
                    }
                );
              } else if(this.isInMiniProgram){
                args.package =  ret.wxParam.prepayId
//重点:作为路由参数,这里不能像上面一样'prepay_id=',因为要跳到小程序指定页面,小程序获取onload(options){} ,小程序会提前对路由参数进行处理,如,split('=')[0],只保留第一个“=”之前的字符串,之后的删除,所以这里不能有“=”,否则后面的参数全部都被删掉。
                  let payDataStr = JSON.stringify(args);//因为要把参数传递给小程序,所以这里需要转为字符串
                  const url = '../wePay/wePay?payDataStr='+ payDataStr;
                  wx.miniProgram.navigateTo({
                    url: url,
                  })
              }
            }

Page({
  data: {
    options: null
  },
  //h5传过来的参数
  onLoad: function(options) {
    this.setData({
      options: JSON.stringify(options),
    });
    // 字符串转对象
    // let payData = JSON.parse(options.payDataStr)
    // this.goPay(payData);
//测试支付成功与否返回参数以便跳转到H5指定页面
    this.payOkTo()
  },

  //微信支付
  goPay(payData) {
    wx.requestPayment({
      timeStamp: payData.timeStamp,
      nonceStr: payData.nonceStr,
      package: 'prepay_id=' + payData.package,
      signType: payData.signType,
      paySign: payData.paySign,
      success(res) {
        console.log("支付成功", res)
        //你可以在这里支付成功以后,再跳会webview页,并把支付成功状态传回去
        wx.navigateTo({
          url: '../page/home?payOk=true',
        })
      },
      fail(res) {
        console.log("支付失败", res)
      }
    })
  },
  payOkTo(){
//测试支付成功与否返回参数以便跳转到H5指定页面
    wx.navigateTo({
      url: '../page/home?payOk=true',
    })
  },
})

 页面之间跳转是没问题的,因后台接口也改了,要等老板上线了再做调试了。

闲言碎语,萝莉八所来一点:

1、三人行,必能有人帮我,多和同事交流,省很多事情。

 开发者工具中,web-view中的h5页面若想看到打印日志,那是看不到的,于是和同事说了一下问题,他之前遇到过,和我说可以在vue中install vconsole试试。

2、多听听别人的意见,不能闭门造车,

我固执己见的反驳了同事的建议,最后啪啪打脸,确实可以看到打印日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/768000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 输入系统 InputStage

整体流程如上所说&#xff0c;简要归纳如下&#xff1a; 输入法之前的处理 输入法处理 输入法之后处理 综合处理 InputStage将输入事件的处理分成若干个阶段&#xff08;Stage&#xff09;, 如果当前有输入法窗口&#xff0c;则事件处理从 NativePreIme 开始&#xff0c;否…

Flink 窗口触发器(Trigger)(一)

Flink 窗口触发器(Trigger)(一) Flink 窗口触发器(Trigger)(二) Flink的窗口触发器&#xff08;Trigger&#xff09;是流处理中一个非常关键的概念&#xff0c;它定义了窗口何时被触发并决定触发后的行为&#xff08;如进行窗口数据的计算或清理&#xff09;。 一、基本概念 …

AC7801时钟配置流程

一 默认配置 在启动文件中&#xff0c;已经对时钟进行了初始化&#xff0c;默认按外部8M晶振&#xff0c;配置系统时钟为48MHZ&#xff0c;APB为系统时钟的2分频&#xff0c;为24MHZ。在system_ac780x.c文件中&#xff0c;可以找到下面这个系统初始化函数&#xff0c;里面有Se…

力扣hot100-普通数组2

文章目录 题目&#xff1a;轮转数组方法1-使用额外的数组方法2-三次反转数组 除自身以外数组的乘积方法1-用到了除法方法2-前后缀乘积法 题目&#xff1a;轮转数组 原题链接&#xff1a;轮转数组 方法1-使用额外的数组 方法1是自己写出来的。方法2参考的别人的&#xff0c;…

守护创新之魂:源代码防泄漏的终极策略

在信息化快速发展的今天&#xff0c;企业的核心机密数据&#xff0c;尤其是源代码&#xff0c;成为了企业竞争力的关键所在。然而&#xff0c;源代码的泄露风险也随之增加&#xff0c;给企业的安全和发展带来了巨大威胁。在这样的背景下&#xff0c;SDC沙盒作为一种创新的源代码…

C++——stack和queue类用法指南

一、stack的介绍和使用 1.1 stack的介绍 1、stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行插入与提取操作 2、stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&am…

imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)

1.应用层如何操控PWM&#xff1a; 与 LED 设备一样&#xff0c; PWM 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX&#xff08;X 表示数字 0~7&#xff09;命名的文件夹&#xff0c;这八个文件夹其实就对应了…

同样的APP为何在Android 8以后网络感觉变卡?

前言 在无线网络技术不断发展的今天&#xff0c;Wi-Fi已经成为了我们日常生活中不可或缺的一部分。无论是家庭娱乐、办公还是在线游戏&#xff0c;Wi-Fi都在提供着便捷的互联网接入服务。然而&#xff0c;在安卓8.1后&#xff0c;为了进一步延长安卓设备的待机时间。原生安卓(A…

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘&#xff0c;在目前教新的电脑中选中GPT作为分区&#xff0c;制作启动盘&#xff0c;其中在安装双系统Ubuntu时&#xff0c;以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接&#xff1a;内含详细安装过程&…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…

哈哈看到这条消息感觉就像是打开了窗户

在这个信息爆炸的时代&#xff0c;每一条动态可能成为我们情绪的小小触发器。今天&#xff0c;当我无意间滑过那条由杜海涛亲自发布的“自曝式”消息时&#xff0c;不禁心头一颤——如果这是我的另一半&#xff0c;哎呀&#xff0c;那画面&#xff0c;简直比烧烤摊还要“热辣”…

Qt安装配置教程

目录 一、下载Qt二、进行安装1、点击安装包&#xff08;QT6.7版本演示&#xff09;2、注册Qt账号3、选择安装的位置4、选择对应的组件 三、新建项目1、打开Qt Creator2、创建项目3、编辑名称和地址4、选择默认的CMake或切换成qmake构建5、选择自己的编译器&#xff0c;在此选择…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

jdk动态代理-基于反射的动态代理

JDK动态代理的示例图&#xff0c;下图的绿色箭头表示实现的关系&#xff0c;白色虚线表示依赖关系&#xff0c;target表示被ProxyFactory的target成员表示代理类对象&#xff0c;由ProxyFactory传入的Object参数初始化&#xff0c;接着调用getProxyInstance函数利用反射来返回代…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

02:项目1 (按键点灯)

按键点灯 1、嘉立创EDA的简要介绍2、硬件的选型与原理图设计3、PCB设计4、下单啦 1、嘉立创EDA的简要介绍 1、EDA的基础设置 2、新建工程 2、硬件的选型与原理图设计 ①在EDA软件按下 shiftf 打开嘉立创商城&#xff0c;然后在里面选型 ②打开数据手册&#xff0c;能看到基本…

【FDTD 仿真案例解析】

平面结热电子光探测器是一种基于热电子效应的光探测器&#xff0c;其工作原理是利用光子的能量激发金属表面的热电子&#xff0c;从而产生电流。 激发光学Tamm态是指在金属-介质结界面上的电磁场分布出现共振现象&#xff0c;形成一种特殊的表面态。这种表面态具有高度局域化的…

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Spark join数据倾斜调优

Spark中常见的两种数据倾斜现象如下 stage部分task执行特别慢 一般情况下是某个task处理的数据量远大于其他task处理的数据量&#xff0c;当然也不排除是程序代码没有冗余&#xff0c;异常数据导致程序运行异常。 作业重试多次某几个task总会失败 常见的退出码143、53、137…