手机浏览器或微信中唤起小程序

2024-03-05 00:44

本文主要是介绍手机浏览器或微信中唤起小程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

明文URL Schem唤起小程序

  • 业务需求的场景
  • 使用文档介绍
  • 实现过程
  • 遇到的问题
  • 注意事项
  • 相关文档

业务需求的场景

需要在后台管理系统中的列表数据添加复制功能,复制成功的链接能够在手机浏览器或者微信中打开指定的小程序页面(pages/good/detail/index)

使用文档介绍

需要在手机浏览器或者微信中唤起小程序有两种方式, 小程序URL Scheme文档,开放范围:非个人主体小程序

  1. 通过加密 URL Scheme (需要后端获取加密 Scheme)
  2. 通过明文 URL Scheme (可前端直接拼接)

注意:iOS系统可以直接打开URL Scheme,Android系统需要使用 H5 页面中转

实现过程

当前项目使用的技术是 vite-vue-ts,使用明文 URL Scheme方式唤起小程序
安装项目:pnpm create vite my-project-name --template vue-ts

1.列表页复制按钮事件js,实现生成URL Scheme,并复制到剪切板

const handleClick = ()=>{// URL Scheme需要进入的小程序页面const path = 'pages/good/detail/index'// URL Scheme携带的参数const query = encodeURIComponent(`goodId=${record.goodId}&other=${record.other}`)// 拼接完整的 URL Schemeconst url = encodeURIComponent(`weixin://dl/business/?appid=222222222222&path=${path}&query=${query}`)// 跳转到新增的H5页面的url(看下文),mpAppId公众号id,appId小程序idconst goodUrl = `${location.origin}/good.html?scheme=${url}&mpAppId=11111111111111&appId=222222222222`// 调用后端的接口生成短链接,并复制到剪切板return myRequest(`api/short/url`, { url:goodUrl }).then((resp) => {// 拷贝到剪切板(看下文utils工具)copyText(resp.data)Message.success('复制成功')return resp.data})
}

2.需要在现有的后台管理系统项目新建一个H5页面
在vite.config.ts中配置项build > rollupOptions > input 中新增配置项 good:

export default defineConfig({// ... 其他配置build:{rollupOptions:{// ... 其他配置input: {good: path.resolve(__dirname, 'good.html'), // 新建H5index: path.resolve(__dirname, 'index.html'), // 原系统入口页},output: {dir: path.resolve(__dirname, './dist'), // 打包输出问价},}}
})

在vite.config.ts同级目录下新建good.html文件,并引入小程序微信开放标签JDK的js文件

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><linkrel="icon"type="image/svg+xml"href="/logo.png"/><metaname="viewport"content="width=device-width, initial-scale=1.0"/><title>跳转中...</title>// 小程序微信开放标签<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script></head><body><div id="app"></div><scripttype="module"src="/src/good.ts"></script></body>
</html>

在src下新建good.ts,挂载页面

import { createApp } from 'vue'
import Auth from './Login.vue'
import './themes/login.less'
createApp(Auth).mount('#app')

在src下新建good.vue页面(H5页面),用来跳转小程序(访问复制出来的URL会进入这个页面,然后在点击进入小程序)

<!-- eslint-disable vue/no-lone-template -->
<template><div class="good">// 手机浏览器网页直接打开上文复制出来的url<divv-if="isWeiXin ? false : isMobile"class="public-web-container"><ahref="javascript:"class="public-web-jump-button"@click="openWxApp()">打开小程序</a></div>// 微信中需要使用微信开发标签<divv-show="isWeiXin"id="weChat-web-container"class="weChat-web-container"><wx-open-launch-weappid="launch-btn"class="wx-open-launch-weapp":appid="appId":path="weappPath"><component:is="'script'"type="text/wxtag-template"><button style="width: 200px; height: 45px; text-align: center; font-size: 17px; display: block; margin: 0 auto; padding: 8px 24px; border: none; border-radius: 4px; background-color: #07c160; color: #fff">打开小程序</button></component></wx-open-launch-weapp></div>// 桌面端提示用手机网页<divv-if="isDesktop"class="desktop-web-container"><p>请使用手机打开网页</p></div></div>
</template>
<script lang="ts" setup>
// 开放标签获取签名(签名需要后端生成)
const getSign = (params: { url: string })=>{return axios.get(`/api/get/sign?url=${params.url}`)
}const isWeiXin = ref<boolean>(false)
const isMobile = ref<boolean>(false)
const isDesktop = ref<boolean>(false)
// mpAppId 公众号id,  appId 小程序id
const { mpAppId = '11111111111111', appId = '222222222222', scheme } = Object.fromEntries(new URLSearchParams(location.search))
const weappPath = ref('')const errorCb= (e: any) => {console.error('错误原因:', e.detail.errMsg)
}onMounted(() => {// 微信页面需要注册开放标签document.addEventListener('WeixinOpenTagsError', errorCb)if (isWeiXin.value) {getSign({ url: encodeURIComponent(location.href.split('#')[0]) }).then((res) => {const { data } = res.data;(window as any).wx.config({debug: false,appId: mpAppId,timestamp: data.timestamp,nonceStr: data.noncestr,signature: data.sign,jsApiList: ['uploadImage'],openTagList: ['wx-open-launch-weapp'],})})}
})onUnmounted(() => document.removeEventListener('WeixinOpenTagsError', errorCb))onBeforeMount(() => {const params = new URLSearchParams(scheme)const query = params.get('query') as stringweappPath.value = `${params.get('path')}?${query}`// 区分平台const ua: any = navigator.userAgent.toLowerCase()const isWXWork = ua.match(/wxwork/i) === 'wxwork'isWeiXin.value = !isWXWork && ua.match(/micromessenger/i) == 'micromessenger'if (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i)) {isMobile.value = true} else {isDesktop.value = true}
})const openWxApp = () => {// 非微信中网页location.href = decodeURIComponent(scheme)
}
</script><style lang="less" scoped>
* {padding: 0;margin: 0;
}
.good{position: absolute;top: 0;bottom: 0;left: 0;right: 0;
}
.weChat-web-container,
.public-web-container,
.desktop-web-container {display: flex;flex-direction: column;align-items: center;
}
.wx-open-launch-weapp {position: absolute;bottom: 50%;left: 0;right: 0;display: flex;flex-direction: column;align-items: center;transform: translateY(-50%);
}
.public-web-jump-button {position: absolute;bottom: 50%;transform: translateY(-50%);display: inline-block;width: 184px;margin-left: auto;margin-right: auto;padding: 8px 24px;box-sizing: border-box;background-color: #06ae56;color: #fff;font-weight: 700;font-size: 17px;text-align: center;text-decoration: none;line-height: 1.41176471;border-radius: 4px;overflow: hidden;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.desktop-web-container p {position: absolute;top: 50%;transform: translateY(-50%);
}
</style>

src > utils > index 工具文件

 // 复制剪切板功能
function fallbackCopyTextToClipboard(text: string) {let textArea = document.createElement('textarea')textArea.value = text// Avoid scrolling to bottomtextArea.style.top = '0'textArea.style.left = '0'textArea.style.position = 'fixed'document.body.appendChild(textArea)textArea.focus()textArea.select()return new Promise<boolean>((resolve, reject) => {try {let successful = document.execCommand('copy')resolve(successful)} catch (err) {reject(err)} finally {document.body.removeChild(textArea)}})
}export  const copyText = (text: string): Promise<boolean> => {if (!navigator.clipboard) {return fallbackCopyTextToClipboard(text)}return navigator.clipboard.writeText(text).then(() => true)
}

遇到的问题

  1. 链接没有加密,打开网页是空白的,使用encodeURIComponent解决
  2. 链接过长,打开网页是空白的,通过后端生成短链接解决
  3. 注册开放标签注册失败,也会导致网页是空白的

注意事项

  1. 一定要配置 :在MP平台->设置->隐私与安全->明文Scheme拉起此小程序声明
  2. 微信开发标签一定要配置:登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

相关文档

链接: URL Scheme文档
链接: 获取短链接
链接: 开放标签

这篇关于手机浏览器或微信中唤起小程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/774792

相关文章

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.