• 4939阅读
  • 15回复

【API|技术分享】AE开放平台签名signature指导

发帖
214
铜币
576
威望
91
贡献值
0
昵称
API技术支持TOP
— 本帖被 API技术支持TOP 执行加亮操作(2016-03-29) —

AE开放平台签名指导


一、    为什么要有签名

签名是一种防止http请求被篡改的方式,如果有黑客截取了您的http请求,一旦他修改了请求的url或者参数,就必须重新计算签名,如果没有计算这个请求就会失败。所以为了安全起见,速卖通开放平台决定:所有开放平台相关的请求都要带上签名。

二、    如何计算签名

签名是将url和参数用app的密钥进行加密得到的一串字符,目前速卖通开放平台上面有两种场景会用到签名,两者的签名算法都是一样的,不过签名因子略有区别。
1、    参数签名算法(仅仅在授权页面使用)

在调用api之前都需要授权的操作,速卖通开放平台目前支持客户端和web授权两种方式,这两种方式都要访问一个授权的登录页面,这个页面的url中就必须带上签名,这个签名用的就是参数签名算法。参数签名的两个要素是参数以及密钥。授权的实际url如下:
http://authhz.alibaba.com/auth/authorize.htm?client_id=YOUR_CLIENT_ID&site=aliexpress&redirect_uri=YOUR_REDIRECT_URL&state=YOUR_PARM&_aop_signature=SIGENATURE
_aop_signature这个签名是根据其他参数和密钥算出来的,php示例如下
<?php
    $appKey = '1222';
$appSecret ='232323';
$state=’xx’;
    $redirectUrl = 'http://hanshisky.taobao.com';
        
//生成签名,参数中state可不填
    $code_arr = array(
        'client_id' => $appKey,
        'redirect_uri' => $redirectUrl,
        'site' => 'aliexpress',
    'state' => $state
);
$aliParams = array();
foreach ($code_arr as $key => $val) {
   $aliParams[] = $key . $val;
}
sort($aliParams);
$sign_str = join('', $aliParams);
    $code_sign = strtoupper(bin2hex(hash_hmac("sha1", $sign_str, $appSecret, true)));
          
    $get_code_url = "http://gw.api.alibaba.com/auth/authorize.htm?client_id={$appKey}&site=aliexpress&redirect_uri={$redirectUrl}&_aop_signature={$code_sign}";
    echo 'get_code_url地址:      '.$get_code_url.'<br /> <br />';
?>

关于这种签名算法的详细介绍请参考如下文档:
http://gw.api.alibaba.com/dev/doc/intl/sys_signature.htm?ns=aliexpress.open#appRule
关于这种算法的测试工具以及代码示例请参考:
http://gw.api.alibaba.com/dev/tools/app_signature.html
2、    Api签名算法
授权之后就需要调用各种api,这时候就要用到api签名算法。这种算法与参数签名算法有一点不同,那就是url也要参与计算签名。签名的三个要素是urlpath、参数以及密钥。
假设请求url如下:
http://gw.api.alibaba.com/openapi/param2/1/aliexpress.open/api.findProductInfoListQuery/1000000
请求参数是productStatusType= onSelling,pageSize=10,currentPage=1,
1000000这个appkey对应的密钥是232323,
那么urlpath就是param2/1/aliexpress.open/api.findProductInfoListQuery/1000000,计算签名的php示例代码如下
<?php
    $url = 'http://gw.api.alibaba.com/openapi';/
    $appKey = '1000000';;
    $appSecret ='232323';
//配置urlpath
    $apiInfo = ' param2/1/aliexpress.open/api.findProductInfoListQuery/' . $appKey;
        
    //配置参数
$code_arr = array(
        'productStatusType' => 'onSelling',
        'pageSize' => '10',
        'currentPage' => '1'
);
$aliParams = array();
foreach ($code_arr as $key => $val) {
    $aliParams[] = $key . $val;
}
sort($aliParams);
$sign_str = join('', $aliParams);
    $sign_str = $apiInfo . $sign_str;
    $code_sign = strtoupper(bin2hex(hash_hmac("sha1", $sign_str, $appSecret, true)));
?>

由于签名跟urlpath、参数以及密钥有关,所以可以封装为一个函数,如
sign (string urlPath, Dictionary<string, string> paramDic, string SecretKey)
注意:用于计算签名的参数都必须是原始参数,签名计算后,如果是get请求,要遵守http协议对get请求的参数进行encode;如果是post请求,不需要对参数encode,但是要对post请求的contentType进行指定,指定为”application/x-www-form-urlencoded; charset=UTF-8”

关于这种签名算法的详细介绍请参考如下文档:
http://gw.api.alibaba.com/dev/doc/intl/sys_signature.htm?ns=aliexpress.open#apiRule
关于这种算法的测试工具以及代码示例请参考:
http://gw.api.alibaba.com/dev/tools/request_signature.html

三、    遇到签名错误如何排查问题

签名错误主要有如下两种。
1、400错误
{"error_code":400,"error_message":"com.alibaba.openapi.gateway.exceptions.RequestValidateException:Invalid signature.","exception":"com.alibaba.openapi.gateway.exceptions.RequestValidateException: Invalid signature."}
2、401错误
{"error_code":"401","error_message":"Request need signature","exception":"Request need signature"}
如果出现Invalid signature错误,也就是自己的签名计算错误的情况,通常有以下方式排查。
1、    将出现问题的url截取出来,如果是post请求需要同时截取url和请求参数;
2、    对url进行urldecode,得到原始的请求参数;如果是post请求不需要这一步;
3、    访问签名测试工具http://gw.api.alibaba.com/dev/tools/request_signature.html,根据前面两步获取到的url和参数,以及自己的密钥,填入到测试工具中,计算签名;
4、    对比工具中计算的签名因子以及签名跟你的是否一致,如不一致自行排查问题;
5、    测试工具中会得到最终完整的url,你可以在新窗口打开,这个url计算的签名肯定是正确的。



[ 此帖被API技术支持TOP在2015-07-21 14:10重新编辑 ]
本帖最近评分记录: 3 条评分 铜币 0 隐藏
爆款Q群#498633725 铜币 +1 2015-11-29 【速卖通0到100单秘籍】爆款打造方法,加QQ群:498633725领取,仅限前88名!
fan 铜币 +1 2015-09-05 出售速卖通【刷单技术】,一次付费终生享用,永久免费升级..Q:467553505
cn1510202818 铜币 -2 2015-07-17 你妹啊, 改动之前能不能先通知啊! 害老子昨晚紧急功关啊!
分享到:
级别: 禁止发言
发帖
62
铜币
722
威望
481
贡献值
0
昵称
只看该作者 沙发  发表于: 2015-07-17
用户被禁言,该主题自动屏蔽!
级别: 骑士
发帖
1
铜币
6
威望
1
贡献值
0
昵称
只看该作者 板凳  发表于: 2015-07-17
赞  比亚
级别: 天使
发帖
626
铜币
3533
威望
616
贡献值
0
昵称
牵梦飞扬
只看该作者 地板  发表于: 2015-07-17
纯技术派
微信公众号【第一电商资讯】:关注电商最新资讯,推荐业界精彩内容,电商人自己的资讯平台。
级别: 骑士
发帖
2
铜币
2
威望
2
贡献值
0
昵称
只看该作者 4楼 发表于: 2015-07-17
你妹, 改之前能不能先通知一下啊!
害得老子昨晚紧急功关啊, 没有文档,自己在哪里猜啊!

级别: 骑士
发帖
2
铜币
2
威望
2
贡献值
0
昵称
只看该作者 5楼 发表于: 2015-07-17
你妹的, POST 的参数也要参与计算签名好吧! 说明你都不写清楚!
发帖
214
铜币
576
威望
91
贡献值
0
昵称
API技术支持TOP
只看该作者 6楼 发表于: 2015-07-20
引用
引用第4楼cn1510202818于2015-07-17 19:53发表的  :
你妹, 改之前能不能先通知一下啊!
害得老子昨晚紧急功关啊, 没有文档,自己在哪里猜啊!




论坛早前已公布签名修改通知 http://bbs.seller.aliexpress.com/bbs/read.php?tid=251255

开发者群也有相关通知,请了解并关注  谢谢合作。
级别: 圣骑士
发帖
8
铜币
10
威望
7
贡献值
0
昵称
只看该作者 7楼 发表于: 2015-07-22
如果是上传图片呢,图片是用图片流POST过去的,那么在计算签名的时候参数那个是有【access_token】【fileName】那那个post过去的文件流的参数是什么。上传图片的时候老是报签名错误
级别: 圣骑士
发帖
8
铜币
10
威望
7
贡献值
0
昵称
只看该作者 8楼 发表于: 2015-07-22
回 7楼(cn1511819065) 的帖子
已经知道怎么传了
级别: 骑士
发帖
3
铜币
3
威望
3
贡献值
0
昵称
只看该作者 9楼 发表于: 2015-07-22
图片上传怎么进行签名?POST
级别: 风云使者
发帖
99
铜币
114
威望
102
贡献值
0
昵称
LUCK
只看该作者 10楼 发表于: 2015-07-23
回 6楼(API技术支持TOP) 的帖子
麻烦你仔细看看那次通知是什么好不好!
你以为我是傻子啊!
你们的错,还不承认!
2月13加签名 ,我早就加了!
要不然这几个月我是怎么用的?

这次改动:
1, POST 的参数也参与 签名计算了.
2, URL 中的一部分也参与签名计算了.

把你的脸贴上来,老实说这两个是2月13号的改动?
你骗谁啊!
级别: 风云使者
发帖
67
铜币
70
威望
65
贡献值
0
昵称
只看该作者 11楼 发表于: 2015-07-27
晕了,要改好多
级别: 骑士
发帖
4
铜币
4
威望
4
贡献值
0
昵称
只看该作者 12楼 发表于: 2015-07-29
请问开发者群怎么加,我在调用listLogisticsService 接口时400了,该接口文档里没有应用级参数,正常签名post返回的400错误,请问该如何解决
级别: 风云使者
发帖
67
铜币
70
威望
65
贡献值
0
昵称
只看该作者 13楼 发表于: 2015-07-31
产品发布的签名好麻烦啊。老不一致。
签名算法有什么特别的要求吗?
级别: 禁止发言
发帖
134
铜币
135
威望
130
贡献值
0
昵称
鼓鼓西里
只看该作者 14楼 发表于: 2015-08-07
用户被禁言,该主题自动屏蔽!
级别: 禁止发言
发帖
1010
铜币
1012
威望
1007
贡献值
0
昵称
爆款Q群#498633725
只看该作者 15楼 发表于: 2015-11-29
用户被禁言,该主题自动屏蔽!
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传