最稳方案是用QQ官方share接口,但必须HTTPS、域名加白名单、正确传参且qz-sdk.js需从官方CDN加载;本地测试可用appid 1000001,调用QZApp.jumpToShare({to:2,url,title,desc,site})触发分享。
直接用 QQ 官方提供的 share 接口最稳,但必须走 HTTPS,且不能在本地 file:// 协议下测试——这是绝大多数人卡住的第一步。
常见现象:按钮显示正常,点击没反应,控制台无报错,或报 SecurityError、Invalid App ID。根本原因通常是:
QQ互联后台 中添加白名单(即使只是测试,也得填 localhost 或你的开发域名)QZApp.jumpToShare 时传了错误的参数结构,比如漏掉 to 字段或 url 未 encodeURIComponentqz-sdk.js 没加载完就执行分享逻辑必须从官方 CDN 加载 qz-sdk.js,不能自己下载或托管(否则签名校验失败)。初始化只需两步:
1. 在 <head> 或页面底部插入 SDK 脚本:
立即学习“前端免费学习笔记(深入)”;
<script src="https://qzs.qq.com/qzone/vas/frame/qz-sdk.js" async></script>
2. 等 SDK 就绪后调用 QZApp.init,传入你在 QQ互联 申请的 appid:
QZApp.init({appid: "123456789"});
注意:appid 是你在 connect.qq.com 创建应用后分配的,不是 QQ 号;本地开发可先填 1000001(测试用 ID),但上线必须换正式 ID。
调用 QZApp.jumpToShare,参数必须是对象,且 to 必须为 2(代表 QQ 空间),其他关键字段:
url:要分享的目标链接,必须是完整 URL(含 https://),且与后台白名单匹配desc:摘要,最长 200 字符title:标题,最长 50 字符summary:旧版字段,已废弃,别用site:来源站点名(如“我的博客”),非必填但建议填示例代码:
document.getElementById("qq-share-btn").onclick = function() { QZApp.jumpToShare({ to: 2, url: encodeURIComponent("https://example.com/article/123"), title: "一篇技术笔记", desc: "关于 HTML 分享功能的实操细节", site: "TechLog" });};
⚠️ 特别注意:url 字段值本身不需要再 encode,但如果你拼接了中文参数,整个 URL 应先 encodeURIComponent ——SDK 内部会 decode 一次再用,所以实际要 encode 两次才保险。
QQ 空间 App 在 iOS 和 Android 上对 jumpToShare 支持不一致:iOS 常静默失败,Android 较稳定。因此必须加降级逻辑:
navigator.userAgent.includes("MQQBrowser")
https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey? url=https%3A%2F%2Fexample.com%2Farticle%2F123& title=%E4%B8%80%E7%AF%87%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0& desc=%E5%85%B3%E4%BA%8EHTML%E5%88%86%E4%BA%AB%E5%8A%9F%E8%83%BD%E7%9A%84%E5%AE%9E%E6%93%8D%E7%BB%86%E8%8A%82
这个 URL 可以直接 window.location.href 跳转,兼容所有环境,但体验不如原生 SDK 流畅(会打开新标签页)。
真正难的不是写几行 JS,而是把域名、协议、AppID、URL 白名单这四者对齐;少一个,按钮就只是个好看的 div。