最近,非个人主体的认证的小程序,可以直接在html
页面中打开,这个权限还挺有用的,不仅适用于微信内部的浏览器,而且还可以在外部浏览器或者app中打开,比如UC浏览器、华为浏览器等。这里注意一下,官方特别说明:是使用云开发
托管的网页。
开通条件:
- 准备好非个人主体的认证的小程序
- 开通云开发
- 使用云开托管静态网站
方法也很简单,在正常的公众号网页开发中,引入公众号JSSDK
,
<!-- 公众号 JSSDK -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
然后在wx.config
可以传入小程序 AppID 并且不需计算签名,也就是免鉴权即可使用跳转小程序的能力。
这里有个官方的例子:https://postpay-2g5hm2oxbbb721a4-1258211818.tcloudbaseapp.com/jump-mp.html ,可以直接复制到任意浏览器中打开。网页会判断所在的环境来觉得采用哪种跳转方式,如检测到微信客户端内,则免鉴权使用开放标签跳转,如检测到在外部浏览器或 App,则使用 URL Scheme(Deep Link)
跳转小程序。
以下几个参数必须要配置正确:
- 小程序 AppID:填入你的小程序 AppID
- 云开发环境 ID:填入你的开通了静态网站托管的云开发环境 ID
- 小程序原始账号 ID:填入你的小程序原始账号 ID(gh_ 开头)
- 小程序页面路径:填入要跳转到的小程序的页面路径
- 小程序名称:填入要跳转到的小程序名称
上面链接的例子,官方提(关注)正义的程序猿公众号供了代码,把replace
的地方替换成你自己的:
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
}
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: \'小程序 AppID\', // <!-- replace -->
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: \'小程序 AppID\', // <!-- replace -->
// 云开发环境 ID
resourceEnv: \'云开发环境 ID\', // <!-- replace -->
})
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>
/**
* 样式不重要,可以直接忽略
**/
</style>
</head>
<body>
<div class="page full">
<div id="public-web-container" class="hidden">
<p class="">正在打开 “填入你的小程序名称”...</p> <!-- replace -->
<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> <!-- replace -->
<!-- 跳转小程序的开放标签。文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html -->
<wx-open-launch-weapp id="launch-btn" username="小程序原始账号 ID(gh_ 开头的)" path="要跳转到的页面路径"> <!-- replace -->
<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>
上面代码,判断在微信公众号里面(关注)正义的程序猿,会使用wx-open-launch-weapp
开放标签,https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html ,详情可以看这个文档。
开放标签微信版本要求为:7.0.12及以上。 系统版本要求为:iOS 10.3及以上、Android 5.0及以上。
如果是在手机浏览器中,就使用Cloud
函数调用获取指定的Url Scheme(deeplink)
,唤起微信,步骤打开就是这样。
云函数
-
新建一个云函数
-
在云开发控制台中的
设置 -> 权限设置
中,将对应开通了静态网站的云环境开启未登录模式访问 -
在云开发控制台中的
云函数 -> 权限设置
中,配置安全规则,选择“允许所有用户访问”
的模板并确认
云函数index.js
代码如下,就很简单,注意配置小程序的路径:
// 云函数入口文件
const cloud = require(\'wx-server-sdk\')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
switch (event.action) {
case \'getUrlScheme\': {
return getUrlScheme(event.options)
}
}
return \'action not found\'
}
async function getUrlScheme(options) {
return cloud.openapi.urlscheme.generate({
jumpWxa: {
path: \'/page/component/index\', // <!-- replace -->
query: \'\',
},
// 如果想不过期则置为 false,并可以存到数据库
isExpire: true,
// 一分钟有效期
expireTime: parseInt(Date.now() / 1000 + 60),
})
}
体验效果如下:
微信浏览器中:
其他外部浏览器中:
至此,整个流程就差不多是这样。这个功能个人小程序暂时无法使用,但是也有方法解决,比如通过企业认证小程序跳个人小程序,还有文章中也提到通过URL Scheme跳转,而URL Scheme本身就已经很强大了,这里是不是会有一些可乘之机呢?我相信,这一功能的发放,对于灵敏的人早已发现新的玩法!这就是赚钱的机会啊。
请发表评论