QQ 互联分享签名分享方案
1. 概述
签名分享的目的是防止消息伪造或者在传递的过程中被恶意篡改, 本方案具体分享过程如下:

说明:
● 应用页面:需要分享内容的页面, 比如腾讯视频的视频播放页面。
● 应用后台:比如腾讯视频的后台。
● appkey 是计算签名的关键,业务务必保护好 appkey,不能泄露。
● 签名是纯算法计算,无需与 QQ 互联后台交互。
● 上图中的 1,2 两步可以提前进行以降低分享耗时, 例如:腾讯视频后台计算好签名,在返回视频信息的同时把签名一起返回给视频页面。
2. 签名规则
请求参数如下:
参数 | 类型 | 值示例 | 说明 |
appid | uint32 | 2222222 | 必填:申请到的appid |
ts | uint32 | 1465185768 | 必填:签名时间戳, 距离消息发送时间需要在 24小时之内 |
nonce | uint32 | 562341234 | 必填:每次签名随机生成一个正整数使用 |
json | {"xxxx": 123} | 必填: 分享的内容, 没有参数名, 具体值取决于分享接口的参数 |
签名步骤如下:
- 拼接签名原文。签名原文串的拼接规则为:
请求方法 + 请求域名 + 请求路径 + ? + 请求字符串 + 分享内容 json 字符串 |
● 请求方法:固定为 POST,注意为全大写
● 接口域名:固定为 connect.qq.com
● 请求路径:固定为 /share
● 请求字符串:把签名参数和值按字典序拼接为字符串,如: appid=222222&nonce=1234&ts=1618924373
● 请求body:即为分享内容组成的 json 字符串
假设分享参数如下:
● appid:222222
● nonce:1234
● ts:1618924373
● 分享内容:{"msg_style": 0, "title":"标题", "summary":"内容", "brief":"互联分享","url":"https://www.qq.com","picture_url":"https://www.qq.com/picture.png"}
按照规则拼出来的签名原文如下:
POSTconnect.qq.com/share?appid=222222&nonce=1234&ts=1618924373&{"msg_style": 0, "title":"标题", "summary":"内容", "brief":"互联分享", "url":"https://www.qq.com", "picture_url":"https://www.qq.com/picture.png"} |
● 计算签名
此步骤生成签名串。 首先使用 HMAC-SHA1 算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64 进行编码,即可获得最终的签名串。假设 appkey 为: fakeAppkey 最终得到的签名结果为:
Ngyk0JS5pQR8ffygeeMHFUNFQQA= |
PHP 语言示例:
$appkey = 'fakeAppkey';
$srcStr = 'POSTconnect.qq.com/share?appid=222222&nonce=1234&ts=1618924373&{"msg_style": 0, "title":"标题", "summary":"内容", "brief":"互联分享", "url":"https://www.qq.com", "picture_url":"https://www.qq.com/picture.png"}';
$signStr = base64_encode(hash_hmac('sha1', $srcStr, $appkey, true));
echo $signStr;
Go 语言示例:
package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
)
func main() {
appkey := "fakeAppKey"
srcStr := `POSTconnect.qq.com/share?appid=101579667&nonce=123213231321&ts=1730948899&{"msg_style": 11, "brief":"互联ARK 大图分享", "picture_height":100, "picture_width":100, "picture_url":"https://tangram-1251316161.file.myqcloud.com/files/20200722/796170665c821b9a1982918094aa6ba7.png"}`
// sha1
hmacObj := hmac.New(sha1.New, []byte(appkey))
hmacObj.Write([]byte(srcStr))
// base64
sign := base64.StdEncoding.EncodeToString(hmacObj.Sum(nil))
fmt.Println(sign)
}
签名算法可支持几乎所有编程语言
使用其它程序设计语言开发时,可用上面示例中的原文进行签名验证,得到的签名串与例子中的一致即可。签名算法来源于 腾讯云V1版本 API,其它语言签名算法的具体实现,可参考腾讯云示例,自行实现
FAQ
有什么简便方法计算分享签名
- 有些在线执行语言的工具,可以执行 go 语言的签名代码,比如 Go Playground - The Go Programming Language 执行后即可得到签名,请求时填上即可

为什么报签名错误
计算签名时注意核对签名时的参数和分享时的参数必须一致,主要有以下参数 appid,appkey,sign_nonce,sign_ts 和 json_str
注意 json_str 签名和最终使用的内容必须严格一致,不能有多余的换行或者空格