https://www.bilibili.com/video/BV1PE421A7Pt?spm_id_from=333.788.videopod.sections&vd_source=c919d6976fd77ac77f9860cf2e7e0e11
产品APP:安卓端,ios端和小程序端。产品要做一个活动页,需要在3个端侧把活动页展示出来。但活动有效期只有3天。
可供选择的方案包括:
使用uniapp的web-view实现。
操作:通过webview内置组件进行H5页面嵌入,src填入要打开的H5页面的网址
示例
参考资料
案例1 如何在微信H5页面链接跳转到第三方小程序的任意页面
案例2 静态网站 H5 跳小程序
案例3 微信H5授权登录
案例4 微信环境h5如何唤起小程序
如何在微信H5页面链接跳转到第三方小程序的任意页面
在微信的H5页,跳转第三方小程序。常用于社群引流等。
在微信的H5页,跳转第三方小程序,前提条件:
如果页面路径获取不到,默认跳转的是第三方小程序的首页。
官方也提供了手动获取的方法,但是没有暴露的api方法,手动获取方法不友好,需要去小程序业务后台添加开发者,然后下图会多一个页面路径。
注意这里有个复制链接,对于开发者来说是没用的。
这里的up写了一个动态获取的功能,需要去公众号——数字门店营销(没找到)。
以上就是跳转的必要条件。
使用跳转小程序 wx-open-launch-weapp 标签实现。该标签需要2个参数,username(原始id),path(页面路径),通过前提条件可以获取到。
标签使用官方用例:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#21
官方示例
<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方式赋值不行。
标签在跳转时,会展示一个中间界面,需要人工点击一下页面按键才继续跳转。为了提升用户体验,可以在按键点击事件设置关闭页面或回退到上一个页面。
静态网站 H5 跳小程序
一、概念解析
、
)、多媒体支持(
、
)、本地存储等。二、静态网站 H5 的核心特点
类似移动端的传统网站。
不看了。
太长不看
微信H5授权登录
微信环境h5如何唤起小程序
开发过程中经常使用到第三方服务或跟第三方小程序有交互。
登录微信公众平台,设置与开发 - 公众号设置 - 功能设置,添加js接口安全域名。
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js">script>
标签,防止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: 额外参数
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js">script>
Vue.config.ignoredElements = ['wx-open-launch-weapp'];
在views/navigate/index.vue里进行实际跳转代码的开发
注意
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标签,这样就可以触发打开小程序的事件了。
<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>
注意
方法的入参是H5页面的url地址,一般使用主域名,不用二级域名等,用#之前的部分。
两次初始化的域名地址不同,ios端获取的signature是错误的。
其实是微信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>
css样式
"wx-open-launch-weapp"
有最低微信版本要求,以及最低系统版本要求。
按钮渲染失败,排查
为什么要在测试/正式环境进行测试,因为开发环境与公众号绑定的域名不是一致的,因此按钮渲染失败。
解决:提交代码,发布测试环境进行测试。
让前端域名地址与后端接口前缀地址保持一致。
https://test.zyy.com/#/nav1
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
methods: {
async login() {
let { code } = await uni.login();
}
}
接口信息
请求url: /u/loginByWechat
请求方式:GET
参数:code,必传
代码示例
async loginWechat() {
let res = await loginByWechat({code});
}
接口返回
此时后端返回的数据有2种情况:
如果走注册环节,那么步骤2接口返回的字段信息会有openid,sessionKey,unionid.
注册接口
注册微信用户(将微信信息注册到平台)
请求url:/u/wechat/register
请求方式:POST
参数:unionId,openId,sessionKey, signature,rawData,encryptedData
参数获取
unionId,openId,sessionKey已经通过步骤2的接口返回了,此时还剩下signature,rawData,encryptedData。通过官方api-uni.getUserInfo()获取。
代码示例
async registerPost( params ) {
let res = await register( params );
let { member, token, wechat } = res;
if( res.code === '200') {
uni.hideLoading();
uni.showToast({
title: '注册成功'
})
}
}
注册成功,同样会拿到用户信息和token,接下来就进入到登录后的操作。