目录

前端充电-移动端-小程序登录跳转嵌入H5页面

前端充电 - 移动端 - 小程序登录、跳转/嵌入H5页面

【APP/小程序嵌入H5页面】

背景

产品APP:安卓端,ios端和小程序端。产品要做一个活动页,需要在3个端侧把活动页展示出来。但活动有效期只有3天。

可供选择的方案包括:

  • 安卓端、ios和小程序的代码都开发此活动,活动结束后再将这部分代码逻辑屏蔽。每端添加活动后都需要重新提交版本审核上架。
  • 做一个H5页面,在3个端侧分别将此H5页面嵌入进去。

小程序内嵌H5页面具体实现

使用uniapp的web-view实现。

操作 :通过webview内置组件进行H5页面嵌入,src填入要打开的H5页面的网址

示例

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

【H5页面跳转小程序】

参考资料

  • 案例1
  • 案例2
  • 案例3
  • 案例4

案例1 微信H5页面跳转第三方小程序

在微信的H5页,跳转第三方小程序。常用于社群引流等。

跳转过程如下图。

https://i-blog.csdnimg.cn/direct/dd0467c526674f7384bd9d8df2e39c63.png

前提条件

在微信的H5页,跳转第三方小程序,前提条件:

    1. 拥有已认证的服务号

      服务号添加“JS接口安全域名”,即访问H5界面的域名。

    1. 获取第三方小程序的原始id

      只能手动获取,微信官方没有给出api接口动态调用。

      获取方法,以小红书为例,gh_52be748ce5b7。

https://i-blog.csdnimg.cn/direct/14c44daed21b4041934fea4a8bd30898.png

    1. 获取第三方小程序的页面路径

如果页面路径获取不到,默认跳转的是第三方小程序的首页。

官方也提供了手动获取的方法,但是没有暴露的api方法,手动获取方法不友好,需要去小程序业务后台添加开发者,然后下图会多一个页面路径。

https://i-blog.csdnimg.cn/direct/8ed5d606b3d44c49b44abcf066dd167b.png

注意这里有个复制链接,对于开发者来说是没用的。

这里的up写了一个动态获取的功能,需要去公众号——数字门店营销(没找到)。

以上就是跳转的必要条件。

实现跳转

使用跳转小程序 wx-open-launch-weapp 标签实现。该标签需要2个参数,username(原始id),path(页面路径),通过前提条件可以获取到。

标签使用官方用例:

官方示例

<wx-open-launch-weapp
  id="launch-btn"
  appid="wx12345678"
  path="pages/home/index?user=123&action=abc"
>
  <script type="text/wxtag-template">
    <style>.btn { padding: 12px }</style>
    <button class="btn">打开小程序</button>
  </script>
</wx-open-launch-weapp>
<script>
  // 注意这里btn不是button标签,而是开放标签。然后监听该开放标签的launch和error事件
  var btn = document.getElementById('launch-btn');
  btn.addEventListener('launch', function (e) {
    console.log('success');
  });
  btn.addEventListener('error', function (e) {
    console.log('fail', e.detail);
  });
</script>

实际还是不太一样,下面是up实际开发项目Vue用例。

html部分

<view v-else class="weapp">
	<wx-open-launch-weapp id="launch-btn" username="xxx" path="xxx">
		<script type="text/wxtag-template">
			<style>
				.jump-btn {
					height: 44px;
					line-height: 44px;
					border: none;
					font-size: 20px;
					color: #ffffff;
					border-radius: 40rpx;
					background-color: #18bc37;
					text-align: center;
				}
			</style>
			<div class="jump-btn">打开小程序</div>
		</script>
	</wx-open-launch-weapp>
</view>

js部分

data() {
	return {
		url: '',
		username: '',
		path: ''
	}
},
onLoad(option) {
	if(option.originAppId) {
		// 从服务器获取两个参数,uaername和path
		this.username = option.originId;
		this.path = uni.getStoreSync('goodsUrl);
		return;
	}
	this.$wechat.initJssdk((e) => {
		console.log("初始化===>", e);
	})
	this.url = option.url;
},
onReady() {
	var btn = document.getElementById('launch-btn');
	btn.setAttribute('username', this.username);
	btn.setAttribute('path', this.path);
	console.log("=============" + btn.getAttribute('username') + "   "+btn.getAttribute('path'));
	btn.addEventLister('launch', function(e){
		console.log("success");
		// 点击打开小程序按钮时,将H5页面回退。这样从小程序返回时,直接返回H5页面,不会返回之间的中间页了
		uni.navigateBack({ delta: 1, // 返回层数,2则上上层
		})
	});
	btn.addEventLister('error', function(e){
		console.log("fail", e.detail);
	});
}

注意:这里页面通过原生方式,通过操作DOM的方式给标签的username和path属性赋值。

如果不是操作DOM的方式,赋值不会成功。通过vue方式赋值不行。

标签在跳转时,会展示一个中间界面,需要人工点击一下页面按键才继续跳转。为了提升用户体验,可以在按键点击事件设置关闭页面或回退到上一个页面。

案例2 静态网站 H5 跳小程序

一、概念解析

  1. 什么是静态网站?

    特点: 内容固定,无需服务器端处理(如 PHP、数据库) ,用户访问时直接加载 HTML、CSS、JavaScript 文件。

    常见形式:企业官网、个人博客、产品展示页等。

    技术栈:纯前端技术(HTML/CSS/JavaScript),可能搭配静态网站生成器(如 Hugo、Jekyll)。

  2. 什么是 H5?

    H5 的两种常见含义:

    广义:HTML5 技术标准,包含新的语义标签(如 <header><section> )、多媒体支持( <video><canvas> )、本地存储等。

    狭义(国内语境):特指移动端交互式营销页面(如滑动翻页、动画效果),但严格来说这是对 HTML5 技术的场景化应用。

二、静态网站 H5 的核心特点

  1. 技术优势

    响应式设计:通过 HTML5 的 和 CSS3 媒体查询适配多端(PC/手机/平板)。

    多媒体支持:直接嵌入视频/音频(无需 Flash):

  2. 局限性

    内容更新不便:需手动修改 HTML 或重新生成。

    功能受限:无法实现用户登录、实时数据交互等动态功能。

类似移动端的传统网站。

不看了。

案例3 微信H5授权登录

太长不看

案例4 微信环境h5如何唤起小程序

背景

开发过程中经常使用到第三方服务或跟第三方小程序有交互。

实现步骤

  • 步骤1 绑定域名(需要公众号管理人员进行操作)

登录微信公众平台,设置与开发 - 公众号设置 - 功能设置,添加js接口安全域名。

  • 步骤2 在index.html head标签中引入sdk
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
  • 步骤3 在main.js中设置忽略 <wx-open-launch-weapp> 标签,防止npm运行代码时页面报错
Vue.config.ignoredElements = ['wx-open-launch-weapp'];
  • 步骤4 需要后端提供一个接口,返回给前端 appId , timestamp , nonceStr , signature 四个字段,用于初始化微信js-sdk.

  • 步骤5 提供跳转小程序的相关参数

    必填

    AppId :小程序的appId

    Path
    小程序的跳转路径

    非必填

    username :所需跳转的小程序原生id,即小程序对应的以gh_开头的id

    跳转时,有appid优先使用appid,没有则会使用username

    env-version :正式版release,开发版develop,体验版trial

    开发过程中对接的小程序版本,是第三方告知,用于联调时使用

    extra-data
    额外参数

代码展示

1 引入sdk
  • 步骤2,项目public/index.html里引入sdk
	<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
2 忽略微信开放标签
  • 步骤3,在项目src/main.js里忽略微信开放标签
	Vue.config.ignoredElements = ['wx-open-launch-weapp'];
3 核心代码
  • 步骤4,实际代码开发

在views/navigate/index.vue里进行实际跳转代码的开发

1 html部分

注意

  • 唤起小程序的div实际是我们看到的button,真正唤起小程序的是 wx-open-launch-weapp 标签。

    点击事件是在 wx-open-launch-weapp 标签上触发的。

wx-open-launch-weapp标签的样式要覆盖到div的样式上去??? from 05:31

是wx-open-launch-weapp标签的样式要覆盖div,这样点击div时,实际是点击的wx-open-launch-weapp标签,这样就可以触发打开小程序的事件了。

  • appid和path是需要传递的两个字段。
<template>
	<div class="navi-container">
		<div class="now-btn">唤起小程序</div>
		<wx-open-launch-weapp v-if="isWechat" appid="wxel4huhu43dhu223hu3u3" path="pages/index/index?bxChannel=hudheuhu" style="position: absolute">
			<script type="text/wxtag-template">
				<style>
					.btn {
						width: 100%;
						height: 50px;
						position: absolute;
						left: 0;
						top: 0;
						z-index: 999;
						background: transparent;
						border: none
					}
				</style>
				<button class=""btn></button>
			</script>
		</wx-open-launch-weapp>
	</div>
</template>
2 js部分

注意

  • getHBJsApiConfig 是后端提供的接口封装的方法

方法的入参是H5页面的url地址,一般使用主域名,不用二级域名等,用#之前的部分。

两次初始化的域名地址不同,ios端获取的signature是错误的。

  • appId, timestamp, nonceStr, signature是需要的4个字段。

其实是微信sdk初始化需要的4个字段

  • 开发时可以将debug模式开启,上线时需要关闭掉。
  • 开放哪个标签,则配置openTagList:[‘wx-open-launch-weapp’]
  • 初始化成功,可以在window.wx.ready回调里打印信息,错误可以在window.wx.error打印错误信息,例如签名signature错误或域名错误等。
<script>
import { getHBJsApiConfig } from '@/api/wx';
import { getDeviceInfo } from '@/api/wx';
export default {
	data() {
		return {
			isWechat: getDeviceInfo().env === "wechat";
		}
	},
	async mounted() {
		document.title = '唤起小程序';
		try{
			if(this.isWechat) {
				let signData = await getHBJsApiConfig();
				const { appId, timestamp, nonceStr, signature } = JSON.parse(signData.data);
				window.wx.config({
					debug: false,
					appId,
					timestamp,
					nonceStr, 
					signature,
					jsApiList:['updateTimeListShareDara'],
					openTagList:['wx-open-launch-weapp']
				});
				window.wx.ready(function () {
					console.log('===============ready============');
				});
				window.wx.error(funtion (res) {
					console.log('===============fail============', res);
				})
			} catch(e) {
			}
		}
	}
}
</script>
3 css部分

css样式

<style lang="less">
.navi-container {
	positon: relative;
	width: 305px;
	height: 50px;
	margin: 18px auto;
	.now-btn {
		width: 305px;
		height: 50px;
		positon: absolute;
		left: 0;
		top: 0;
		border-radius: 25px;
		border: 1px solid rgba(246, 31, 30, 1);
		color: #fff;
		font-size: 16px;
		text-align: center;
		line-height: 50px;
		z-index: 1;
		background: linear-gradient(to right, #db0003, #ff6c61);
	}
	width: 305px;
}
</style>

注意事项

  • 微信开放标签 "wx-open-launch-weapp" 有最低微信版本要求,以及最低系统版本要求。
    • 微信版本要求:7.0.12及以上
    • 系统版本:ios 10.3以及上、Android 5.0以及上
  • 根据自己的系统,做好友好提示
  • 测试环境:唤起小程序,需要在测试环境或正式环境进行测试,开发环境无法测试

常见问题

按钮渲染失败,排查

  • 域名错误(本地开发,控制台报域名不对)
    • 公众号是否绑定了正确的域名
    • 初始化时传的域名参数是否与前端域名一致

为什么要在测试/正式环境进行测试,因为开发环境与公众号绑定的域名不是一致的,因此按钮渲染失败。

解决:提交代码,发布测试环境进行测试。

让前端域名地址与后端接口前缀地址保持一致。

  • 签名错误(大部分是ios手机)

    进入页面1的域名是 https://test.zyy.com/#/nav1

    进入页面2的域名是 https://test.zyy.com/#/nav2

进入上述2个页面时,分别初始化js-sdk,那么ios手机容易报签名错误。

如何解决?

  • 初始化的入参保持一致

推荐使用主域名(#之前的部分) https://test.zyy.com/

  • 每次都是最新的初始化返回值

从页面A跳页面B时,采用 window.location.href = 页面2 ,或 window.location.replace(页面2)

即通过跳转链接实现,相当于手动刷新页面,先跳到页面1,再跳转到页面2

  • 第一次请求后端接口时,本地缓存后端接口返回的4个值(appId, timestamp, nonceStr, signature)

【小程序一键登录】

1 获取登录临时凭证

  • 步骤1 首先调用api- ,获取到code,此code是用户登录的临时凭证。
methods: {
	async login() {
		let { code } = await uni.login();
	}
}

2 请求后台信息

  • 步骤2 调用后端接口,将code作为入参请求接口

接口信息

请求url: /u/loginByWechat

请求方式:GET

参数:code,必传

代码示例

async loginWechat() {
	let res = await loginByWechat({code});
}

接口返回

此时后端返回的数据有2种情况:

  1. 用户已经注册或已经登录过,此时接口返回用户信息和token,此时进入下一步登录后的操作即可。
  2. 用户之前没有注册或登录过,此时需要进入注册环节。

3 注册环节

如果走注册环节,那么步骤2接口返回的字段信息会有openid,sessionKey,unionid.

  • 步骤3 注册环节,请求后台注册接口

注册接口

注册微信用户(将微信信息注册到平台)

请求url:/u/wechat/register

请求方式:POST

参数:unionId,openId,sessionKey, signature,rawData,encryptedData

参数获取

unionId,openId,sessionKey已经通过步骤2的接口返回了,此时还剩下signature,rawData,encryptedData。通过官方api- 获取。

代码示例

async registerPost( params ) {
	let res = await register( params );
	let { member, token, wechat } = res;	
	if( res.code === '200') {
		uni.hideLoading();
		uni.showToast({
			title: '注册成功'
		})
	}
}

注册成功,同样会拿到用户信息和token,接下来就进入到登录后的操作。

总结

https://i-blog.csdnimg.cn/direct/a27ba1961afa4192a199375bf79adb0a.png