微信小程序web-view与H5之间交互(含支付)

本文介绍了web-view作为微信小程序内置组件加载H5页面的原理和步骤,包括参数传递、H5触发小程序跳转以及处理H5中的微信JSAPI支付问题。通过web-view@message事件监听和uni.postMessage实现两者通信,解决API不兼容问题,同时提出通过小程序完成H5支付的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章 了解web-view与H5的交互(含支付)


前言

uniapp开发小程序的过程中主、分包有大小限制,随着业务的增加,使用web-view加载H5的方式,往往纯加载并不能满足业务需求,这个时候就得了解小程序与H5的交互。


提示:以下是本篇文章正文内容,下面案例可供参考

一、web-view是什么?

web-view 是微信小程序内置的浏览器组件,用来加载网络html

二、使用步骤

<template>
	<web-view src="https://www.xxx.com"></web-view>
</template>

注意:

  • 小程序web-view会自动铺满全屏,不支持修改组件宽高。
  • 小程序加载路径仅支持网络网页,不支持本地的html页面。

三、业务场景

1.小程序带参数跳转链接,H5应用获取参数
<!-- 小程序参数拼接在地址上-->
<!-- 小程序-->
<template>
	<web-view src="https://www.xxx.com?id=1&from=xcx"></web-view>
</template>

解决:小程序地址路径?传参 — H5onLoad函数接收

// H5
// H5获取拼接的url参数
<script>
export default {
	onLoad(option){
		console.log(option) // {id: 1, from: 'xcx'}
	}
};
</script>

<script>
console.log(window.location.search) // ?id=1&from=xcx
</script>
2.H5应用涉及跳转小程序功能,小程序嵌套后功能失效 (原网页环境是微信浏览器,嵌入后为小程序内置环境,api方法不兼容)

解决:H5触发事件并发送内容 — web-view @message事件监听处理

<!-- message事件监听H5触发的消息-->
<!-- 小程序-->
<template>
	<web-view src="https://www.xxx.html" @message="onMessage"></web-view>
</template>
<script>
export default {
	data() {
		return {};
	},
	methods: {
		onMessage(event) {
			console.log('接收到消息:' + JSON.stringify(event.detail.data));
			// 跳转小程序方法
			uni.navigateToMiniProgram({
				appId: data.appId,
				path: data.path,
				extraData: data.extraData
			});
		}
	}
};
</script>

// H5
// H5触发事件并发送内容
document.addEventListener('click', function() {
	uni.postMessage({
		data: {
			appId: '',
			path: '',
			extraData: ''
		}
	});
})
3.H5应用涉及微信JSAPI支付,小程序嵌套后功能失效

重点:这里把支付的参数传给到小程序,通过小程序去完成支付,支付完成or失败后跳回原有h5页面

注:(需后端配合增加小程序支付接口,H5通过携带支付参数跳转小程序页面,小程序内接收参数进行支付,并且小程序里支付api可以知道支付状态,那么就能完成整个支付业务)

解决:H5调用支付下单接口 — 携带参数跳转到小程序里去完成支付 — 支付后携带参数回跳H5 — H5接收参数判断支付是否成功

<!-- 小程序-->
<template>
	<web-view :src="url"></web-view>
</template>
<script>
export default {
	data() {
		return {
			url: ''
		};
	},
	onLoad(option){
		//有支付订单进行支付
		if (option.idNo) {
			const item = JSON.parse(decodeURIComponent(option.data));
			this.requestPayment(item);
		}
	},
	methods: {
		requestPayment(item) {
			console.log(item);
			uni.requestPayment({
				provider: 'wxpay',
				signType: item.signType || 'MD5',
				timeStamp: item.timeStamp,
				nonceStr: item.nonceStr,
				package: item.package,
				paySign: item.paySign,
				success: res => {
					// 回跳地址携带支付状态参数,便于H5判断
					// 支付成功
					this.url += '&payStatus=success';
				},
				fail: err => {
					// 支付失败
					this.url += '&payStatus=fail';
				}
			});
		}
	}
};
</script>

// H5
<script>
onLoad(option){
	if (option.payStatus == ‘success’) {
		// 支付成功
		........
	}else {
		// 支付失败
		........
	}
},
methods: {
	// H5通过jssdk携带支付参数跳转小程序页面
	let path = `/pages/webview_pay/webview_pay`;(注意需和小程序内跳转链接页面路径一致)
	........
	// 接口返回的支付参数
	let navigateToData = {
		timeStamp: response.data.result.timeStamp,
		nonceStr: response.data.result.nonceStr,
		package: response.data.result.package,
		paySign: response.data.result.sign
	};
	let uri = window.location.href.split('#')[0]; //获取当前url;
	path += `?idNo=${response.data.result.orderNo}&data=${encodeURIComponent(JSON.stringify(navigateToData))}&uri=${uri}`;

	//通过JSSDK的api使小程序跳转到指定的小程序页面
	jweixin.miniProgram.getEnv(function(res) {
		if (res.miniprogram) {
			jweixin.miniProgram.redirectTo({
				url: path
			});
		} else {
			uni.showToast({
				title: 'error',
				icon: 'none'
			});
		}
	});
}

</script>

总结

本文简单介绍了小程序web-view与H5的一些交互,若有其他更好的交互方式,欢迎评论区补充。

未完待续...

### 微信小程序跳转至H5支付页面的实现方案 为了实现在微信小程序中跳转到H5支付页面并完成支付功能,需要综合考虑多个技术细节以及安全性和用户体验的要求。以下是具体的实现方法和技术要点: #### 1. 小程序端逻辑设计 在微信小程序中,可以通过 `<web-view>` 组件加载外部网页来实现跳转到H5页面的功能。具体来说,当用户触发某个操作(例如点击按钮),可以调用 `wx.navigateTo` 或者直接渲染 `<web-view>` 来传递目标URL。 示例代码如下: ```javascript // index.js 文件中的函数定义 toPaymentPage() { const paymentUrl = 'https://your-domain.com/payment'; // 替换为实际的H5支付页面地址 wx.navigateTo({ url: '/pages/webview/webview?url=' + encodeURIComponent(paymentUrl), }); } ``` 上述代码片段展示了如何通过导航方式将用户引导至指定的H5页面[^3]。需要注意的是,这里的 URL 需要在小程序管理后台配置允许访问的 **业务域名** 中声明。 --- #### 2. 使用 `<web-view>` 加载 H5 页面 在目标页面上使用 Vue 或其他框架开发时,可通过动态绑定属性的方式来加载传入的 URL 参数。以下是一个基于 Vue 的模板实例: ```vue <template> <web-view :src="paymentUrl"></web-view> </template> <script> export default { data() { return { paymentUrl: '', // 初始化为空字符串 }; }, onLoad(options) { if (options && options.url) { this.paymentUrl = decodeURIComponent(options.url); // 解码接收到的 URL 参数 } }, }; </script> ``` 此部分实现了从小程序向 H5 页面传输数据的过程,并确保能够正确解析携带的参数[^4]。 --- #### 3. OAuth 认证安全性保障 由于涉及到敏感信息处理(如支付行为),因此必须严格遵循微信平台的安全策略。主要包括以下几个方面: - **OAuth 授权登录** 如果 H5 支付页面依赖于用户的唯一身份标识,则需提前完成 OAuth 登录流程获取 openid 和 session_key 等必要凭证[^2]。这一步通常由服务端配合前端共同完成。 - **签名验证机制** 对每次请求都附加时间戳、随机数以及其他加密字段作为校验依据,防止恶意篡改或重放攻击发生。 - **HTTPS 协议保护通信链路** 所有交互均应运行在 HTTPS 上下文中,从而最大限度降低中间人窃听风险。 --- #### 4. 调用微信支付接口 最终,在 H5 页面内嵌入微信 JSAPI 完成订单创建及扣款动作。主要步骤包括但不限于: 1. 向服务器发起预下单请求; 2. 获取返回的结果对象( prepay_id 字段); 3. 调用 WeixinJSBridge 提供的方法执行付款过程。 典型代码结构如下所示: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>H5 Payment Page</title> </head> <body> <button id="payButton">立即支付</button> <script type="text/javascript"> document.getElementById('payButton').addEventListener('click', () => { callWeChatPay(); }); function callWeChatPay() { var payParams = { appId: "wxd930ea5d5a258f4f", // 应用ID timeStamp: new Date().getTime(), // 时间戳 nonceStr: Math.random().toString(36).substring(7), // 随机串 packageValue: "prepay_id=xxx", // 商户生成的预支付交易会话标识 signType: "MD5", // 签名算法类型 paySign: generateSignature(...) // 根据官方文档计算得出的具体值 }; if (typeof WeixinJSBridge === "undefined") { document.addEventListener("WeixinJSBridgeReady", onBridgeReady, false); } else { onBridgeReady(payParams); } function onBridgeReady(params) { WeixinJSBridge.invoke( "getBrandWCPayRequest", params, function(res){ alert(JSON.stringify(res)); // 显示回调结果状态 } ); } } function generateSignature(dataToSign) { /* 自定义实现 */ return ""; } </script> </body> </html> ``` 以上脚本演示了如何利用 JavaScript SDK 发起一次完整的微信支付尝试[^1]。 --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^Rocky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值