如何通过短链接跳转到小程序,或者跳转至小程序webview一个h5页面

news2025/8/8 20:39:29

§ theme: channing-cyan

§ 一、需求背景:

公司需要通过发送短信携带短链接,用户点击短链接跳转到小程序的某个页面,然后打开小程序该页面webviewh5页面,然后链接携带参数。

§ 使用技术:

主要是用小程序的云开发,相关文档在这里: 云开发文档

§ 操作流程:

1,用户点击短链接跳转小程序 image.png

image.png

之后就打开小程序了

就是这样一个过程

§ 代码流程:

§ 1,首页我们需要一个h5路由页面,可以地址访问该页面,我使用的是vue框架

<template>
  <div class='open-mini-wrapper'>
    <div class="page full">
      <div id="public-web-container" class="hidden">
        <p class="">正在打开 “小程序”...</p>
        <a id="public-web-jump-button" href="javascript:" @click="openWeapp">
          <van-button type='primary'>打开小程序</van-button>
        </a>
      </div>

      <div id="wechat-web-container" class="hidden" >
        <p class="">点击以下按钮打开 “小程序”</p>
        <wx-open-launch-weapp id="launch-btn" :username="originId" :path="path">
          <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>
          </script>
        </wx-open-launch-weapp>
      </div>
      <div id="desktop-web-container" class="hidden">
        <p class="">请在手机打开网页链接</p>
      </div>
    </div>
  </div>
</template>

<script>
import {getQueryObject} from "@/utils";

export default {
  name: "OpenMini",
  data() {
    return {
      xxx: '', // 需要传的参数
      path: '', // 跳转至小程序的路径
      originId: '',//小程序原始ID
      resourceAppid: '', //小程序appid
      resourceEnv: '' //小程序云环境id
    }
  },
  created() {
    this.xxx = getQueryObject().xxx
    const url = `https://xxx?xxx=${this.xxx}`
    this.path = 'pages/h5/h5?url=' + encodeURIComponent(url)
    this.$getWeChatParams(this.xxx, window.location.href); // 微信开发功能的配置方法,见底部
  },
  mounted() {
    this.init()
  },
  methods: {
    // 准备
    docReady(fn) {
      if (document.readyState === 'complete' || document.readyState === 'interactive') {
        fn()
      } else {
        document.addEventListener('DOMContentLoaded', fn);
      }
    },
    init() {
      this.docReady(async () => {
        let ua = navigator.userAgent.toLowerCase()
        let isWXWork = ua.match(/wxwork/i) == 'wxwork'
        let isWeixin = !isWXWork && ua.match(/MicroMessenger/i) == 'micromessenger'
        // let isMobile = false
        let isDesktop = false
        if (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i)) {
          // isMobile = true
        } else {
          isDesktop = true
        }
        if (isWeixin) {
          let containerEl = document.getElementById('wechat-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'wechat-web-container')
          let 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)
          })

        } else if (isDesktop) {
          // 在 pc 上则给提示引导到手机端打开
          let containerEl = document.getElementById('desktop-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'desktop-web-container')
        } else {
          let containerEl = document.getElementById('public-web-container')
          containerEl.classList.remove('hidden')
          containerEl.classList.add('full', 'public-web-container')
          let c = new cloud.Cloud({
            // 必填,表示是未登录模式
            identityless: true,
            // 资源方 AppID
            resourceAppid: this.resourceAppid,
            // 资源方环境 ID
            resourceEnv: this.resourceEnv,
          })

          await c.init()
          window.c = c
          await this.openWeapp()
        }
      })
    },

    async openWeapp() {
      let c = window.c
      const res = await c.callFunction({
        name: 'public',
        data: {
          action: 'getUrlScheme',
          option: {
            xxx: this.xxx,
          }
        },
      })
      location.href = res.result.openlink
    }
  }
}
</script>

<style scoped lang='scss'>
.open-mini-wrapper {
  .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>

上面代码就是打开小程序的代码,但是此时还没有效果,需要配置云函数功能

需要先在小程序后台开通云开发服务,此时会分配一个云环境cloudID

打开小程序开发者工具-》点击云开发,开通静态网站功能

image.png

在云开发控制台点击设置,

image.png

然后点击云函数配置自定义安全规则

image.png

public为云函数名字,规则如下

{
    "*": {
        "invoke": "auth != null"
    },
    "public": {
        "invoke": true
    }
}

此时缺少云函数需要在代码新建云函数

新增文件夹起名叫cloud

image.png

再project.config.josn文件里增加配置

“cloudbaseRoot”: “cloud/”,

新增云函数起名public,然后同步云函数到服务器(微信小程序自己)

image.png

云函数index.js里代码写

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  switch (event.action) {
    case 'getUrlScheme': {
      return getUrlScheme(event.option)
    }
  }

  return {
    event
  }
}


async function getUrlScheme(option) {
  let query = 'xxx=' + option.xxx + '&from=yunhanshu' // 需要携带的参数
 

  const result = await cloud.openapi.urlscheme.generate({
    jumpWxa: {
      path: 'pages/h5/h5', // <!-- replace -->
      query: query
    },
    // 如果想不过期则置为 false,并可以存到数据库
    isExpire: false,
    // 一分钟有效期
    expireTime: parseInt(Date.now() / 1000 + 60),
  })
  return {
    ...result,
    query
  }
}

然后同步云函数

此时云函数部门已经开发完毕,剩下的是跳转到小程序指定页面路径,后的代码

§ 2,然后就要在小程序配置接受参数函数

h5.wxml部分很简单因为webview

 <web-view src="{{url}}"></web-view>

h5.js 只需要接受参数就可以了

// pages/webview/h5.js
const {
  getOpenId,
} = require('../../utils/userUtils')
Page({
  data: {
    url:''
  },
  onLoad(options) {
    // console.log(options, 'optionsaaa')
    if(options.from && options.from === 'yunhanshu') {
      const url = `https://xxx/#/?xxx=${options.xxx}`
      this.setData({
        url: url
      })
    }else {
      this.setData({
        url:decodeURIComponent(options.url)
      })
    }
  }
})

§ 3, 上面用到外部封装的函数

该函数需要调后端接口配合使用,主要是获取signature等参数信息,网上有很多,自行搜索

const getWeChatParams = async function (agentID, path, isHidden = false) {
  if (agentID) {
    let result = await wxticket({agentID, path})
    if (result.code === S_OK) {
      if (isHidden) {
        getHiddenWeChatShare(result.data)
      } else {
        getWeChatShare(result.data)
      }
    }
  }
}

const getWeChatShare = function (params) {
  let title = shareTitle;
  let desc = shareDesc
  weChat.config({
    debug: false,
    appId: appId,
    timestamp: params.timestamp,
    nonceStr: params.nonceStr,
    signature: params.signature,
    jsApiList: ['hideMenuItems', 'onMenuShareAppMessage', 'onMenuShareTimeline'],
    openTagList:['wx-open-launch-weapp'], // 填入打开小程序的开放标签名
  });
  weChat.ready(function () {
    // 批量隐藏菜单项
    weChat.hideMenuItems({
      menuList: [
        'menuItem:readMode', // 阅读模式
        'menuItem:share:qq',
        'menuItem:share:weiboApp',
        'menuItem:share:facebook',
        'menuItem:share:QZone'
      ]
    });
    // 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口
    weChat.onMenuShareAppMessage({
      title: title, // 分享标题
      desc: desc, // 分享描述
      link: params.url, // 分享链接
      imgUrl: `${urlDomain}/logo.png` // 分享图标
    });
    //监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口
    weChat.onMenuShareTimeline({
      title: title, // 分享标题
      desc: desc, // 分享描述
      link: params.url, // 分享链接
      imgUrl: `${urlDomain}/logo.png` // 分享图标
    })
  });
}

至此 整个开发流程就结束了,哈哈,是不是很简单。

§ 如果有帮助,请点赞,评论,加收藏,方便以后用到查找,如果没有实现,可以留言交流。

欢迎评论点赞支持,本文由蜗牛老湿开发Butterfly一键发布系统发布, 需要联系qq 1520521891

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

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

相关文章

HashMap为什么会发生死循环?

Java的HashMap是线程不安全的&#xff0c;所以在jdk1.7中&#xff0c;多线程的HashMap扩容采用头插法会发生死循环问题。为什么会发生这种情况呢&#xff1f; 正常扩容 当我们向HashMap中添加值的时候&#xff0c;调用的是Put()方法。 public V put(K key, V value) {//如果…

使用Prometheus监控docker compose方式部署的ES

需求 收集 ES 的指标, 并进行展示和告警; 现状 ES 通过 docker compose 安装所在环境的 K8S 集群有 Prometheus 和 AlertManager 及 Grafana 方案 复用现有的监控体系, 通过: Prometheus 监控 ES. 具体实现为: 采集端 elasticsearch_exporter 可以监控的指标为: NameTy…

使用 TensorFlow 构建计算机视觉模型

什么是计算机视觉&#xff1f; 计算机视觉 (CV) 是现代人工智能 (AI) 和机器学习 (ML) 系统的主要任务。它正在加速行业中的几乎每个领域&#xff0c;使组织能够彻底改变机器和业务系统的工作方式。 在学术上&#xff0c;它是计算机科学的一个成熟领域&#xff0c;数十年的研…

异常(Exception)

随着面向对象的结束&#xff0c;我们的JavaSE也就接近了尾声&#xff0c;还有两个章节没有去梳理&#xff0c;常用类和异常&#xff0c;本章先讲异常&#xff0c;剩下的常用类后面再来补。 废话不多说&#xff0c;直接开始本章的内容。 1. 认识异常 引出&#xff1a; 假设 n…

数据结构与算法_二叉树(BST树)_面试题总结

这篇笔记记录二叉树相关的常考题。 1 BST树区间元素搜索问题 **解决方法&#xff1a;**利用BST树的中序遍历&#xff0c;中序遍历后输出的是从小到大的顺序。 // 求满足区间的元素值 [i,j];void findValues(vector<T> &vec, int i, int j){// 封装一个递归接口 fin…

精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的系统服务底层原理以及高性能存储设计挖掘深入

设计背景 消息中间件的本身定义来考虑&#xff0c;应该尽量减少对于外部第三方中间件的依赖。一般来说依赖的外部系统越多&#xff0c;也会使得本身的设计越复杂&#xff0c;采用文件系统作为消息存储的方式。 RocketMQ存储机制 消息中间件的存储一般都是利用磁盘&#xff0…

基于node.js的学生管理系统设计

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1选题背景和意义 1 1.1.1选题背景 1 1.1.2选题意义 1 1.2国内外研究现状、发展动态 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.2.3发展动态 3 1.3研究内容 4 第2章 Node.js软件说明 5 2.1 Node.js概述 5 2.2 Node.js的模块 6 2.3…

语义信息概述

语义信息概述 什么叫语义信息 无论在图像&#xff0c;文本&#xff0c;语音处理领域等&#xff0c;我们常看到一个词&#xff0c;“语义信息”。&#xff08;有意义的数据提供的信息&#xff09; 维基百科中的解释&#xff1a; 语义信息&#xff08;英语&#xff1a;semantic…

【基础算法Ⅰ】算法入门篇

目录 进入算法世界 1.输入输出 1.1输入输出 1.2快读 2.位运算 2.1运算符 2.2位运算 3.枚举 3.1枚举的引入 3.2枚举的简单理解 3.3枚举简介 3.4 枚举算法实例 算法复杂度 时间复杂度 进入算法世界 瑞士著名的科学家Niklaus Wirth教授曾提出&#xff1a;数据结构算…

在C#方法中 out、ref、in、params 关键字的小结

out&#xff1a;关键字&#xff1a; 指定的参数在进入函数时会清空自己&#xff0c;必须在函数内部赋初值 ref关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;在函数内部可以重新赋值 In关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;…

C++入门教程||C++while循环

whlie 语法 C 中 while 循环的语法&#xff1a; while(condition) {statement(s); } 在这里&#xff0c;statement(s) 可以是一个单独的语句&#xff0c;也可以是几个语句组成的代码块。condition 可以是任意的表达式&#xff0c;当为任意非零值时都为真。当条件为真时执行…

Java.md

sa一、基础篇 网络基础 TCP三次握手 1、OSI与TCP/IP 模型2、常见网络服务分层3、TCP与UDP区别及场景4、TCP滑动窗口&#xff0c;拥塞控制5、TCP粘包原因和解决方法6、TCP、UDP报文格式 HTTP协议 1、HTTP协议1.0_1.1_2.02、HTTP与HTTPS之间的区别3、Get和Post请求区别4、HTTP常见…

Python实现BP神经网络ANN单隐层回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 20世纪80年代中期&#xff0c;David Runelhart。Geoffrey Hinton和Ronald W-llians、DavidParker等人分…

SpringCloud 组件Gateway服务网关【gateway快速入门】

目录 1&#xff1a;Gateway服务网关 1.1&#xff1a;为什么需要网关 1.2&#xff1a;gateway快速入门 1&#xff09;&#xff1a;创建gateway服务&#xff0c;引入依赖 2&#xff09;&#xff1a;编写启动类 3&#xff09;&#xff1a;编写基础配置和路由规则 4&#xf…

啥牌子的无线蓝牙耳机好用?无线蓝牙耳机推荐2022

蓝牙耳机这几年技术越好越高&#xff0c;其最大的魅力就是随时随地听音乐&#xff0c;无论是上下班还是日常使用&#xff0c;出门携带也方便&#xff0c;市面上的蓝牙耳机众多&#xff0c;很多人不知道该如何选择&#xff0c;下面整理了几款音质清晰&#xff0c;综合性能优秀的…

分享25个JSP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/17ug7A_b2nHgu-x1K-GIVlQ?pwd6367 提取码&#xff1a;6367 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 renren-security轻量级权限管理系统 renr…

Linux C应用编程-1-文件IO

1.open与close #include <stdio.h> //IO操作需要包含的头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>char filename[] "text.txt";int main(void) {int fd;fd open(filename, O_RD…

systemd 252 如预期的锁定了 Linux 引导过程

导读今天给大家介绍一下systemd 252锁定 Linux 引导过程systemd 252 如预期的锁定了 Linux 引导过程 之前&#xff0c;我们 报道 过&#xff0c;systemd 创始人发文指出 Linux 引导过程不安全&#xff0c;并提出采用加密签名的统一内核镜像&#xff08;UKI&#xff09;&#x…

SA实战 · 《SpringCloud Alibaba实战》第02章-专栏设计

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe001.github.io 文章汇总:https://binghe001.github.io/md/all/all.html 大家好,我是冰河~~ 从今天开始,我们正式进入《SpringCloud Alibaba实战》专栏的学习,在《开篇》一文中,我们大体介绍了整个专栏的结构安…

html一个案例学会所有常用HTML(H5)标签

目录 前言 HTML5声明 HTML框架 head头部 声明编码格式 告诉IE浏览器&#xff0c;IE8/9及以后的版本都会以最高版本IE来渲染页面。 移动端适配 网站标题 网站正文 网站内容的组成 文字有关标签 音频视频标签 表单标签与input属性 前言 HTML没有什么难度&#xf…