JSSDK taobao js 研究 之 js sign的算法

第一步:正确部署JSSDK

注意:正确的部署做法是每个需要调用组件接口的html页面都埋点这段JS代码。

在每个html页面的head标签之间引入jssdk脚本,并将appkey参数作为URL进行配置(单个页面只需加载一次sdk脚本,配置一次系统参数)。

根据采用协议的不同,jssdk脚本分为两种,分别是:

1、http协议:

      2、https协议:
<script src="https://s.tbcdn.cn/apps/top/x/sdk.js?appkey=xxxxxxx">

第二步:生成签名参数

任何调用前都必须将sign和timestamp填入到当前页面的cookie中(必须服务端填入),因为每一次组件提交请求都会获取cookie中的这两个参数用来验证应用的身份。

详细校验规则算法介绍:
签名算法采用Hmac-md5,hmac(secret+"app_key"+app_key+"timestamp"+timestamp+secret, secret),其中原始字符串是secret+"app_key"+app_key+"timestamp"+timestamp+secret,加密串是secret,其中timestamp时间戳格式为13位数字类型,例如:1333275943000,位数不够可使用“0”补足这部分工作必须在服务端处理。
举个例子:
PHP环境(5.1以上版本)的签名实现方式:

$app_key = '';/*填写appkey */
$secret='';/*填入Appsecret'*/
$timestamp=time()."000";
$message = $secret.'app_key'.$app_key.'timestamp'.$timestamp.$secret;
$mysign=strtoupper(hash_hmac("md5",$message,$secret));
setcookie("timestamp",$timestamp);
setcookie("sign",$mysign);
?>

第三步:使用淘宝组件、组件API

1.通过JSSDK的内置方法(TOP.ui)方法创建淘宝组件

以登录组件为例:

具体配置可以参考下文档:http://xtao.aliapp.com/ui/login-btn/1.0/demo/demo.html

2.通过JSSDK内置方法TOP.api来调用组件API。

包含参数:

  • type ] {String} 调用api的类型,可选'rest'和'tql'
  • method ] {String} 发送请求的方式,可选'get'和'post'
  • params {Object|String} 指定接口名和需要的应用级参数,或TQL查询语句。
  • cb {Function} 回调函数。以返回的json对象为唯一参数。

 

以'taobao.taobaoke.widget.items.convert'接口为例
(方法说明文档: http://api.taobao.com/apidoc/api.htm?spm=0.0.0.37.751a97&path=cid:38-apiId:21417):
 TOP.api('rest', 'get',{
   method:'taobao.taobaoke.widget.items.convert',
    track_iids:'19237740785_track_11116',
   fields:'num_iid,click_url,commission_rate'
 },function(resp){
   if(resp.error_response){
     alert('taobao.taobaoke.widget.items.convert接口获取商品信息品失败!'+resp.error_response.msg);
      return false;
     }
     var respItem=resp.taobaoke_items.taobaoke_item;
     for(var i=0;i
      //$("#r"+respItem[i].num_iid).html("佣金:"+Number(respItem[i].commission_rate)/100+"%");
      //$("#a"+respItem[i].num_iid).attr("href",respItem[i].click_url);
      }
 })

 

调用一定有返回。 如果调用有错误,则返回的json形如 (详细异常信息请查看文档:http://open.taobao.com/doc/category_list.htm?id=75):
{"error_response":{
   "code":41,//错误码 "msg":"Invalid arguments:num_iid"
} }
 
在某些情况下,使用TOP.api  方法调用api时,即使已经正确设置签名和时间戳并写入浏览器cookie,但依然会出现:26 - Missing session、30 - Missing timestamp错误,可以通过显示设置session和timestamp参数来解决,方法如下:
TOP.api('rest','get',{
       method:'taobao.user.buyer.get',
       session:'usersession',
       timestamp:'1131333445560',
       fields:'nick,user_id,avatar,alipay_account,buyer_credit,seller_credit,location,last_visit,birthday,sex'
},function(resp){
        if(resp.user){
                  alert('success!');
         }else{
                  alert('failure!');
} });

 

 

截止这一步,组件API的请求基本完成,第四步数据验证请根据自身的情况进行实现。

第四步:验证数据可靠性

由于通过JS调用服务端,数据是异步callback到ISV的JS,由于JS本身的不可靠性,可能存在数据本身被篡改的情况,请ISV根据自己的业务场景自行判断,是否需要验证数据可靠性。

如果需要验证数据可靠性。请求后端API的时候,请加上请求参数response_sign=true

TOP.api({
       method:'taobao.item.get',

       num_iid:'13736273292',
       response_sign:true,
       fields:'num_iid,title,nick'
},function(resp){

         alert( JSON.stringify(resp));

         alert(resp.content);

});

签名验证方式

和Widget本身的签名方式类似,返回结果里的sign的生成方式签名算法采用Hmac-md5,验签名表达式为:

resp.sign = hmac(secret+"app_key"+resp.appkey+"timestamp"+resp.timestap+"content"+resp.content+secret, secret)

注意:所有的签名验证和签名都必须在服务端完成,所有通过JS完成,在页面里直接暴露secret的,appkey立马收回


 

你可能感兴趣的:(php)