小程序-<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.prepayIdWeixinJSBridge.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.mzph.cn/bicheng/39780.shtml

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

相关文章

AIGC对设计行业的影响与启发:AIGC设计能替代真正的设计师吗?

随着科技的飞速发展&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术在设计行业的应用日益广泛&#xff0c;引发了广泛的讨论和关注。AIGC以其高效、多样化的生成能力&#xff0c;为设计行业带来了前所未有的变革。然而&#xff0c;关于AIGC是否能替代真正的设计…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

从 ClickHouse 到 Apache Doris:快成物流的数智化货运应用实践

导读&#xff1a;随着快成物流的大宗商品产业链的不断发展&#xff0c;货运轨迹规划和实时数据分析的需求日益迫切&#xff0c;为了保障数据报表更新、用户画像圈选与物流轨迹实时更新等大数据核心系统性能&#xff0c;快成物流引入 Apache Doris 实时数仓升级了大数据算法平台…

这才叫必备软件推荐 你不能不知道的mac软件 Mac上有什么实用的必备软件 Mac常用必备软件推荐 一些好用的Mac软件

Mac OS是一个类Unix系统&#xff0c;内置终端Shell&#xff0c;这使得它天生就适合为程序员、开发者、设计者所用。不得不说苹果对用户体验的追求已经到了极致。遂开本篇&#xff0c;由于应用众多&#xff0c;一锅炖不下&#xff0c;故打算做一个系列。 下面为大家一一介绍一些…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Unity2D - 状态机(State Machine)详解

1. 状态机概述 在角色的生成中&#xff0c;由于事件的不同&#xff0c;动作的不同&#xff0c;角色会处于不同的状态中。例如对战冒险游戏&#xff0c;面临Boss的攻击&#xff0c;角色会受到例如中毒&#xff0c;恐惧等Debuff效果&#xff0c;若单纯的在一个脚本中使用if等语句…

绝地求生PUBG怎么领取补偿G币 补偿G币什么时候到账

绝地求生这款大逃杀射击游戏相信大家都不陌生&#xff0c;在之前的新版本NewJeans联动中&#xff0c;由于一些官方设定的错误&#xff0c;导致在开典藏箱的时候出现了一些问题&#xff0c;官方也推出了相应的补偿措施&#xff0c;比如退还G币&#xff0c;回收典藏箱子开出来的东…

Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线&#xff0c;每位玩家都能在这里开启全新的时空冒险之旅&#xff0c;主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本&#xff0c;以及日常任务为主&#xff0c;在以往的手游中&#xff0c;玩家进入某项玩法只需要从游戏界面调取菜单即可&#…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端&#xff0c;但是有时候前端的样式太丑了&#xff0c;也有点看不下去。弹出框是项目中用的比较多的&#xff0c;比如删除&#xff0c;修改或者添加什么的&#xff0c;都需要一个弹出框。 所以这里简单记录一下&#xff0c;应该如何实现。实现效果如…

软考《信息系统运行管理员》-2.3信息系统运维的外包

2.3信息系统运维的外包 信息系统运维外包的概念/模式 也称为信息系统代维。是指信息系统使用单位将全部或一部分的信息系统维护服务工作&#xff0c;按照规定的维护服务要求&#xff0c;外包委托给专业公司管理。 完全外包运维模式部分外包模式 信息系统运维外包的好处 有利…

offer150-16:数值的整数次方

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

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 目录 预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 2.运行环境为Matlab2023b及以上&#xff1b; 3…

路径跟踪算法---Stanley Method实现

文章目录 前言一、Stanley原理介绍二、主要代码实现三、效果 前言 Stanley Controller也是基于几何追踪的轨迹跟踪控制器&#xff0c;和Pure Pursuit不同的是&#xff0c;其基于前轮中心点为参考点进行控制&#xff0c;没有预瞄距离&#xff0c;以前轮中心点与最近参考轨迹点进…

天诚长租公寓智能门锁管理解决方案

人才是区域创新发展的第一资源&#xff0c;如何解决人才的住房问题&#xff0c;让人才“流进来”、“留下来”、“融进来”&#xff0c;就需要优先安排优质人才公寓、人才优租房和公共租赁住房房源&#xff0c;并为青年人才群体提供智能化、信息化的租住体验及通行服务。 一、…

四、(1)网络爬虫入门及准备工作(爬虫及数据可视化)

四、&#xff08;1&#xff09;网络爬虫入门及准备工作&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;网络爬虫入门1.1 百度指数1.2 天眼查1.3 爬虫原理1.4 搜索引擎原理 2&#xff0c;准备工作2.1 分析爬取页面2.2 爬虫拿到的不仅是网页还是网页的源代码2.3 爬虫就是…

app单页下载页源码带管理后台

新版带后台管理APP应用下载页,自动识别安卓苹果下载页&#xff0c;带管理后台&#xff0c;内置带3套App下载模板带中文模板/英文模板随时切换。 app单页下载页源码带管理后台

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

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

[Leetcode 128][Medium] 最长连续序列

目录 题目描述 整体思路 具体代码 题目描述 原题链接 整体思路 首先看到找连续升序排序的最长序列长度&#xff0c;想到对数组进行排序预处理。但是排序算法时间复杂度需要O(nlogn)&#xff0c;题目要求时间复杂度为O(n)。因此不能进行排序与处理 接着想到数据结构哈希表&a…