Step 1. 构造源串 源串是由3部分内容用“&”拼接起来的: HTTP请求方式 & urlencode(uri) & urlencode(a=x&b=y&…) 源串构造步骤如下: 第1步: 将请求的URI路径进行URL编码(URI不含host,URI示例:/deal/sellerSearchDealList.xhtml)。
请开发者关注: URL编码注意事项 ,否则容易导致后面签名不能通过验证。 第2步: 将除“sign”外的所有参数 按key进行字典升序排列。 注:除非OpenAPI文档中特别标注了某参数不参与签名,否则除sign外的所有参数都要参与签名。 第3步: 将第2步中排序后的参数(key=value)用&拼接起来,并进行URL编码。
请开发者关注: URL编码注意事项 ,否则容易导致后面签名不能通过验证。 第4步: 将HTTP请求方式(GET或者POST)以及第1步和第3步中的字符串用&拼接起来。 源串构造示例如下
(由于是通用说明,这里以/deal/sellerSearchDealList.xhtml 作为示例,且示例中的请求串不可直接复制访问) appOAuthID : 700042973
appOAuthKey : hdUMwmU4P5jQtHpC HTTP请求方式:GET 请求的URI路径(不含HOST):/deal/sellerSearchDealList.xhtml 请求参数: appOAuthID=700042973&timeStamp=1344568374452&accessToken=ad39b7dbd59b87cda827223c0e520d6f&charset=gbk&format=xml&randomValue=58095&uin=1280863473&sellerUin=1280863473 第1步:将请求的URI路径进行URL编码,得到: %2Fdeal%2FsellerSearchDealList.xhtml 第2步:将除“sign”外的所有参数按key进行字典升序排列,
排列结果为: accessToken, appOAuthID, charset, format, randomValue, sellerUin, timeStamp, uin 第3步:将第2步中排序后的参数(key=value)用&拼接起来: accessToken=ad39b7dbd59b87cda827223c0e520d6f&appOAuthID=700042973&charset=gbk&format=xml&randomValue=58095&sellerUin=1280863473&timeStamp=1344568374452&uin=1280863473 然后进行URL编码( 编码时请关注 URL编码注意事项 ,否则容易导致后面签名不能通过验证 ),编码结果为: accessToken%3Dad39b7dbd59b87cda827223c0e520d6f%26appOAuthID%3D700042973%26charset%3Dgbk%26format%3Dxml%26randomValue%3D58095%26sellerUin%3D1280863473%26timeStamp%3D1344568374452%26uin%3D1280863473 第4步:将HTTP请求方式(GER or POST),第1步以及第3步中的到的字符串用&拼接起来,
得到源串: GET&%2Fdeal%2FsellerSearchDealList.xhtml&accessToken%3Dad39b7dbd59b87cda827223c0e520d6f%26appOAuthID%3D700042973%26charset%3Dgbk%26format%3Dxml%26randomValue%3D58095%26sellerUin%3D1280863473%26timeStamp%3D1344568374452%26uin%3D1280863473 Step 2. 构造密钥得到密钥的方式:在应用的secretOAuthKey末尾加上一个字节的“&”,即secretOAuthKey&,例如:
hdUMwmU4P5jQtHpC& step 3. 生成签名值使用HMAC-SHA1加密算法,将Step1中的到的源串以及Step2中得到的密钥进行加密。
(注:一般程序语言中会内置HMAC-SHA1加密算法的函数,例如PHP5.1.2之后的版本可直接调用hash_hmac函数。) 然后将加密后的字符串经过Base64编码。
(注:一般程序语言中会内置Base64编码函数,例如PHP中可直接调用 base64_encode() 函数。) 得到的签名值结果如下:
p05e2i/8aU7R9mzJryYdubQXyuE=
完整的例子:
请求的所有参数:
accessToken=ad39b7dbd59b87cda827223c0e520d6f&appOAuthID=700042973&charset=gbk&format=xml&randomValue=58095&sellerUin=1280863473&timeStamp=1344568374452&uin=1280863473 用于计算sign的源串:
GET&%2Fdeal%2FsellerSearchDealList.xhtml&accessToken%3Dad39b7dbd59b87cda827223c0e520d6f%26appOAuthID%3D700042973%26charset%3Dgbk%26format%3Dxml%26randomValue%3D58095%26sellerUin%3D1280863473%26timeStamp%3D1344568374452%26uin%3D1280863473 计算后的sign值: p05e2i/8aU7R9mzJryYdubQXyuE=
----------------------------------------------------------------------------------------------------------------------------------------------
Step 1和Step 2都会,就是Step 3中使用HMAC-SHA1加密算法,将Step1中的到的源串以及Step2中得到的密钥进行加密,不明白,是Step1中的到的源串以及Step2中得到的密钥分别用HMAC-SHA1加密,还是Step 2&Step 1(如hdUMwmU4P5jQtHpC&GET&%2Fdeal%2FsellerSearchDealList.xhtml&accessToken%3Dad39b7dbd59b87cda827223c0e520d6f%26appOAuthID%3D700042973%26charset%3Dgbk%26format%3Dxml%26randomValue%3D58095%26sellerUin%3D1280863473%26timeStamp%3D1344568374452%26uin%3D1280863473 )这样以后再加密,我试了后,得出的sign值不一样,麻烦高手告一下。 Step 3中 提到 用于计算sign的源串:
GET&%2Fdeal%2FsellerSearchDealList.xhtml&accessToken%3Dad39b7dbd59b87cda827223c0e520d6f%26appOAuthID%3D700042973%26charset%3Dgbk%26format%3Dxml%26randomValue%3D58095%26sellerUin%3D1280863473%26timeStamp%3D1344568374452%26uin%3D1280863473 根本和Step 2中得到的密钥没关系,可是出说将Step1中的到的源串以及Step2中得到的密钥进行加密,实在是不明白,不管怎么算,我算出的sign值和它算出的sign值: p05e2i/8aU7R9mzJryYdubQXyuE=不一样,请高手告一下,谢谢了 |