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

news2024/10/6 19:59:58

背景:小程序未发布前,公司使用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、多听听别人的意见,不能闭门造车,

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

湖北建筑安全员A证跨省调出审核不通过?可能是这些原因

湖北建筑安全员A证跨省调出审核不通过&#xff1f;可能是这些原因 湖北建筑安全员A证跨省调出审核不通过怎么办&#xff1f; 湖北建筑安全员ABC正常情况下都是可以跨省调出的&#xff0c;现在建筑三类人员安全员ABC在全国工程质量安全监管信息平台都是可以查询的&#xff0c;在…

offer150-16:数值的整数次方

题目描述:实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。 分析&#xff0c;题目要求实现库函数pow(),由于不需要考虑大数问题&#xff0c;不必担心溢出&#xff0c;那么就需要对输入的各种情况进…

LeetCode热题100刷题3:3. 无重复字符的最长子串、438. 找到字符串中所有字母异位词、560. 和为 K 的子数组

3. 无重复字符的最长子串 滑动窗口、双指针 class Solution { public:int lengthOfLongestSubstring(string s) {//滑动窗口试一下//英文字母、数字、符号、空格,ascii 一共包含128个字符vector<int> pos(128,-1);int ans 0;for(int i0,j0 ; i<s.size();i) {//s[i]…

【Python网络通信】基于Bypy调用百度网盘api实现自动上传和下载网盘文件

网盘对于大家的生活工作可以说是息息相关&#xff0c;但是如果每天都重复去上传下载文件就会很浪费时间&#xff0c;所以有没有什么办法可以解放双手&#xff1f;那就是网盘接口&#xff0c;本文通过Bypy库实现百度网盘的自动上传和下载文件。 原创作者&#xff1a;RS迷途小书童…

java 面试题 - 索引

上脑图&#xff0c;大家要记住&#xff01;&#xff01; 看不清&#xff0c;上大图&#xff01; 这几总结就够用&#xff01;&#xff01;

SpringBoot苏桦旅游管理系统-计算机毕业设计源码02123

摘要 旅游业在全球范围内不断发展&#xff0c;为了提供高效的旅游管理和服务&#xff0c;开发一个旅游管理系统具有重要意义。本文旨在设计和实现该旅游管理系统&#xff0c;以满足用户和管理员的需求。该系统采用Spring Boot作为后端框架&#xff0c;利用其简化的开发流程和强…

六、【源码】应用上下文

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/06-application-context 应用上下文 实现应用上下文的核心类&#xff1a; 1.ApplicationContext&#xff1a;Spring 应用上…

java设计模式(五)建造者模式(Builder Pattern)

1、模式介绍&#xff1a; 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你创建一个复杂对象的表示&#xff0c;同时隐藏了创建细节。该模式将对象的构建过程和表示分离&#xff0c;使得相同的构建过程可以创建不同的表示。 2、应…

如何选择适合自己的巴比达内网穿透方案

选择适合自己的巴比达内网穿透方案&#xff0c;需要考虑几个关键因素&#xff0c;包括您的具体需求、安全性要求、技术水平以及预算。以下是一些选择巴比达内网穿透方案的建议步骤&#xff1a; 1. 确定需求和用途 首先&#xff0c;需要明确您希望通过内网穿透实现的具体目标和…

项目实战-MySQL极佳优化方案---前缀索引

一、应用背景 由于公司项目数据量较大&#xff0c;开发小程序和APP过程中&#xff0c;SQL查询超过1.5s以上的等待时间&#xff0c;因此需要对SQL或者数据表结构设计进行优化。就不讲SQL语句优化啦&#xff0c;而是记录一下数据表结构设计优化的前缀索引实现。 二、MySQL索引 …

Transformer拆积木

文章目录 ConceptsEmbeddingEncoderDecoderSelf-Attention matric calculationFinal Linear and Softmax LayerLoss function 参考 学一下已经问鼎中原七年之久的Transformer Concepts 开始拆积木&#xff01; Embedding Encoder Decoder Self-Attention matric calculati…

PHP房产小程序微信小程序系统源码

&#x1f3e0;—— 购房租房&#xff0c;一“指”搞定&#x1f3e1; &#x1f50d;【开篇&#xff1a;房产新视界&#xff0c;尽在掌握】 在这个信息爆炸的时代&#xff0c;找房子不再是一场漫长的奔波。有了“房产微信小程序”&#xff0c;无论是购房还是租房&#xff0c;都…

如何从Salesforce顾问转型为解决方案架构师?

在充满活力的Salesforce咨询领域&#xff0c;许多专业人士都希望从顾问转型为解决方案架构师。这种转型不仅需要掌握新技能&#xff0c;还需要从根本上改变思维方式。关键在于摆脱顾问典型的以职能为中心的思维模式&#xff0c;拥抱更广阔、更具战略性的视角。 从“如何”到“…

手把手教你在QQ微信上AI变声器安装和使用(软件下载)

获取方式&#xff1a;点击下载 你相信互联网上还有真的东西么&#xff1f;我反正越来越不相信了&#xff01; 比如&#xff0c;和你在网上眉来眼去语音撩骚的小姐姐&#xff0c;可能就是一个抠脚大汉。 而抠脚大汉&#xff0c;也可以是一个漂亮的小姐姐。 o(*&#xffe3;︶…

发表EI论文相当于SCI几区?

EI&#xff08;工程索引&#xff09;本身并不进行分区&#xff0c;它是一个收录工程领域高质量文献的数据库&#xff0c;与SCI&#xff08;科学引文索引&#xff09;的分区制度不同。然而&#xff0c;在非正式的学术评价中&#xff0c;有时人们会将EI与SCI的分区进行比较。 虽…

西南交通大学【算法分析与设计实验2】

实验2.3 m_Coloring算法时间复杂性分析 实验目的 &#xff08;1&#xff09;实验比较数据输入规模对算法执行时间的影响。 &#xff08;2&#xff09;实验比较不同算法对问题求解时间的影响。 &#xff08;3&#xff09;掌握算法时间效率的分析方法。 实验任务 &#xff0…

SwinIR: Image Restoration Using Swin Transformer(ICCV 2021)含代码复现

目录 一、Introduction 1 Motivation 2 Contribution 二、原理分析 1 Network Architecture 1&#xff09;Shallow feature extraction 2) deep feature extraction 3) image reconsruction modules 4) loss function 2 Residual Swin Transformer Block 三、实验结果…

认识String类

文章目录 String类字符串的遍历字符串的比较字符串的替换字符串的转换字符串的切割字符串的切片字符串的查找 总结 String类 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提 供的字符串系列函数完…

vue3实现echarts——小demo

版本&#xff1a; 效果&#xff1a; 代码&#xff1a; <template><div class"middle-box"><div class"box-title">检验排名TOP10</div><div class"box-echart" id"chart1" :loading"loading1"&…