接口签名及防重放详细开发文档
公共参数
nonce | 是 | 唯一值,用来标识接口请求的唯一性,例如使用UUID值,示例:40A6A065-4DB7-4999-8F7F-F6D051D9B02C |
timestamp | 是 | 时间戳,从1970年1月1日据当前时间的毫秒数 示例:1529373808 |
vId | 是 | 版本号 |
logicVID | 是 | 逻辑版本号 (应该是没用的) |
vest | 是 | 马甲信息 ticai |
uuid | 是 | 设备唯一标识 |
agentId | 是 | 代销者编号 |
channel | 是 | 渠道号 |
interfaceVersion | 是 | 接口版本 |
ckStr | 是 | 登录token |
deviceVersion | 是 | 系统版本 |
appVersion | 是 | 版本序列号 |
user-agent-key | 是 | 客户端标识 |
lskey | 是 | 登录token |
uid | 是 | 资金账户编号 |
accountNo | 是 | 资金账户编号 |
iswx | 是 | 是否是微信登录(应该是没用的) |
province | 是 | 省编号 |
appType | 是 | app类型 (应该是没用的) |
sdkVer | 是 | sdk版本号 |
deviceVer | 是 | 设备型号 |
manufacturer | 是 | 厂商 |
brand | 是 | 型号 |
token | 是 | 信鸽token |
cmsWhere | 是 | 渠道号 |
platform | 是 | 平台 |
screenRes | 是 | 屏幕尺寸信息 |
签名规则
签名内容由股票量化交易软件,header和body两部分组成+(接口请求中将Cookie参数全部去掉)+股票量化交易软件,header中的数据处理将header中的所有key(对应公共参数中的所有key)按照字母顺序排序,然后将所有的key和value拼接成为key1value1key2value2的格式,示例代码如下:
header中的原始数据
{
'accountNo': '112003abdc',
'agentId': '112003abdc',
'appType': '112003abdc',
'appVersion': '112003abdc',
'brand': '112003abdc',
'browserBrand': '112003abdc',
'channel': '112003abdc',
'ckStr': '112003abdc',
'cmsWhere': '112003abdc',
'cms_where': '112003abdc',
'deviceVer': '112003abdc',
'deviceVersion': '112003abdc',
'interfaceVersion': '112003abdc',
'iswx': '112003abdc',
'logicVID': '112003abdc',
'lskey': '112003abdc',
'manufacturer': '112003abdc',
'nonce': '112003abdc',
'platform': '112003abdc',
'province': '112003abdc',
'screenRes': '112003abdc',
'sdkVer': '112003abdc',
'timestamp': '112003abdc',
'token': '112003abdc',
'uid': '112003abdc',
'user-agent-key': '112003abdc',
'uuid': '112003abdc',
'vId': '112003abdc',
'vest': '112003abdc'
}
排序后得到的字符串
appTypezc_iosappVersion1610000brandiPhonechannelios_appstoreckStrcmsWhere800000deviceVerMacBookPro11,4lskeymanufacturerappleplatform2province11screenRes320.0-548.0sdkVer11.4token1user-agent-key4ed92dce-9c09-5554-8b3c-d4dfe43109a5uuid2F46685B-FD40-4A47-B621-E61A58B98650vId1610000vestticai
所有参数签名参数分为了get参数和post参数,需要分别对get参数和post参数做处理
get参数处理将所有的get参数如同上面header的处理,生成排序后的字符串,示例代码如下
get参数排序后的明文
cappConfigcmsWhere800000dappdataVer1610000_9177489552_1529596800deviceVerMacBookPro11,4mgetIndexConfigprovinceuseCookie1vId1610000vestticai
post参数处理将所有的post参数如同上面的header处理,生成排序后的字符串,示例代码如下
post所有参数
{
'api_version' = 2;
appkey = 610163;
'channel_id' = 10001;
deviceid = 'ABB50644-59BC-41AC-ABD4-DF3639891AF8';
imei = '';
imsi = '';
nonce = '40A6A065-4DB7-4999-8F7F-F6D051D9B02C';
'product_code' = 1006;
timestamp = 1529373808;
ua = 'Apple Computer, Inc.^x86_64^iOS^11.4^(null)';
'version_code' = 1;
}
post参数排序后的明文
api_version2appkey610163channel_id10001deviceidABB50644-59BC-41AC-ABD4-DF3639891AF8imeiimsimethodih.boss.info.getPayChannelsnonce40A6
将已有被签名字符串进行拼接签名明文=header明文+get明文+post明文+decode+秘钥示例代码如下
签名明文
秘钥:89bd32f2443f323f0cce581d9491e5c9e8
签名明文: appTypezc_iosappVersion1610000brandiPhonechannelios_appstoreckStrcmsWhere800000deviceVerMacBookPro11,4lskeymanufacturerappleplatform2province11screenRes320.0-548.0sdkVer11.4token1user-agent-key4ed92dce-9c09-5554-8b3c-d4dfe43109a5uuid2F46685B-FD40-4A47-B621-E61A58B98650vId1610000vestticaicappConfigcmsWhere800000dappdataVer1610000_9177489552_1529596800deviceVerMacBookPro11,4mgetIndexConfigprovinceuseCookie1vId1610000vestticaiapi_version2appkey610163channel_id10001deviceidABB50644-59BC-41AC-ABD4-DF3639891AF8imeiimsimethodih.boss.info.getPayChannelsnonce40A6124bd34f203f23f0cce581d9491e5c9e8
对签名明文做MD5并将MD5值转换为小写得到签名后的密文
将签名值加入到header中
服务器校验服务器接收到客户端请求后,做如上同样的操作,生成签名,并且与客户端的签名进行比对,比对失败则直接返回错误
异常提示
请求无效
防重放
客户端生成唯一字符串作为nonce值(可以使用UUID,保证唯一就好),示例代码如下:
将nonce作为参数加入到header中
服务器端接收到数据服务器端接收到数据后,要对nonce进行校验,校验该nonce值是否存在,如果存在则直接拒绝此次请求,如果不存在将该nonce值存到缓存中
timestamp(时间戳)
生成时间戳客户端生成当前时间戳
生成规则:
取当前时间去1970年1月1日0点的时间差,单位是毫秒
timestamp=1529373808
将生成的时间戳加入到header中
服务器端接收到数据服务器端接收到数据后,拿获取到的时间戳和服务器的时间进行差值,如果超过30秒则认为请求无效,服务器直接拒绝
异常提示
请求无效
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点