微信小程序 h5页面跳转小程序(超详细讲解)

news2025/7/18 11:58:20

h5跳转小程序

实战项目从无到完整的h5跳转小程序经验,跳转方式分为云函数跳转和开放性标签跳转。

开放性标签是针对微信里面浏览器使用的,而云函数跳转在外部以及微信里面都可以使用。

建议需要的同学先全部浏览一遍本文。内容较长较为啰嗦。

一、不用开放性标签(wx-open-launch-weapp)

官网链接:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/staticstorage/jump-miniprogram.html
官方网站写的是比较好的,但是还不够详细和许多坑点,下面是实例代码:
实例代码链接:https://postpay-2g5hm2oxbbb721a4-1258211818.tcloudbaseapp.com/jump-mp.html

<html>
  <head>
    <title>打开小程序</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
    <script>
      window.onerror = e => {
        console.error(e)
        alert('发生错误' + e)
      }
    </script>
    <!-- weui 样式 -->
    <link rel="stylesheet" href="https://res.wx.qq.com/open/libs/weui/2.4.1/weui.min.css"></link>
    <!-- 调试用的移动端 console -->
    <script src="https://cdn.jsdelivr.net/npm/eruda"></script>
    <script>eruda.init();</script>
    <!-- 公众号 JSSDK -->
    <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
    <!-- 云开发 Web SDK -->
    <script src="https://res.wx.qq.com/open/js/cloudbase/1.1.0/cloud.js"></script>
    <script>
      function docReady(fn) {
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
          fn()
        } else {
          document.addEventListener('DOMContentLoaded', fn);
        }
      }

      docReady(async function() {
        var ua = navigator.userAgent.toLowerCase()
        var isWXWork = ua.match(/wxwork/i) == 'wxwork'
        var isWeixin = !isWXWork && ua.match(/MicroMessenger/i) == 'micromessenger'
        var isMobile = false
        var isDesktop = false
        if (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i)) {
          isMobile = true
        } else {
          isDesktop = true
        }
        console.warn('ua', ua)
        console.warn(ua.match(/MicroMessenger/i) == 'micromessenger')
        var m = ua.match(/MicroMessenger/i)
        console.warn(m && m[0] === 'micromessenger')

        if (isWeixin) {
          var containerEl = document.getElementById('wechat-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'wechat-web-container')

          var launchBtn = document.getElementById('launch-btn')
          launchBtn.addEventListener('ready', function (e) {
            console.log('开放标签 ready')
          })
          launchBtn.addEventListener('launch', function (e) {
            console.log('开放标签 success')
          })
          launchBtn.addEventListener('error', function (e) {
            console.log('开放标签 fail', e.detail)
          })

          wx.config({
            // debug: true, // 调试时可开启
            appId: 'wxe5f52902cf4de896', 
            timestamp: 0, // 必填,填任意数字即可
            nonceStr: 'nonceStr', // 必填,填任意非空字符串即可
            signature: 'signature', // 必填,填任意非空字符串即可
            jsApiList: ['chooseImage'], // 安卓上必填一个,随机即可
            openTagList:['wx-open-launch-weapp'], // 填入打开小程序的开放标签名
          })
        } else if (isDesktop) {
          // 在 pc 上则给提示引导到手机端打开
          var containerEl = document.getElementById('desktop-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'desktop-web-container')
        } else {
          var containerEl = document.getElementById('public-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'public-web-container')
          var c = new cloud.Cloud({
            // 必填,表示是未登录模式
            identityless: true,
            // 资源方 AppID
            resourceAppid: 'wxe5f52902cf4de896',
            // 资源方环境 ID
            resourceEnv: 'postpay-2g5hm2oxbbb721a4',
          })
          await c.init()
          window.c = c

          var buttonEl = document.getElementById('public-web-jump-button')
          var buttonLoadingEl = document.getElementById('public-web-jump-button-loading')
          try {
            await openWeapp(() => {
              buttonEl.classList.remove('weui-btn_loading')
              buttonLoadingEl.classList.add('hidden')
            })
          } catch (e) {
            buttonEl.classList.remove('weui-btn_loading')
            buttonLoadingEl.classList.add('hidden')
            throw e
          }
        }
      })

      async function openWeapp(onBeforeJump) {
        var c = window.c
        const res = await c.callFunction({
          name: 'public',
          data: {
            action: 'getUrlScheme',
          },
        })
        console.warn(res)
        if (onBeforeJump) {
          onBeforeJump()
        }
        location.href = res.result.openlink
      }
    </script>
    <style>
      .hidden {
        display: none;
      }

      .full {
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
      }

      .public-web-container {
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .public-web-container p {
        position: absolute;
        top: 40%;
      }

      .public-web-container a {
        position: absolute;
        bottom: 40%;
      }

      .wechat-web-container {
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .wechat-web-container p {
        position: absolute;
        top: 40%;
      }

      .wechat-web-container wx-open-launch-weapp {
        position: absolute;
        bottom: 40%;
        left: 0;
        right: 0;
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .desktop-web-container {
        display: flex;
        flex-direction: column;
        align-items: center;
      }

      .desktop-web-container p {
        position: absolute;
        top: 40%;
      }
    </style>
  </head>
  <body>
    <div class="page full">
      <div id="public-web-container" class="hidden">
        <p class="">正在打开 “小程序示例”...</p>
        <a id="public-web-jump-button" href="javascript:" class="weui-btn weui-btn_primary weui-btn_loading" onclick="openWeapp()">
          <span id="public-web-jump-button-loading" class="weui-primary-loading weui-primary-loading_transparent"><i class="weui-primary-loading__dot"></i></span>
          打开小程序
        </a>
      </div>
      <div id="wechat-web-container" class="hidden">
        <p class="">点击以下按钮打开 “小程序示例”</p>
        <!-- 跳转小程序的开放标签。文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html -->
        <wx-open-launch-weapp id="launch-btn" username="gh_d43f693ca31f" path="/page/component/index">
          <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>
          </template>
        </wx-open-launch-weapp>
      </div>
      <div id="desktop-web-container" class="hidden">
        <p class="">请在手机打开网页链接</p>
      </div>
    </div>
  </body>
</html>

纯es5写的代码模块,可以改造成任意架构代码。下面讲一下怎么改成自己的项目里面以及坑点:
1、调试工具可以去掉:

<!-- 调试用的移动端 console -->
    <script src="https://cdn.jsdelivr.net/npm/eruda"></script>
    <script>eruda.init();</script>

2、Appid替换:怎么找到我们需要的id呢?替换位置都在哪呢?
1)登录微信公共平台
在这里插入图片描述
2)登录之后点击右上角头像的名字,基本设置里最下面,appid和原始id都在这里。
在这里插入图片描述
在这里插入图片描述
3)替换位置

// 这里是给开放性标签准备的,第一种方式暂时用不到
 wx.config({
            debug: true, // 调试时可开启
            appId: '替换的位置', 
            timestamp: 0, // 必填,填任意数字即可
            nonceStr: 'nonceStr', // 必填,填任意非空字符串即可
            signature: 'signature', // 必填,填任意非空字符串即可
            jsApiList: ['chooseImage'], // 安卓上必填一个,随机即可
            openTagList:['wx-open-launch-weapp'], // 填入打开小程序的开放标签名
          })
 <wx-open-launch-weapp id="launch-btn" username="原始id" path="跳转页面的路径">
          <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>
          </template>
        </wx-open-launch-weapp>
else {
          var containerEl = document.getElementById('public-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'public-web-container')
          var c = new cloud.Cloud({
            // 必填,表示是未登录模式
            identityless: true,
            // 资源方 AppID
            resourceAppid: '替换位置',
            // 资源方环境 ID
            resourceEnv: '云函数id', // 这里下面会讲
          })
          await c.init()

4)修改逻辑
在这里插入图片描述
这里把判断固定写死false,就是想让网页一直走最后else的逻辑,以后想用开放性标签,就把这里还原即可。代码块放下面了。

docReady(async function() {
        var ua = navigator.userAgent.toLowerCase()
        var isWXWork = ua.match(/wxwork/i) == 'wxwork'
        var isWeixin = !isWXWork && ua.match(/MicroMessenger/i) == 'micromessenger'
        var isMobile = false
        var isDesktop = false
        if (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i)) {
          isMobile = true
        } else {
          isDesktop = true
        }
        console.warn('ua', ua)
        console.warn(ua.match(/MicroMessenger/i) == 'micromessenger')
        var m = ua.match(/MicroMessenger/i)
        console.warn(m && m[0] === 'micromessenger')

        if (false) {
          var containerEl = document.getElementById('wechat-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'wechat-web-container')

5)跳转函数改造

 async function openWeapp(onBeforeJump) {
        var c = window.c
        const res = await c.callFunction({
          name: 'test111', // 这里是创建云函数的云函数名称,下面文章有说道
          data: {
            action: 'getUrlScheme', // 这是云函数中函数名字
          },
        })
        console.warn(res)
        if (onBeforeJump) {
          onBeforeJump()
        }
        location.href = res.result.openlink
      }

3、云函数的构建:
1)我这是构建好的:上文替换栏里面最后一张图说的云函数ID就是图中红色勾选框
在这里插入图片描述
没构建好的可以去:https://jingyan.baidu.com/article/a3aad71ac25f86f0fb0096ee.html
按照图文一步一步走就行了,我这里就不写那么多了。
点击云函数,然后点击新构建函数:
在这里插入图片描述
在这里插入图片描述

云函数名称填写的时候要注意点,这个函数名test111就是我们要用到的云函数名称
2)调用的时候这里日志会显示你在云函数里面写的打印console内容。
在这里插入图片描述
3)云函数权限,测试的时候建议修改为所有用户都可以访问!
在这里插入图片描述
在这里插入图片描述
4)创建的时候,并不是一定会创建云函数目录,这时候需要手动创建,首先在根目录下面创建一个你喜欢的文件名字,然后在project.config.json中添上你所创建的目录名字
在这里插入图片描述
在这里插入图片描述
右击这个目录的时候出现弹框这些选项,开发完毕后选择上传不上传node_modules选项就行了。(这是直接发到线上,只要线上代码不调用没啥影响,放心用)
在这里插入图片描述
在此目录下会出现test111文件夹,然后打开此文件夹,执行npm init,在package.json中写上:

{
  "name": "test111",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "wx-server-sdk": "~2.3.2"
  }
}

然后创建index.js文件,写入:

// 云函数入口文件
const cloud = require('wx-server-sdk')
let page = false;
cloud.init();


// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext();
  console.log('---------------')
  console.log(event)
  var query = {}
  if (event.query && event.query.page && event.query.page == 'showImage'){
    page = true;
    query.id = event.query.id;
  } else {
    page = false;
  }
  switch (event.action) {
    case 'getUrlScheme': { // 自定义函数名
      return getUrlScheme(page,query)
    }
  }

  return '没有找到对应的函数'
}

async function getUrlScheme(flag,param) { // 自定义函数
  console.log('-------getUrlScheme-----')
      console.log(flag)
      console.log(param)
      param = param || {};
  return cloud.openapi.urlscheme.generate({
    jumpWxa: {
      path: '',  // 跳转路径,一定是线上有的页面路径,否则会报错
      query: `id=${param.id}`, // 注意传参格式,可以不传参
    },
    // 如果想不过期则置为 false,并可以存到数据库
    isExpire: false,
    // 一分钟有效期
    expireTime: parseInt(Date.now() / 1000 + 60),
  })
}

到此,云函数跳转,就结束了,有什么问题可以评论告诉我。

二、使用开放性标签

使用开性标签,把上面修改逻辑的代码还原。
然后就是几个问题:
一、域名的坑:
1、开发使用者必须是已认证的服-务-号(服务号可以置顶,订阅号不能),服务号绑定“JS接口安全域名”下的网页可使用此标签跳转任意合法合规的小程序。
2、开发使用者必须是已认证的非个人主体的小程序,使用小程序云开发的静态网站托管绑定的域名下的网页,可以使用此标签跳转任意合法合规的小程序。
3、必须部署到正式服务器,测试公众号不显示图标。
4、必须是在已认证的服务号中做JS接口安全域名验证,“JS接口安全域名”和“IP白名单”都要,IP是指获取微信签名的服务器的IP。

注意:1、2两个条件必须满足其中一个;3、4两个条件必须满足,否则标签中的按钮不会显示(微信文档不讲武德,写的不清楚,稍微不注意就会掉坑)。
官方文档入口:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#21

还有几点:
1、微信开发者工具,“verifyOpenTagList”:[],是显示不了图标的。微信开发工具和真机测试结果可能不一样,一定要用真机测试。安卓和ios测试结果也可能不同,都要测试。

2、小程序的web-view不支持wx-open-launch-weapp。

3、jsApiList:[‘chooseImage’, ‘previewImage’](必须有,不然安卓不显示)

4、微信版本要求为:7.0.12及以上。 系统版本要求为:iOS 10.3及以上、Android 5.0及以上

原文链接:https://blog.csdn.net/chaishen10000/article/details/120712839
二:config配置坑:签名一定要找服务端要,生成规则让服务端自己看。

// 这里是给开放性标签准备的,第一种方式暂时用不到
 wx.config({
            debug: true, // 调试时可开启
            appId: '替换的位置', 
            timestamp: 0, // 必填,填任意数字即可
            nonceStr: 'nonceStr', // 必填,填任意非空字符串即可
            signature: 'signature', // 必填,服务端生成的,不能任意
            jsApiList: ['chooseImage'], // 安卓上必填一个,
            openTagList:['wx-open-launch-weapp'], // 填入打开小程序的开放标签名
          })

ps:小程序测试的时候使用线上首页测试最佳~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/406284.html

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

相关文章

jQuery 获取与设置 元素属性【一篇文章轻松拿下】

hello大家好呀&#xff01;此篇文章带领大家熟练掌握 jQuery 的属性方面的操作&#xff0c;包括固有属性的获取与设置&#xff0c;自定义属性的获取与设置等等&#xff0c;走进 jQuery 的更深层次阶段 文章目录&#xff1a; 一&#xff1a;固有属性的设置与获取 prop 1.1 固有…

uniapp 中设置全局页面背景色

uniapp 中设置全局页面背景色 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 未生效 : 在pages.json里面设置单页面背景色,这种是不行的,只能在页面内生效 方法1: pages.json globalStyle 中设置 backgroundColor // pages.json"globalStyle&quo…

Vue路由传参的方法和传递参数为对象时的问题

vue路由传参方法 在编写vue项目时&#xff0c;时常会使用路由在不同页面中传递参数&#xff0c;常见使用方式如下&#xff1a; this.$router.push({path: "/test",query: {a: 1,b: 2} }) 这样我们就传递了两个参数&#xff0c;在 /test 页面 就可以接收这两个参数…

【网络】https协议

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【网络】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文章…

黑马程序员最新版JavaWeb综合案例(前后端完整版)

JavaWeb 综合案例 学习视频链接: 黑马程序员最新版JavaWeb基础教程&#xff0c;Java web从入门到企业实战完整版 完整代码链接&#xff1a; https://github.com/HaiLei-Fly/JavaWeb-brand 1、功能介绍 案例功能&#xff1a; 用户登录&#xff08;账号密码登录&#xff09;…

基于JavaSpringBoot+Vue+uniapp微信小程序实现在线房屋装修管理系统

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

分布式Id生成方式

为什么要用分布式ID&#xff1f; 在说分布式ID的具体实现之前&#xff0c;我们来简单分析一下为什么用分布式ID&#xff1f;分布式ID应该满足哪些特征&#xff1f; 1、什么是分布式ID&#xff1f; 拿MySQL数据库举个栗子&#xff1a; 在我们业务数据量不大的时候&#xff0c…

Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

目录前言插件安装方法插件一&#xff1a;文献翻译插件&#xff08;pdf-translate&#xff09;插件二&#xff1a;文献附件管理&#xff08;ZotFile&#xff09;插件三&#xff1a;中文文献插件&#xff08;茉莉花&#xff09;插件四&#xff1a;Sci-Hub 自动下载文献&#xff0…

vue3项目实战中的接口调用方法(一)async/await用法 对axios二次封装 实现异步请求

vue3 async和await联合调用接口 &#x1f525;一文搞定&#x1f525;点击进入vue专栏&#x1f525;async/await定义async/await用法&#x1f525;async/await的基本用法async/await的使用场景async/await实战&#x1f525;&#x1f525;处理一个异步请求处理多个异步请求summar…

从函数计算到 Serverless 架构

作者&#xff1a;秋雨陈 前言 随着 Serverless 架构不断发展&#xff0c;各云厂商和开源社区都已经布局 Serverless 领域&#xff0c;一方面表现在云厂商推出传统服务/业务的 Serverless 化版本&#xff0c;或者 Serverless 计算平台&#xff1b;另一方面表现在开源社区中 Se…

远程构建(命令、脚本构建)jenkins

在对应项目&#xff0c;开启远程构建开关添加API token系统设置调整用户权限获取crumbcurl调用构建 1、进入对应项目的设置页面&#xff1a;开启远程构建开关 2、 添加 API token&#xff1a;进入对应用户的设置页面 3、系统设置调整权限&#xff0c;如图 4、由于jenkins的安全…

使用element-ui中的el-upload自定义上传

题引&#xff1a; 日常开发系统的时候&#xff0c;我们都会有上传文件的功能。但是用原生的文件上传是很繁琐的&#xff0c;那么我们都会选择使用UI组件库&#xff0c;如element-plus、ant-design等。这些UI组件库是非常容易上手且实用的&#xff0c;但是万恶的需求是奇怪多变…

vue项目引入百度地图BMapGL和BMap实例,以及辅助工具BMapGLLib 的引入,BMapGL鼠标绘制功能

记录一下vue项目使用百度地图所用的api和踩过的坑&#xff0c;减少以后引用少走弯路。旨在记录&#xff0c;第一次开贴&#xff0c;不足之处请多多指教。废话不多说&#xff0c;开撸&#xff01; 1、引用百度地图 这里账号密钥不多说&#xff0c;上链接&#xff0c;自己注册。…

【kubernetes】k8s集群搭建(完整详解)

目录 一、准备工作 二、配置 1、修改主机名 2、修改hosts文件 3、关闭防火墙和SELinux 4、关闭swap 5、修改网卡配置 6、系统模块配置 7、免密登录 8、安装k8s和docker 9、查看k8s集群需要的镜像版本 10、初始化Master节点 11、node配置 12、拉取Nginx镜像进行配置…

【uniapp小程序】视图容器cover-view

&#x1f352;观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;小程序系列又更新新文章啦&#xff0c;今天的内容是uniapp小程序的视图容器&#xff0c;cover-view &#x1f352;准备好了吗&#xff1f;那我们就发车啦&#xff0c;赶紧拿起小本本把笔记做起来…

10Wqps 超高并发 API网关 架构演进之路

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常遇到一个 API网关 架构方面的问题&#xff1a; (1) 尼恩老师&#xff0c;最近公司我们在规划业务出口网关(目的&#xff0c;整合规范外部调用&#xff0c;如短信平台 mqtt 等) 我在做整理技术方案&…

智能车竞赛:Infineon TC264单片机使用总结快速入门

本文主要是为了备赛第十八届全国大学生智能车竞赛&#xff0c;基于逐飞开源库和芯片数据手册的一些学习总结&#xff0c;使用英飞凌官方的AURIX Development Studio开发环境。 正如STM32的开发方式有标准库和HAL库&#xff0c;Infineon单片机也有官方库&#xff0c;而逐飞开源…

阿里P8大牛用实例跟你讲明白“Java 微服务架构实战”

全文一共十五章&#xff0c;核心内容为SpringBoot、SpringCloud、Docker、RabbitMQ消息组件。其中&#xff0c;SpringBoot是SpringMVC 技术的延伸&#xff0c;使用它进行程序开发会更简单&#xff0c;服务整合也会更容易。SpringCloud 是当前微架构的核心技术方案&#xff0c;属…

Spring Cloud Alibaba 微服务1,系统架构演变 + Nginx反向代理与负载均衡

目录专栏导读一、系统架构演变二、什么是Nginx&#xff1f;三、servername匹配规则四、正向代理与反向代理1、正向代理2、反向代理3、LVS五、负载均衡策略1、轮询2、权重3、ip_hash4、least_conn5、url_hash6、fair7、小结六、动静分离七、URLRewrite专栏导读 &#x1f3c6;作者…

【Linux系统】进程概念

目录 1 冯诺依曼体系结构 2 操作系统(Operator System) 概念 设计OS的目的 定位 总结 系统调用和库函数概念 3 进程 3.1 基本概念 3.2 描述进程-PCB 3.2 组织进程 3.3 查看进程 3.4 通过系统调用获取进程标示符 3.5 进程状态 在了解进程概念前我们还得了解下冯诺…