分享到 :

QQ 互联分享签名分享方案

1. 概述

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

说明:

● 应用页面:需要分享内容的页面, 比如腾讯视频的视频播放页面。
● 应用后台:比如腾讯视频的后台。
● appkey 是计算签名的关键,业务务必保护好 appkey,不能泄露
● 签名是纯算法计算,无需与 QQ 互联后台交互。
● 上图中的 1,2 两步可以提前进行以降低分享耗时, 例如:腾讯视频后台计算好签名,在返回视频信息的同时把签名一起返回给视频页面。

2. 签名规则

请求参数如下:
参数类型值示例说明
appiduint322222222必填:申请到的appid
tsuint321465185768必填:签名时间戳, 距离消息发送时间需要在 24小时之内
nonceuint32562341234必填:每次签名随机生成一个正整数使用
json{"xxxx": 123}必填: 分享的内容, 没有参数名, 具体值取决于分享接口的参数
签名步骤如下:
  1. 拼接签名原文。签名原文串的拼接规则为:
请求方法 + 请求域名 + 请求路径 + ? + 请求字符串 + 分享内容 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

有什么简便方法计算分享签名

为什么报签名错误

计算签名时注意核对签名时的参数和分享时的参数必须一致,主要有以下参数 appid,appkey,sign_nonce,sign_ts 和 json_str

注意 json_str 签名和最终使用的内容必须严格一致,不能有多余的换行或者空格

返回顶部