不用备案也能支持微信自定义分享

2021-02-03
3分钟阅读时长

提醒:本文最后更新于 1163 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Featured Image

我们知道,在微信中打开网页,使用右上角的 ... 分享给朋友/朋友圈,是可以使用 JS SDK 自定义分享卡片文案的。为了让分享内容能够更好的受到监管,从早期会自动读取网页内第一张大图到后期使用 JS SDK 自定义分享,再到后期需要做域名绑定关联,自定义分享卡片内容的流程变的越来越复杂。

目前如果你的网站想要增加微信自定义分享文案的支持,需要准备以下两件事情:

  1. 确保你的网站域名已备案,并被添加到了一个已认证的公众号的“JS安全域名”中。
  2. 提供服务端支持,用于与微信交互获取 access token 和 jsapi ticket 并计算获得最终的 signature,用于在前端调用微信 JS SDK 时进行校验。

具体的流程可以参见微信开放文档。可以看到要想实现自定义分享文案,除了开发流程之外,你还需要域名备案和公众号认证,这两个做过的人肯定知道会有多头疼了。而最蛋疼的是,我的博客域名后缀 .org 目前是不支持备案的,难道就没有办法了吗?

wxhermit

为了能让未备案网站也能自定义分享文案,我开发了 wxhermit 这个项目。它的原理非常简单,基本就是在已备案域名下 <iframe> 嵌套展示未备案域名,并通过 postMessage 通信,将自定义分享的文案传递到父页面。最终实现了任意网站分享自定义的需求。

当然它的本质还是使用基于最开始的备案域名网站进行分享。由于微信分享需要提供已认证公众号并绑定已备案域名,一个已认证公众号只能绑定至多 5 个安全域名,条件颇为苛刻。针对 5 个以上的域名,部分域名无法备案的情况,要自定义微信分享的文案就非常麻烦。本方案比较好的迂回解决该问题。

如何使用

在服务端使用 Docker 启动服务。其中 WECHAT_IDWECHAT_SECRET 是在微信公众号后台开发-基本配置中获取的“开发者ID”和“开发者密码”。而 ALLOW_HOST_LIST 是为了避免服务被滥用,允许开发者配置允许使用内嵌服务的网站。可以使用逗号拼接多个域名,例如 imnerd.org,eming.li。不在该列表中的域名会直接跳转会源地址。

docker run \
  -e WECHAT_ID=<WECHAT_ID> \
  -e WECHAT_SECRET=<WECHAT_SECRET> \
  -e ALLOW_HOST_LIST=<ALLOW_HOST_LIST> \
  -p 8360:8360
  lizheming/wxhermit

而对于需要使用该服务的网站,需要在页面中增加以下代码用于自定义分享文案。其中 wxhermit 是固定值,其它的为自定义文案内容。

<script>
if (window.parent !== window) {
  window.parent.postMessage({ 
    type: 'wxhermit',
    title: '自定义分享的标题',
    desc: '自定义分享的描述',
    imgUrl: '自定义分享的封面图'
  }, '*');
}
</script>

配置好后就可以在微信使用 <domain>/?url=<url> 来访问了,其中 <domain> 是你的已绑定的安全域名,<url> 则是在 ALLOW_HOST_LIST 中配置的可使用域名下的网址。

后记

通过代理的形式很好的解决了我未备案域名需要自定义分享的问题。为了能让体验更自然,我在我的网站中增加了在微信中自动跳转至该嵌套页面的逻辑。

<script>
if(/micromessenger/i.test(navigator.userAgent) && window.parent === window) {
	location.href = 'https://wechat.75.team/?url=' + encodeURIComponent(location.href);
}
</script>

不过它的缺点也很明显,本质相当于将所有的域名都挂靠在某个安全域名之下。所以在微信下拉显示网站地址的时候都还是显示该安全域名。而且子域如果出现内容问题的话风险也全部在该安全域名上,所以建议是 ALLOW_HOST_LIST 配置个人可控域名。

除了我的这种方案之外,也有配置 <meta> 信息通过 Safari 调用系统的分享功能设置封面图和文案的方式,以及通过 QQ 浏览器分享自动获取页面第一张大图的形式自定义分享卡片。不过它们在可定制和确定性上都要稍微弱一些,可以根据实际情况选择使用。

Avatar
怡红公子 擅长前端和 Node.js 服务端方向。热爱开源时常在 Github 上活跃,也是博客爱好者,喜欢将所学内容总结成文章分享给他人。

7 评论

W4J1e Chrome86.0 Windows 10
2021-06-06 03:23:38 回复

貌似公子博客的深色模式不能用噢。

怡红公子 Chrome91.0 Mac OS 10.15.7
2021-06-12 12:23:58 回复

@W4J1e , 我试了一下,可以用的诶,你可以看下控制台有什么报错?

W4J1e Chrome86.0 Windows 10
2021-06-15 08:51:40 回复

@怡红公子 , 比如在这个文章里,右上角有一个小月亮。点击一下就消失了,但是模式没有切换回来,在首页是可以的。控制台没有报错。

怡红公子 Chrome91.0 Mac OS 10.15.7
2021-06-17 00:02:09 回复

@W4J1e , 嗯,发现问题了。是我加的 Waline 评论里面有一个事件监听没处理好导致的,已经修复了。非常感谢你的反馈哦~

小明猪 Safari14.0 Mac OS 10.15.6
2021-02-17 08:13:03 回复

你这现在已经完全是技术博客+技术人了。单纯路过一下:)

PS: 好像评论不能提交?

怡红公子 Chrome88.0 Mac OS 10.15.6
2021-03-02 14:54:36 回复

@小明猪 , 欢迎路过,现在变懒了,只有技术文章还能驱动下自己写一下了,不像你还一直笔耕不辍,羡慕~
PS. 评论需要人工审核通过才会在前台展示~

小明猪 Safari14.0 Mac OS 10.15.6
2021-02-17 08:11:22 回复

你这现在已经完全是技术博客+技术人了。单纯路过一下:)