抖音
复制页面
抖音
简介
签名算法
接口调用凭证
经营能力调用凭证
BusinessToken 生成
BusinessToken 刷新
经营能力当前状态查询
非用户授权调用凭证
获取应用授权调用凭证
getAccessToken
用户授权调用凭证
获取用户授权调用凭证
刷新用户授权调用凭证
刷新授权调用凭证
登录
code2Session
POST
小程序码与小程序链接
Schema 链接
生成SchemaV2
查询SchemaV2
查询Schema配额V2
Link链接
生成 Link V2
查询 Link 配额V2
查询 Link V2
二维码
生成QRCodeV2
私域经营
私信管理
IM主动授权webhook
主动发送私信
群聊管理
粉丝群webhook
用户加群申请 webhook
用户加群webhook
查询群信息
设置进群问候语&群公告
创建粉丝群
取消进群问候语&群公告配置
变更用户入群申请状态
查询用户剩余建群额度
查询群主所在群的用户入群申请状态
经营工具
小程序引导卡片
创建/更新小程序引导卡片模板
查询小程序引导卡片模板
删除小程序引导卡片模板
图片上传
线索组建
创建线索组件
POST
查询已创建的线索组件
GET
更新线索组件
POST
删除线索组件
GET
视频能力
视频数据查询
查询特定视频的视频数据
近 30 天用户视频数据
获取视频基础数据
获取视频点赞数据
获取视频评论数据
获取视频播放数据
获取视频分享数据
视频评论数据
置顶评论
评论回复列表
评论列表
回复视频评论
videoid转换itemid
POST
itemid转换encryptid
POST
搜索能力
创建抖音搜索直达子服务
POST
查询已创建的 抖音搜索直达子服务列表
GET
删除抖音搜索直达子服务
DELETE
校验是否有搜索直达服务的创建权限
GET
电商
注册小程序积分阈值
注册小程序预览图
查询订单的 定制完成状态
定制类小程序开发者注册信息
退会
生活服务
店铺接入
商铺同步
查询店铺
获取抖音POI ID
店铺匹配任务结果查询
店铺匹配状态查询
提交门店匹配任务
查询全部店铺信息接口(天级别请求5次)
查询店铺全部信息任务返回内容
商品库接入
(老版本)SKU同步
(老版本)sku拉取(该接口由接入方实现)
(老版本)多门店SPU同步
(老版本)多门店SPU状态同步
(老版本)多门店SPU库存同步
(老版本)多门店SPU信息查询
创建/修改团购商品
免审修改商品
上下架商品
同步库存
查询商品模板
查询商品草稿数据
查询商品线上数据
查询商品线上数据列表
查询商品草稿数据列表
用于创建多 SKU 商品。
查询商品品类
端内消息同步
订单同步
poi数据接入
获取POI基础数据
POI用户数据
POI服务基础数据
POI服务成交用户数据
POI热度榜
POI认领列表
poi基础能力
通过高德POI ID获取抖音POI ID
优惠卷接入
优惠券同步
优惠券更新
CPS佣金设置与查询
通用佣金计划查询带货数据
通用佣金计划查询达人带货数据
通用佣金计划查询带货达人列表
通用佣金计划查询达人带货详情
查询通用佣金计划
发布/修改通用佣金计划
修改通用佣金计划状态
发布/修 改直播间定向佣金计划
发布/修改短视频定向佣金计划
修改定向佣金计划状态
取消定向佣金计划指定的达人
查询达人的定向佣金计划带货数据
通过商品 ID 查询定向佣金计划
查询定向佣金计划带货汇总数据
用户信息
用户抖音主页数据
获取用户视频情况
获取用户粉丝数
获取用户点赞数
获取用户评论数
获取用户分享数
获取用户主页访问数
分享
拍抖音任务
拍抖音任务变更推送
创建任务
查询用户任务进度
拍抖音互动任务
拍抖音互动任务变更推送
创建任务
查询用户任务进度
分享任务
创建任务
查询用户任务进度
客服
CustomerServiceUrl
小程序卷
「小程序券」直播玩法接入指南
小程序券API列表
更新日志
用户卷管理
查询用户可用券信息
用户领券结果回调通知
用户撤销核销券
用户手机号授权结果回调通知
用户核销券
主播授权管理
查询主播发券配置信息
修改主播发券权限状态
更新主播发券库存上限
主播发券权限配置
卷模版管理
查询授权用户发放的活动信息
创建券模板
修改券模板
删除券模板
修改券模板库存
修改券模板状态
查询券模板发放统计数据
查询券模板
查询对账单
接口发放管理
创建开发者接口发券活动
开发者接口发券
删除开发者接口发券活动
交易系统
通用交易系统
通用参数
进件
接口进件
图片上传
发起进件
进件查询
获取进件页面链接
开发者获取小程序收款商户/合作方进件页面
服务商获取小程序收款商户进件页面
服务商获取服务商进件页面
服务商获取合作方进件页面
标签
查询标签组信息
订单
查询CPS信息
查询订单信 息
支付结果回调
退款
发起退款
查询退款
同步退款审核结果
退款申请回调扩展点
退款结果通知
履约
推送履约状态
结算
发起分账
查询分账
通知分账结果
提现
接口提现
商户余额查询
商户提现
商户提现结果查询
获取提现页面链接
开发者获取小程序收款商户/合作方提现页面
服务商获取小程序收款商户提现页面
服务商获取服务商提现页面
服务商获取合作方提现页面
获取对账单
获取资金账单
获取交易账单
生活服务交易系统(金融合板)
通用参数
错误码和返回码
查询接口
查询订单信息
查询券状态信息
查询 CPS 信息
预下单
预下单扩展点
开发者发起下单
营销算价
营销算价扩展点介绍
查询营销算价扩展点
支付
支付结果通知
核销
抖音码
验券准备
验券
撤销核销
券码核销通知
撤销核销通知
三方码
推送核销状态
撤销核销
分账
查询分账
退货退款
开发者发起退款
同步退款审核结果
查询退款
退款扩展点
退款结果通知
生活服务交易系统(账号融合版)
错误码和返回码
通用参数
预约
创建预约单
预约接单结果回调
商家取消预约
用户取消预约
查询预约单信息
预约接单超时回调
预约取消/ 完成通知
查询接口
查询订单信息
查询券状态信息
查询CPS信息
预下单
预下单回调
关闭订单
发起下单
营销算价
营销算价扩展点介绍
查询营销信息扩展点
算价扩展点
营销查询算价二合一
支付
通知支付结果
核销
抖音码
验券准备
验券
三方码
推送核销状态
核销工具
查询用户券列表
查询订单可用门店
券核销消息通知
撤销核销消息通知
设置商家展示信息
查询商家配置文案
设置订单详情页按钮白名单接口
设置小程序跳转path
分账
发起分账
查询分账
通知分账结果
退货退款
发起退款
同步退款审核结果
查询退款
退款申请回调
通知退款结果
行业交易系统
API 调用
通用参数
错误码和返回码
回调设置
设置回调地址
查询回调地址
预下单
查询 CPS 信息
查询订单信息
预下单回调
开发者发起下单
营销算价
营销算价扩展点介绍
查询营销信息扩展点
设置扩展点
算价扩展点
支付
通知支付结果
核销
抖音码
验券准备
验券
查询劵状态信息
三方码
推送核销状态
分账
发起分账
查询分账
通知分账结果
提货退款
开发者发起退 款
同步退款审核结果
查询退款
退款申请回调
通知退款结果
内容安全
内容安全检测
图片检测V2
图片检测V3
泛知识
角色系统
错误码
上传材料
代运营服务商帮老师或代运营模式机构入驻
自营机构/服务商入驻
新增角色
查询基础认证资质
更新基础认证资质
查询类目认证资质
更新类目认证资质
添加类目认证资质
获取审核任务详情
小程序绑定角色
小程序解除绑定角色
查询小程序已绑定的角色
角色授权小程序
解除授权小程序
查询授权小程序
更新授权小程序授权信息
查询抖音号绑定、能力授权
新增抖音号绑定、能力授权
解除抖音号绑定、解除能力授权
查询实体ID
查询实体已绑定抖音号列表
课程库
【泛知识】回调通知
【泛知识】课程库 FAQ
【泛知识】错误码
【泛知识】上传课程资源
【泛知识】查询课程资源上传状态
【泛知识】查询资质
【泛知识】添加课程
【泛知识】修改课程
【泛知识】修改课程状态
【泛知识】查询课程
【泛知识】修改课程免审
【泛知识】查询免审课程
【泛知识】修改商品退款规则
【泛知识】查询可选退款规则
【泛知识】查询课程类目信息
担任支付
进件
进件状态回调
发起进件请求
图片上传接口
进件状态查询
支付
支付结果回调
支付常见问题
预下单接口
唤起收银台
支付结果查询
退款
退款结果回调
退款常见问题
发起退款
退款结果查 询
结算及分账
收费规则
结算及分账常见问题
自动结算
自动结算接入说明
自动结算结果回调
自动结算结果查询
发起结算及分账
结算及分账结果查询
结算及分账结果回调
可分账余额查询
退分账
发起退分账
查询分账回退结果
提现
商户余额查询
商户提现
商户提现结果查询
商户提现回调
获取对账单
获取交易账单
获取资金账单
接口获取页面链接
进件
开发者获取小程序收款商户/合作方进件页面
服务商获取小程序收款商户进件页面
服务商获取服务商进件页面
服务商获取合作方进件页面
提取
开发者获取小程序收款商户/合作方提现页面
服务商获取小程序收款商户提现页面
服务商获取服务商提现页 面
服务商获取合作方提现页面
订单推送
订单同步
评价
获取评价数据
其他
用户登录态签名
抖音开放平台与小程序视频打通能力
抖音开放平台与小程序视频打通能力
视频使用能力能力
开放能力配置接口
开放能力配置接口
配置开放能力实现接口
查询生效中配置接口
解决方案测试实体管理接口
解决方案测试实体管理接口
新增测试实体接口
查询测试实体接口
删除测试实体接口
直播间自定义封面
上传资源
能力申请
查询能力申请状态
订阅消息
查询订阅消息模版库
发送订阅消息
查询小程序的模版列表
添加模板
删除已添加的模版
查询新建订阅消息模板列表
新建订阅消息模板
小程序推广计划
短视频任务
创建任务
小程序任务台能力
创建任务
查询任务台任务投稿视频数据(明细)
查询任务台任务投稿视频数据
查询小程序任务台任务 ID
更新任务状态
重新提交任务基础信息
查询任务详情
更新专属任务达人
查询视频任务相关实时汇总数据
直播间任务
创建直播间任务
更新直播间任务
挂载
自主挂载
获取作者视频列表
自主挂载存量视频绑定锚点
自主挂载存量视频解绑锚点
小程序直播挂载黑白名单管理能力
拍抖音黑白名单管理能力
申请短视频自主挂载能力
查询短视频自主挂载能力申请状态
申请直播自主挂载能力
查询直播自主挂载能力申请状态
申请短视频达人推广挂载能力
查询短视频达人推广挂载能力申请状态
查询直播达人推广挂载能力申请状态
申请直播达人推广挂载能力
短视频/直播自主挂载能力绑定抖音号
获取短视频/直播自主挂载抖音号绑定二维码
查询短视频/直播自主挂载能力绑定抖音号列表
解除短视频/直播自主挂载能力抖音号绑定
挂载权限校验
修改短视频锚点配置
查询短视频锚点配置
查询短视频锚点配置修改记录及状态
图片上传
图片审核状态查询
图片删除
设置全局默认配置
设置指定页面配置
查询全局默认配置
查询指定页面配置
删除指定页面配置
讲解卡动态更新
分发
添加小程序别名
查询小程序别名
修改小程序别名
删除小程序别名
设置小程序搜索标签
查询小程序搜索标签列表
引导关注抖音号
绑定抖音号
获取抖音号绑定二维码
获取绑定抖音号列表
解除抖音号绑定
数据分析
用户分析
行为分析
实时分析
留存分析
来源分析
用户画像
终端分析
页面分析
交易分析
总览分析
流量转化
短视频交易分析
获取直播房间数据
直播数据分析
直播交易分析
商品分析
短视频分析
短视频投稿数据
短视频总览数据
短视频详细数据
流量来源
直播分析
直播间详细数据
接口 1
接口 2
直播间总览数据
主播分析
小房子直播分析
小房子直播间总览数据
小房子直播间详细数据
小房子直播间订单数据
留资分析
组件使用数据
流量来源
组件详细数据
组件使用对比
服务类目
获取已设置的服务类目
直播间能力
查询跳转抖音直播间能力申请状态
申请跳转抖音直播间能力
查询直播间状态组件能力申请状态
申请直播间状态组件能力
抖音开放能力
查 询抖音开放能力列表
申请开通抖音开放能力
查询scope配额详情
scope申请提额
查询视频关键词列表
新增视频关键词
删除视频关键词
页面结构自定义
查询页面结构自定义能力申请状态
申请页面结构自定义能力
普通二维码绑定
查询普通二维码绑定列表
新增绑定二维码
更新绑定二维码链接
更新绑定二维码状态
删除绑定二维码链接
抖音号绑定
获取抖音号绑定所需的资质模版列表
获取抖音号绑定所需的资质模版信息
输入抖音号绑定
获取抖音号绑定二维码
查询抖音号绑定列表及状态
解除抖音号绑定
流量主
查询流量主开通状态
开通流量主
查询广告位列表
新增广告位
更新广告位状态
查询广告收入
查询广告结算单列表
抖店绑定
绑定抖店开放平台账号
查询绑定的抖店开放平台账号信息
配置抖店开放平台应用
查询配置的抖店开放平台应用信息
获取绑定抖店账号信息
签名算法
复制页面
遇到任何签名问题强烈建议请先通读本文,从历史经验看,平台当前遇到的 oncall 问题都可以从本文中找到答案,提 oncall 问题并得到解答的时间往往比通读本文自行解决要慢,因此强烈建议遇到签名问题时先从本文中寻找答案
。
签名算法
鉴权认证机制采用 SHA256-RSA2048 实现,字符编码采用 UTF-8 编码集。
本签名规范中,加签和验签的原文组装方式略有不同,请严格按照规范要求进行组装。
使用说明
在鉴权认证机制中,需要 4 个密钥,分别为
平台公钥:
每个「小程序」对应的平台公钥是不一样的,平台公钥由「开放平台」负责生成,并告知「小程序」开发者。
平台私钥:
每个「小程序」对应的平台私钥是不一样的,平台私钥由「开放平台」负责生成和保存。
应用公钥:
「小程序」的应用公钥由开发者生成并上传到「开放平台」,可支持更换。
应用私钥:
「小程序」的应用私钥由开发者生成并保存,不能对外提供,可支持更换。
交互方式如下图所示
应用密钥
应用公钥和私钥由开发者生成并保存,同时应用公钥需要在「
抖音开放平台
」的小程序管理后台上传。
生成方式
应用公钥和私钥的生成方式可参考:
o
p
e
n
ss
lOp
e
n
SS
L
>
g
e
n
rs
a
−
o
u
tp
r
i
v
a
t
e
k
ey
.
p
e
m
2048
G
e
n
er
a
t
in
g
RS
A
p
r
i
v
a
t
e
k
ey
,
2048
bi
tl
o
n
g
m
o
d
u
l
u
s
....................
+
+
+
...........................................................................
+
+
+
e
i
s
65537
(
0
x
10001
)
Op
e
n
SS
L
>
rs
a
−
in
p
r
i
v
a
t
e
k
ey
.
p
e
m
−
p
u
b
o
u
t
−
o
u
tp
u
b
l
i
c
k
ey
.
p
e
m
w
r
i
t
in
g
RS
A
k
ey
Op
e
n
SS
L
>
e
x
i
t
lsprivate_key.pem public_key.pem
上传方式
登录「
抖音开放平台
」,进入小程序的「开发管理-开发设置」页,在「密钥设置」处点击“更新”
平台公钥
平台公钥和私钥由「开放平台」负责生成和保存,不同「小程序」的平台公钥和私钥是不同的。
获取方式
登录「
抖音开放平台
」,进入小程序的「开发管理-开发设置」页,平台公钥在「密钥设置」处。
开发指南
生成签名
「小程序」应按照下述步骤生成请求的签名信息。
第一步:构造待签名串
待签名串一共有五行,每一行必须以 \n(换行符,ASCII 编码值为 0x0A)结束。
HTTP请求方法\nURL\n请求时间戳\n请求随机串\n请求报文主体\n
其中:
HTTP 请求方法
如:POST,GET,PUT 等。
注意请使用大写
。
URI
获取请求的绝对 URL,
并去除域名
部分得到参与签名的 URI。 URI必须以斜杠字符“/”开头。 如
PATH=
https://open.douyin.com/api/trade/v2/query
URI 则为 /api/trade/v2/queryPATH=
https://open.douyin.com/api/trade/v2/query?a=x
URI 则为 /api/trade/v2/query?a=x
请求时间戳
发起请求时系统的当前时间戳,即格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起至现在的总秒数,作为请求时间戳。
「开放平台」会拒绝处理一个小时之前发起的请求
。
请求随机串
任意生成一个随机字符串(长度不限制),以保证相同时间相同参数发起的请求签名值不一样。
请求报文主体
获取请求中的请求报文主体(request body)。
请求方法为GET时,报文主体为空。
当请求方法为POST或PUT时,请使用报文内容。
第二步:计算签名值
「小程序」成功构造待签名串后,「小程序」使用应用私钥对待签名串进行SHA256-RSA2048签名,并对签名结果进行Base64编码得到签名值。
第三步:设置 Header
签名信息通过 HTTP 头Byte-Authorization传递,Byte-Authorization由认证类型和签名信息两部分组成。
Byte-Authorization: 认证类型 签名信息
认证类型:
目前为 SHA256-RSA2048
签名信息:
应用 appid
请求随机串 nonce_str
请求时间戳 timestamp
公钥版本 key_version
签名值 signature
注意
:
以上五项签名信息,无顺序要求。按照以下示例格式,key="value",签名信息之间用英文逗号,隔开。
请求随机串和请求时间戳必须和计算签名值时使用的请求随机串和请求时间戳保持一致。
公钥版本必须填写计算签名值时采用的应用私钥对应的应用公钥版本,应用公钥版本可通过「开发管理-开发设置-密钥设置」处获取。
示例如下:
curl -v -d '{"appid":"ttxxx","order_id":"xxx"}' -H 'Byte-Authorization: SHA256-RSA2048 appid="ttxxx",nonce_str="DC10180A100073E70A48F195DA2AF2E6",timestamp="1623934869",key_version="1",signature="nwd1L3wCX+01/TVTkILeovF1DtYeghC1VHjrcjTHVkh7+gRaONEQkC2Y72Mw8JdSnIyeAtyp/pDHzyKGywjVqv5+JOBEhQG1/pvwNHN49wD26qg3AJL4hXw0fMJSRiTQEV1MszwDLuaabvo/qM9OXL9KyYiEPwVJqYtzmho4cHXT6mYgzNOW1xt5d7RDf4QO74JI3i4dtk9Uj8svJTrrBabML6AUcqcx2OP/7xukdaUgPdPf+IqmMG6GC4n52LUDogcL5n/osLdfHg9l6kW5gDcDjBfNDaggz07QMPHGdVao7pnQ2ub7VqcFIuY6Q3cBL7ndQdDGKrv+WBy5Q90QjQ=="' -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST
https://webcast.bytedance.com/api/business/diamond/query
签名验证
「小程序」应按照下述步骤验证成功应答(HTTP 状态码为 2xx)的签名信息。
第一步:构造待签名串
应答验签名串一共有三行,每行必须以\n (ASCII 编码值为 0x0A)结束。
应答时间戳\n应答随机串\n应答报文主体\n
应答时间戳
从应答 HTTP 头Byte-Timestamp中获取应答时间戳。
应答随机串
从应答 HTTP 头Byte-Nonce-Str中获取应答随机串。
应答报文主体
应答中的报文主体(response body)。
第二步:获取应答签名
应答签名值通过 HTTP 头Byte-Signature传递。如:
Byte-Signature: hWsiaADxS4OKLW/0JpDXiiji+GNRIsnnXsux3nVdyk7X6dqoyyJVYloQR9h/C1DIhGeBKe0i1iciyp6uq4LIkScyQKLhwEaXnWpcYat3+SAgS3ZYcGFY/op/MTO1bf172wbQBamC6gwydOWF0tWlMQb33ZYhztEDnD8iw/JkogOGHjO5uo869xWbgcq0OrkRN4zPGpOc/eiOR/B7fzxbasdMZtENOQMpgPP0z3k/cgeG/DSOwtwfA0eYnpYC8YqvKZ52HI5aCPkexmkfzUqNl1tbVylbMKDQDQoipQSxQPK2fxOFHj+jYu1TQ+nQFeu6amU/1rsMbT8JWa94bwwgkg==
对 Byte-Signature 的签名值使用Base64解码,得到应答签名。
第三步:验证签名
使用平台公钥对验签名串和应答签名进行SHA256-RSA2048签名验证。
示例代码
签名示例代码
JAVAGOPHP public static String getSignature(String privateKeyStr, String method, String uri, long timestamp, String nonce, String body) throws Exception {
//method内容必须大写,如GET、POST,uri不包含域名,必须以'/'开头
String rawStr = method + "\n" + uri + "\n" + timestamp + "\n" + nonce + "\n" + body + "\n"; Signature sign = Signature.getInstance("SHA256withRSA"); sign.initSign(string2PrivateKey(privateKeyStr)); sign.update(rawStr.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(sign.sign());} public static PrivateKey string2PrivateKey(String privateKeyStr) { PrivateKey prvKey = null; try { byte[] privateBytes = Base64.getDecoder().decode(privateKeyStr); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); prvKey = keyFactory.generatePrivate(keySpec); } catch (Exception ex) { ex.printStackTrace(); } return prvKey;}
验签示例代码
JAVAGOPHPpublic static boolean verify(String httpBody, String publicKey, String signStr, Long timestamp, String nonce) throws Exception { StringBuffer buffer = new StringBuffer(); buffer.append(timestamp).append("\n"); buffer.append(nonce).append("\n"); buffer.append(httpBody).append("\n"); String message = buffer.toString(); Signature sign = Signature.getInstance("SHA256withRSA"); sign.initVerify(string2PublicKey(publicKey)); sign.update(message.getBytes(StandardCharsets.UTF_8)); return sign.verify(Base64.getDecoder().decode(signStr.getBytes(StandardCharsets.UTF_8)));}public static PublicKey string2PublicKey(String publicKey) throws Exception{ byte[] decoded = Base64.getDecoder().decode(publicKey); return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));}
自查数据
以下提供了一套标准 PKCS8 格式的 2048 位密钥和待签名串和签名串,开发者可以自行验证签名验签代码是否正确。
-----BEGIN PRIVATE KEY-----MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCZSHNcFfthd/bVYexEJWOBVEjjDcXjfr1fYevuraNFfMmLPKV836BbvCiUSWHzJYEpkJ934e/j28NBEcEbPDLiGlLTd6AVwR22TkUwpLr41oQprz0HKFwhVPZ0HQCGIv0pVMA53TFSitIqiqbNLmgm5yzSNqNy1t/0X/RfqEtA6Eoxw9u/Sx57i+pBFuLlZYanlm57+b7t1khg9JHvF0ulo7DScyJ4qgrD7oQf0RIQB0rqCFIeYuYO1cfvnxb9x4DPodEyVoAM4i9YdFop9ZHt73W/icuLku/P8/G1+arzB5b7S1S3ky5/KdS8AEA9Ww5czZcdf9Jgm2S6RymjFGjzAgMBAAECggEBAIryGNgdePyWcSJmHHR9a+CdFWD0aDBa/7CJpAN8VKc1gcB8Xgp+7+6X9jTM/EQa+CVEWrmiDgF/gVPnkyNsAzff4rqcEnoFzzglZSS9/lp4od7jYa+uTy1LxgflDkeJSfEASStqrT4EZpR3kNInQfQZ1BBNxQXhb6smm+9mL6kKQJjAqBgEqtUAmNv0GnH89ZPPgZuIZeeL4cb4BhMEoa5MBnI+HDf07cN1nECQXRJlHU/iyhAPfP7RpO8O9KGDEDE36qebu0Cu4yUjWANXiqECFv93sQzONotkl3VPealvXM+jzGT7YdgHo/t3QKE8flMBo/XUzGTqi8j5AOXiaBkCgYEAylKVtjQMYgg4qMwd9Je+KZ9qL6QVHCsB2NPUt8N99oj70efsG4aGaEAadr8meNhIJ5lpoK+FXqSBIbbDS/xeOVI3XoMx/EdKLw/ZNi87G/EHYK9z7Fr3W7q8DFXe2hZ/ojFXC/aaBanjVVBK/6RfPzXfnx+vGX/t1FhcLC+yQD8CgYEAwfMtrXfH+3dW77dxXT/CTFJVs/o1K2qbepnQ6A33KMHPLBtPZZ6z5rzIO7OMSNItOTXTEoRXHmOKc5FtXGtbCvGSRByb6FgDWG3p2Bp2sZLuJBzXmLbSnEbHTNHM6uTgxNgWAh8pYpjPY8xF7BqYz2rGT47OPBmctRzDjnzjak0CgYAqkM1mk/S2+zvQZ4E14GblouBYPZEjZ/jvgUGTl9F8eL1iIAUQlXDZpgLrULPrYLVtf101rTfF/Z4dVbIo3mOEc8OqYre1d9onpJHyUGWDL2Z59O/SniDEb7j4b2h/QZSArxi9L5if8GofnNDqj85qIg92Dthr6PpEXoKl2TMLSQKBgFzQBHHYukiqSV4ZyRQ4qMBhPkYMXFlUgObgqMoDtN06MewHfa1BjxHCEYgQWfeXLLEOAt3/mrkeJWk8lLr/XOgVxkr17d34EFHG93rE3zwG9hMuAjZAdvT2IfWvCIL32GAakB2fz+ww+D3nySY9bBcGH7R+wE6eaxF4nFSZizKZAoGBAJzuaWCnVK0djfgvUsjmGUtyDvgyREcpAsXvES1pB2NLVeEUxm0uRtj6k4DhCv3rJfUwfMr0+sa9NUnXuaSRVqLYvAD8bNPKXwn7ymzQ7WioCqmZuUhLnQRppkjhfQGKLH0MnMw9Xh9FwJ9kzGNEUnTEhaaHsoaHMlLlRET32gyG-----END PRIVATE KEY----------BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmUhzXBX7YXf21WHsRCVjgVRI4w3F4369X2Hr7q2jRXzJizylfN+gW7wolElh8yWBKZCfd+Hv49vDQRHBGzwy4hpS03egFcEdtk5FMKS6+NaEKa89ByhcIVT2dB0AhiL9KVTAOd0xUorSKoqmzS5oJucs0jajctbf9F/0X6hLQOhKMcPbv0see4vqQRbi5WWGp5Zue/m+7dZIYPSR7xdLpaOw0nMieKoKw+6EH9ESEAdK6ghSHmLmDtXH758W/ceAz6HRMlaADOIvWHRaKfWR7e91v4nLi5Lvz/Pxtfmq8weW+0tUt5MufynUvABAPVsOXM2XHX/SYJtkukcpoxRo8wIDAQAB-----END PUBLIC KEY-----注意:待签名串只作为示例使用,与签名验签规范无关。待签名串:"POST\n/abc\n1680835692\ngjjRNfQlzoDIJtVDOfUe\n{"eventTime":1677653869000,"status":102}\n"签名串:"RFQ65hHlo4xyZ6EC31LZC0SzsyN0nd2Fb2wAiISvY1mkiC6G8gn2QZwLGq7qgjenRGl/Z8OrTtkBHWb9GOazkJFkHrPeRqogqnwZ+kSOxGvtou8FPN669E1wwb+BShN4pIUgPFzaukR9/rCRBsbLoq9RPVA2sbf3iKoHGa81zhXjQSuFbF1CyiWkL5qqniNTM/BSfwfLZfPW8nBanRl3U+mQaymbj0DCF0ZdWhFz1FnZPAfEpx8YEwFNZWtxzz4p3WJ1swnUocJC4LXoDazo6DhEPDuoZXOXrB1SqzL1wRqA4p8uj3Z8Seki/PMGWiGpGWPMv3tJyvWmzMOuVJtEjg=="
注意事项
1.密钥长度必须为
2048
位
2.不同的签名验签代码,对密钥格式有不同的要求,比如JAVA一般使用
PKCS8
格式的密钥,其他语言一般使用
PKCS1
格式的密钥(区分小技巧:开头为"-----BEGIN PRIVATE KEY-----"的密钥格式为PKCS8,开头为"-----BEGIN RSA PRIVATE KEY-----"的密钥格式为PKCS1)
3.每次提交新的应用公钥,公钥版本会发生变化
4.请注意使用原生的request body中的内容进行验签,避免因框架解析导致字段顺序变化。
5.如果使用的低版本的JDK(JDK7及以下),请不要使用sun.misc.BASE64包进行base64编解码,请使用org.apache.commons.codec.binary.Base64包或者javax.xml.bind.DatatypeConverter包
6.java中使用gjson做序列化的时候可能出现long类型参数被实际序列化成了string类型,而请求发送给平台的时候对应参数仍然是long类型从而导致平台验证签名无法通过,这种情况下请使用(new GsonBuilder()).setLongSerializationPolicy(LongSerializationPolicy.DEFAULT).create()创建gjson对象,同时通过调整LongSerializationPolicy的值来根据实际需求情况来对long类型的值进行序列化
FAQ
签名生成的使用场景
签名生成是指开发者在请求开放平台交易系统的 open api 时,需要携带签名等信息,开发者使用自己生成的
应 用私钥
给签名串生成签名,携带在 header 中。交易系统服务会使用开发者上传的应用公钥进行签名验证,验证通过后放行请求。
签名验证的使用场景
签名验证是开放平台交易系统使用平台私钥对签名串生成签名,开发者使用
平台公钥
进行签名验证。签名验证有两个场景
a.开发者请求开放平台交易系统open api时,开放平台会放http resp的header中返回签名信息
b.开放平台交易系统服务请求开发者的api时(回调场景、状态通知等),交易系统服务会在http request的header中携带签名信息
设置应用公钥时出错
如果报 Request params error 注意应用公钥应该是这样的格式,包含----BEGIN 一直到 END PUBLIC KEY----
验签不通过
如果签名验证不通过,请开发者先使用自己生成的公私钥测试加解密的过程,如果可以用私钥加密的数据,可以用公钥完成解密,再考虑以下几个因素
1.确认当前参与签名的小程序已经在平台设置了公钥,设置方法参考上面的密钥设置环节
2.确认上传的公钥与自己使用的公钥相同,以及和加签使用的私钥是匹配的
3.检查小程序平台上是否更新了公钥。如果更新了公钥,确认签名使用的公私钥与版本key_version一致。key_version在公私钥设置页面可以看到。
4.给body加解密的过程中,确保body数据严格一致,不能增加空格空行等。服务端以收到的http request body数据为准,开发者验证过程中也需要保证body和服务端收到的一致。
5.拼接 "\n"的时候使用双引号 不要用单引号。
6.确认生成签名的加签串和请求request中的数据一致。详细规则请看上面的加签环节。
7.java语言中有些框架会对原始包body进行解析并重新拼接再返回给最上层的业务使用,这个过程中可能对原始请求包的字段顺序进行了变更,建议在接收到请求的原始包处将原始包日志打印出来,并在验签处也将body打印出来进行对比。
8.java语言在读取网络包的时候如果使用了readLine函数则可能导致验签通不过,因为readLine默认会在每次读取的时候在行位append '\n'字符。
为什么有的接口验签可以通过,有的接口不能通过
开平的签名算法针对所有接口都是相同的逻辑,如果遇到这样的情况,有可能是中文字符串遇到转义问题。
验签时需要接收原始的 http request body 数据,并不要进行任何处理。保证原始的 body 数据,作为字符串参与验签。如果是 JAVA 语言,回调接口需要用字符串接收,不要用 Bean 接收,Bean 接收参数会乱序导致验签不过。
oncall 指引
为减少 oncall 沟通过程提高问题解决效率,请提 oncall 的时候务必提供以下内容:
签名问题:请提供参与签名的全部参数,提供签名计算代码。
验签问题:请提供接收到的平台请求包原始内容,提供验签代码。
修改于
2023-12-04 02:21:12
上一页
简介
下一页
BusinessToken 生成