一、访问入口

http://wiki.open.qq.com/wiki/%E8%85%BE%E8%AE%AF%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%94%E7%94%A8%E7%AD%BE%E5%90%8D%E5%8F%82%E6%95%B0sig%E7%9A%84%E8%AF%B4%E6%98%8E

Step 1. 构造源串

源串是由3部分内容用“&”拼接起来的: HTTP请求方式 & urlencode(uri) & urlencode(a=x&b=y&...)

源串构造步骤如下:

第1步:将请求的URI路径进行URL编码(URI不含host,URI示例:/v3/user/get_info)。
请开发者关注:URL编码注意事项,否则容易导致后面签名不能通过验证。

第2步:将除“sig”外的所有参数按key进行字典升序排列。 
注:除非OpenAPI文档中特别标注了某参数不参与签名,否则除sig外的所有参数都要参与签名。

第3步:将第2步中排序后的参数(key=value)用&拼接起来,并进行URL编码。
请开发者关注:URL编码注意事项,否则容易导致后面签名不能通过验证。

第4步:将HTTP请求方式(GET或者POST)以及第1步和第3步中的字符串用&拼接起来。
注:Java_SDK_V3.0.6仅支持POST方式,如果用GET可能导致一直计算sig不正确。

源串构造示例如下
(由于是通用说明,这里以/v3/user/get_info作为示例,且示例中的请求串不可直接复制访问)

1. 原始请求信息:appkey:228bf094169a40a3bd188ba37ebe8723

HTTP请求方式:GET

请求的URI路径(不含HOST):/v3/user/get_info

请求参数:openid=11111111111111111&openkey=2222222222222222&appid=123456&pf=qzone&format=json&userip=112.90.139.30

2. 下面开始构造源串:

第1步:将请求的URI路径进行URL编码,得到: %2Fv3%2Fuser%2Fget_info 

第2步:将除“sig”外的所有参数按key进行字典升序排列,排列结果为:appid,format,openid,openkey,pf,userip

第3步:将第2步中排序后的参数(key=value)用&拼接起来:
appid=123456&format=json&openid=11111111111111111&openkey=2222222222222222&pf=qzone&userip=112.90.139.30 
然后进行URL编码( 编码时请关注URL编码注意事项,否则容易导致后面签名不能通过验证),编码结果为:
appid%3D123456%26format%3Djson%26openid%3D11111111111111111%26openkey%3D2222222222222222%26pf%3Dqzone%26
userip%3D112.90.139.30

第4步:将HTTP请求方式,第1步以及第3步中的到的字符串用&拼接起来,得到源串:

GET&%2Fv3%2Fuser%2Fget_info&appid%3D123456%26format%3Djson%26openid%3D11111111111111111%26
openkey%3D2222222222222222%26pf%3Dqzone%26userip%3D112.90.139.30

Step 2. 构造密钥

得到密钥的方式:在应用的appkey末尾加上一个字节的“&”,即appkey&,例如:

228bf094169a40a3bd188ba37ebe8723&

Step 3. 生成签名值

1. 使用HMAC-SHA1签名算法,使用Step2中得到的密钥对Step1中得到的源串签名。 
(注:一般程序语言中会内置HMAC-SHA1加密算法的函数,例如PHP5.1.2之后的版本可直接调用hash_hmac函数。)

2. 然后将加密后的字符串经过Base64编码。 
(注:一般程序语言中会内置Base64编码函数,例如PHP中可直接调用 base64_encode() 函数。)

3. 得到的签名值结果如下:

FdJkiDYwMj5Aj1UG2RUPc83iokk=

常见错误排障

为什么总是返回“-5:signature verification failed”?

签名校验失败分为以下两种情况:
1. sig参数生成错误
有可能由下列原因引起:
(1)构造源串时注意URI不含host,如/v3/user/get_info,而不是http://113.108.20.23/v3/user/get_info;
(2)构造源串时,没有将key排序后,再将(key=value)用&拼接起来。
(3)构造密钥时,没有将appkey后加“&”。
(4)某些语言的URLEncode系统方法在进行URL编码时,并没有按照现行的URL编码规则进行。详见下文的:URL编码注意事项。

对于支付和营销类接口,除了以上问题外,还有一些特别容易出错的地方:
(1)支付和营销相关回调协议中规定参数值都为string型,开发商出于本地记账等目的,对接收到的某些参数值先转为数值型再转为string型,导致字符串部分被截断(例如:字符串“13.14”转为整形再转为string 就会变成13),从而导致签名出错。
如果要进行本地记账等逻辑,建议用另外的变量来保存数值,传参时必须用原始接收到的string型值。 
(2)支付和营销相关回调协议中,在进行签名生成时多加了一个步骤: 
在构造源串的第3步“将排序后的参数(key=value)用&拼接起来,并进行URL编码”之前,需对value先进行一次编码 (编码规则为:除了 0~9 a~z A~Z !*() 之外其他字符按其ASCII码的十六进制加%进行表示,例如“-”编码为“%2D”)。
(3)支付和营销接口中的goodmeta参数,必须是UTF8格式,参与签名前要进行Base64编码。
(4)支付和营销接口中的payitem参数,含有*号字符,在进行URL编码时要注意观察是否进行了编码。

2. sig参数生成正确,但是参数传输前没有进行URL编码。
所有参数传输时都要进行URL编码,包括sig。如果没有进行URL编码,则即使sig是正确的,但是校验sig时不能匹配。

建议的解决方案:
(1)开发者可以使用平台提供的签名验证工具来计算签名:http://open.qq.com/tools , 通过工具吐出的签名生成过程,来排查具体是哪一步出了问题。
(2)如果您是PHP开发者,可以使用PHP SDK中的签名生成函数来生成签名,避免自己去进行复杂的签名生成逻辑的开发。

URL编码注意事项

URL编码规则:
签名验证时,要求对字符串中除了“-”、“_”、“.”之外的所有非字母数字字符都替换成百分号(%)后跟两位十六进制数。
十六进制数中字母必须为大写。

注意事项:
1. 某些系统方法,例如.NET系统方法HttpUtility.UrlEncode会将‘=’编码成‘%3d’,而不是%3D,导致加密签名通不过验证,请开发者注意检查。

2.Java 1.3和早期版本中,调用java.net.URLEncoder下的方法进行URL编码时,某些特殊字符并不会被编码,例如星号(*)。
由于URL编码规则中规定了星号(*)必须编码,因此在请求字符串中含星号(*)的情况下如果使用了上述方法,会导致生成的签名不能通过验证。
例如调用v3/pay/buy_goods接口时, payitem参数值中一定会含有* ,在使用类java.net.URLEncoder下的方法进行编码后,需开发人员手动将星号字符“*”替换为“%2A”,否则将导致加密签名一直通不过验证,请开发者注意检查。

3. 某些语言的urlencode方法会把“空格”编码为“+”,实际上应该编码为“%2B”。这也将生成错误的签名,导致签名通不过验证。 
请开发者注意检查,手动将“+”替换为“%2B”。
在PHP中,推荐用rawurlencode方法进行URL编码。

二、鉴权方式分析

这里用的是签名算法!

开发者事先申请appId和appKey,访问时带上appId,使用appKey签名请求

服务端使用appId找到服务端的appKey,重新签名请求,进行比对。

算法:HMAC-SHA1签名算法

三、分解结论

转载于:https://www.cnblogs.com/lexiaofei/p/6856731.html

apigw鉴权分析(1-2)腾讯开放平台 - 鉴权分析相关推荐

  1. apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析

    一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...

  2. 腾讯开放平台接口鉴权(计算签名)工具类 java版

    腾讯开放平台 接口鉴权(签名)工具类 java版 用到了Hutool工具类 package top.seasmall.platform.core.config.nettyws.util;import ...

  3. 读书笔记 摘自:《人工智能:国家人工智能战略行动抓手》的笔记(作者: 腾讯研究院 中国信息通信研究院互联网法律研究中心 腾讯AI Lab 腾讯开放平台)

    序言一 第三次人工智能浪潮已经到来,这是更强大的计算能力.更先进的算法.大数据.物联网等诸多因素共同作用的结果. 决策让渡将越来越普遍. 正是由于人工智能在决策和行动的自主性上面正在脱离被动工具的范畴 ...

  4. cordova项目打包并更新腾讯开放平台安装包、加固重新签名步骤

    打包apk 1.在webstorm中打开cordova项目,执行 cordova build android 这样会生成debug版的apk. 2.打包完成后会提示输出目录 一般是: /项目根目录/p ...

  5. qqp2011java_腾讯开放平台中实现QQ登陆的功能

    昨天为自己的网站实现了QQ登陆的功能,虽然,没有进行绑定,但是在技术层面上来说,已经了解了一点腾讯开放平台的协议. 具体什么是OAUTH,请您GG一下吧... 关于腾讯的开放平台,最主要的就是参数一定 ...

  6. 【二维码】新浪开放平台和腾讯开放平台试水

    尝试在新浪开放平台和腾讯开放平台修改应用.初步尝试了下,发现新浪的流程和步骤十分清晰,可是到腾讯,就傻眼了. 光平台,就有下面三个,尼玛,这不是坑爹嘛!新旧平台,新旧流程,新旧接口,在加上有空间,微博 ...

  7. 腾讯开放平台创建应用的坑,安卓和iOS端如何共用同一个Appid?

    很多人遇到一种情况,就是自己的应用使用QQ登录的时候,在不同客户端,返回的openid竟然不一样,导致统一个用户在不同客户端创建了不同的账号. 这时候有两种解决方法: 第一种:需要发邮件给腾讯开放平台 ...

  8. 关于腾讯开放平台应用宝sig签名的问题

    这两天搞个腾讯开放平台搞的心力憔悴, 第一是官方文章写的很不清楚, 腾讯开放平台第三方应用签名参数sig的说明 Step 1. 构造源串 源串是由3部分内容用"&"拼接起来 ...

  9. 官僚、傲慢、冷漠的腾讯开放平台

    我们开发了一个APP:思事日程笔记,用于统一规划思想.知识.事情.2017年发布到了腾讯开放平台,一直正常显示.(目前在腾讯开放平台名称:思事自我管理) 去年12月19日接到通知,因缺少版权证明,应用 ...

最新文章

  1. 如何判断java对象是否为String数组
  2. Android 自带图标库 android.R.drawable
  3. 【存储知识学习】第二章存走进计算机IO世界--《大话存储》阅读笔记
  4. sql server 2008学习4 设计索引的建议
  5. C语言日志操作类实例
  6. 命令行参数怎么输入_太好用了!谷歌开源的命令行接口工具fire
  7. Unity 2D教程: 滚动,场景和音效
  8. Android用户界面设计:布局基础
  9. 记录一下安装eclipse中的windows-builder组件时的一些问题
  10. 【推荐系统】电影推荐系统(一)
  11. php ftps,使用PHP Curl的FTPS获得部分下载
  12. 手机裁剪圆角图片_Photoshop裁剪圆角图片方法
  13. ipad上编译运行代码_是否可以在iPad上编写和运行PHP代码?
  14. 怎么添加桌面计算机快捷键,怎么添加桌面快捷方式图标,教你怎么添加桌面快捷方式图标...
  15. 拜读经典——大话设计模式(一)——温习C#
  16. 关于ASP木马提升权限
  17. 枚举算法3——五猴分桃
  18. 随机梯度下降(Stochastic gradient descent)
  19. Mac 下彻底卸载Unity3d
  20. 来公司必须了解的编码开发规范

热门文章

  1. python对财务人员的帮助-帮公司财务妹子写了个“群发工资条”的Python脚本!
  2. python官网怎么下载安装-Python怎么下载安装
  3. python爬虫吧-python爬虫-爬取百度贴吧帖子加图片
  4. python读取整个txt文件-Python读写txt文本文件
  5. 学python看什么书好1002无标题-如何使用pandas读取txt文件中指定的列(有无标题)
  6. python流程控制-python简单流程控制
  7. python是c语言写的吗-Python与C语言有什么区别?
  8. python源代码不需要编译成什么-python程序不需要编译吗
  9. python和c哪个适合入门-关于python和c语言学哪个好
  10. 怎么用python创建文件-如何用Python创建生成xml文档文件的方法