关于微信公众号跳转小程序的功能,我也是研究了一整天才弄好的,主要是微信官方文档写的不清楚,百度上的各种文章也各说各的,不过最后还是要相信官网文档,接下来我会一步一步分析,希望对你有帮助,并且最后会贴上全部代码。
一、条件
- 已认证的服务号,服务号绑定“JS接口安全域名”下的网页可使用此标签跳转任意合法合规的小程序。
- 已认证的非个人主体的小程序,使用小程序云开发的静态网站托管绑定的域名下的网页,可以使用此标签跳转任意合法合规的小程序。
这两个条件符合其一即可
二、版本兼容
对于符合微信或系统最低版本要求但仍无法使用微信开放标签的场景,将会在下方使用步骤中的wx.config权限验证成功后触发WeixinOpenTagsError事件告知开发者。仅无法使用微信开发标签,JS-SDK其他功能不受影响,可通过如下方法监听并进行回退兼容:
document.addEventListener(‘WeixinOpenTagsError’, function (e) {
console.error(e.detail.errMsg); //无法使用开放标签的错误原因,需回退兼容。仅无法使用开放标签,JS-SDK其他功能不受影响 });
三、实现步骤
在需要调用 JS 接口的页面引入如下 JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问http://res2.wx.qq.com/open/js/jweixin-1.6.0.js(支持https)
备注:支持使用 AMD/CMD 标准模块加载方法加载
可以使用srcipt标签引入,也以使用npm包下载以后导入使用,比如我使用uniapp开发的时候,打印 wx 对象的时候并不是我引入的js,我猜测应该是uniapp内置的,于是我使用npm下载了一个js_sdk,选择其一即可,我用的是第一个
npm install jweixin-module --save
npm install weixin-js-sdk --save
import wxApi from "jweixin-module"
wxApi.config()
wxApi.ready()
wx.config({
debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
appId: ‘’, // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: ‘’, // 必填,生成签名的随机串
signature: ‘’,// 必填,签名
jsApiList: [] // 必填,需要使用的 JS 接口列表
openTagList: [] // 可选,需要使用的开放标签列表
});
使用wx.config注入需要的权限,需要的参数前端并不能获取,需要服务器调用微信提供的接口计算得到,后端的代码不用关注,我只写前端的代码
var data = {
//不需要后面的hash值
//服务器计算签名的时候需要用到当前网页的链接,且链接里不需要hash值,所以做这个处理
url: window.location.href.split('#')[0]
}
this.$axios.post('XXXXXX',data).then(res=>{
var params = res.data.data;
wx.config({
debug: true,
appId: params.appid,
timestamp: params.timestamp,
nonceStr: params.nonceStr,
signature: params.signature,
jsApiList: ['onMenuShareTimeline'],
openTagList:['wx-open-launch-weapp']
});
wx.ready(()=>{
//这里是成功后执行
});
wx.error(()=>{
//这里是出现异常执行
})
})
这里有几点需要注意的,是重点,仔细看了,一般出问题多半这在里
第一点就是后端获取签名的时候,需要用到该网页的地址,地址截取hash值之前的部分,并且链接里带有的参数也要不能少,下面就是微信文档的原话:
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
第二点就是 jsApiList: [‘onMenuShareTimeline’] ,由于这个用不到,但是也不能空,就可以去微信文档里随便选一个填上去就行
第三点,openTagList:[‘wx-open-launch-weapp’] 这一项要注意,我们使用的开放标签是 wx-open-launch-weapp,这是小程序专用的,有些人直接复制微信文档的示例,可能没注意使用的是wx-open-launch-app这个标签,这个是打开微信app的
当出打开debug模式下,会以弹窗的形式告诉你配置注入是否成功,当成功时会弹出 errMsg:config:ok 如果看到这个弹窗,说明你授权这一步已经完成了
3.使用微信开放标签
这也是最后一步了,微信文档上提供的示例直接拿来用就行
<wx-open-launch-weapp
id="launch-btn"
username="gh_xxxxxxxx"
path="pages/home/index?user=123&action=abc"
>
<script type="text/wxtag-template">
<button>打开小程序</button>
</script>
</wx-open-launch-weapp>
需要注意的是 username 就是小程序的原始ID,在微信公众平台 > 设置 > 基本设置的最下面。path就是你小程序的地址,你用那个页面的地址打开就是哪个页面并且可以使用url传参,vue中开放标签的样式建议使用行内样式,不然不生效,在vue中,由于无法识别 wx-open-launch-weapp 标签,编译的时候会报错,我们需要去main.js里加入一句话:
Vue.config.ignoredElements.push('wx-open-launch-weapp');
意思就是忽略对这个标签的检查
到这里,就完成了,权限注入不成功的情况下,button按钮是不会渲染的,如果权限注入成功之后依旧不显示按钮,就是按钮不兼容,需要另外处理,另外,标签上可以设置跳转的小程序版本,分别式:开发版,体验版,正式版,设置env-version属性就可以了,详情可以去官网文档查看
<template>
<div class="toMiniapp_box">
<text class="toMiniapp_box--tips">
您的微信暂未注册账号,可以点击下方按钮前往小程序注册账号
</text>
<wx-open-launch-weapp id="launch-btn" username="gh_XXXXXXXX" path="pages/index/index">
<script type="text/wxtag-template">
<button>前往小程序注册</button>
</script>
</wx-open-launch-weapp>
</div>
</template>
<script>
const wxapi = require('../../utils/wxApi.js');
export default {
created() {
this.getMiniappPermition()
},
methods: {
// 请求服务器获取签名
getMiniappPermition() {
const url = encodeURIComponent(window.location.href.split('#')[0]);
uni.request({
url: `/mapuser/getMpJsticket?appid=XXXXX&signUrl=${url}`,
method: "GET",
success: (res) => {
var params = res.data.data
this.wxReady(params)
}
})
},
// 签名验证
wxReady(params) {
wxapi.config({
debug: false, // 开启调试模式
appId: params.appid, // 必填,公众号的唯一标识
timestamp: params.timestamp, // 必填,生成签名的时间戳
nonceStr: params.nonceStr, // 必填,生成签名的随机串
signature: params.signature, // 必填,签名
jsApiList: ['onMenuShareTimeline'], // 必填,需要使用的 JS 接口列表
openTagList: ['wx-open-launch-weapp'] // 可选,需要使用的开放标签列表
});
const _this = this;
wxapi.ready(() => {
_this.$nextTick(() => {
//监听按钮异常
var btn = document.getElementById('launch-btn');
btn.addEventListener('launch', function(e) {
console.log('success');
});
btn.addEventListener('error', function(e) {
console.log('fail', e.detail);
});
})
})
wxapi.error((err) => {
uni.showToast({
title: "微信授权失败"
})
})
}
}
}
</script>
以上就是全部代码
推荐几个写的不错的同类型文章:
https://cloud.tencent.com/developer/article/1893051
https://blog.csdn.net/weixin_45532305/article/details/109491862
http://events.jianshu.io/p/88ad52ce7b6f
码字不易,点个赞再走呗 ヾ(≧▽≦*)o
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我正在寻找一种简单的方法来为我在RubyonRails上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。有没有这样的插件\gem?或者我应该自己做... 最佳答案 LaunchingSoon是一个Rails插件。它还集成了MailChimp或Campaignmonitor. 关于ruby-on-rails-RoR&&"comingsoon"页面,我们在StackOverflow上找到一个类似的问题: https:/