草庐IT

uniapp 前端获取微信小程序 URL Link (HTTPS调用)

廖若星辰LTY 2023-04-05 原文

前端基于 uniapp 获取微信小程序 URL Link 短链,适用于短信、邮件、网页、微信内等拉起小程序的业务场景。目前仅针对国内非个人主体的小程序开放。

前言:微信小程序此前可以在小程序管理后台-工具 中直接快捷生成小程序指定页面的 https 短链,后微信官方更新后弃用了该方式采用调用官方获取小程序短链的API获取且自 2022 年 4 月 11 日起,URL Link有效期最长 30 天,不再支持永久有效的URL Link、不再区分短期有效URL Link与长期有效URL Link。详情见官方文档

注:微信官方文档提醒获取小程序 URL Link 的接口应该在服务器端调用,本文主要是记录前端自行生成小程序指定页面 https 短链的方法。(微信官方文档-获取URL Link:urllink.generate )

本文示例使用 HTTPS 调用方式,并封装了将小程序指定页面直接转换为 https 短链的方法。

准备:首先你需要准备好该小程序的 AppID(小程序ID) 和 AppSecret(小程序密钥) 。这是生成 access_token 所必须的。(获取路径:登录微信小程序管理后台-开发管理-开发设置)

已将获取小程序指定页面 https 短链的核心业务封装为 getAppLink() 方法,可直接复制使用,注意该方法发起网络请求的方式是 uni.request() ,该方法中的 appidsecret 需填充你小程序的相关数据。核心代码如下:

getAppLink(params) {
        // AppID(小程序ID)
        const appid = ''
        // AppSecret(小程序密钥)
        const secret = ''
        // 先发起请求获取凭证
        uni.request({
          url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`,
          method: 'GET',
          success(res) {
            console.log('获取凭证', res);
            // 再发起请求获取url
            uni.request({
              url: `https://api.weixin.qq.com/wxa/generate_urllink?access_token=${res.data.access_token}`,
              method: 'POST',
              data: {
                ...params
              },
              success(result) {
                console.log('生成网址:', result.data);
                return result.data.url_link
              }
            })
          }
        })
      },

调用示例:

        let params = {
          // path:要跳转到的小程序的目标页面纯路径(不要拼接参数)
          // 注意:如果该链接要打开的版本是正式版,则这个path一定要已经发布到了正式版,不然无法访问到该页面则链接无法生成成功
          path: '/pages/index',
          query: "id=1&type=2", // 短链的入参
          env_version: "release", // 正式版
          expire_type: 1, 
          expire_interval: 30,
        }
        const url = await this.getAppLink(params)
        console.log('返回的url:', url);

注:调用时需要传递一个 params 的参数对象,该对象涉及参数见下图: 

:上图出处-微信官方文档 

上图参数说明见-小程序链接生成与使用规则调整公告

生成的链接形如:https://wxaurl.cn/pFawq35qbfd

生成短链成功后可使用 微信开发者工具 编译查看效果

 最后温馨提示:前端使用此方法生成所需的 https 短链后如果要将测试版提交审核,请先将 getAppLink() 方法中使用到的小程序的 AppID(小程序ID) 和 AppSecret(小程序密钥) 删除/清空(特别是 AppSecret),否则它会影响到代码审核,会告知存在安全风险无法审核通过!!!

有关uniapp 前端获取微信小程序 URL Link (HTTPS调用)的更多相关文章

  1. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  2. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  5. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐