关于JSSDK
jssdk作为开发工具的一部分发布给ISV,开发者使用jssdk中包装的方法来开发插件。
注:线上jssdk.js对应文件为utf-8编码,如果插件页面为gbk编码的,需要引入js处加上charset="utf-8"。请用原生的onload来加载,用jquery的$load会出错。
部署JSSDK
开发者只要引用线上地址
移动端:https://g.alicdn.com/sj/tqn/m/sdk-mobile.min.js
PC端:https://g.alicdn.com/sj/qn/jssdk.js
PC端插件安全校验
目前千牛插件、旺旺插件、widget插件以及附属窗口都需要call_back_url访问触发插件的启动,现增加安全校验参数sign:
1.根据参数名称(除签名sign)将所有请求参数按照字母先后顺序排序:key + value .... key + value
例如:将foo=1,bar=2,baz=3 排序为bar=2,baz=3,foo=1,参数名和参数值链接后,得到拼装字符串bar2baz3foo1
2.将secret 拼接到参数字符串头、尾进行md5加密后,再转化成大写,格式是:byte2hex(md5(secretkey1value1key2value2...secret))
PC端授权完成,回调地址示例如下:
PC(授权信息:sessionkey字段。请求来源:from字段):
http://localhost:9016/?
appkey=21722245
&category=xiaogongju
&deviceuuid=77b350ae48272df6a457c487402d3136
&from=qianniupc
&instance=731_AAF3531E6E1345B487F836F5527E61F4
&nick=天猫商家
&sdkversion=106000
&sessionkey=622220639d5d93896bb7979b4698c89f37fdcf6dc04820e263664221
&sign=EDBCB4B8083C3EDD85D5426A05F19C29
&slot=qianniu
&user_id=211164000
&version=2.02.00N
示例:
根据上面回调地址和secret=8fee713ae62d62b27d27得到的加密字符串如下:
8fee713ae62d62b27d27appkey21722245categoryxiaogongjudeviceuuid77b350ae48272df6a457c487402d3136
fromqianniupcinstance731_AAF3531E6E1345B487F836F5527E61F4nick天猫商家sdkversion106000
sessionkey622220639d5d93896bb7979b4698c89f37fdcf6dc04820e263664221
slotqianniuuser_id211164000version2.02.00N8fee713ae62d62b27d27
产生的sign如下:
2B8888B4DB8E06875CF29E8377AA3FFB
注意事项:
1.所有的参数皆为utf-8格式
2.nick参数是中文或者子账号的情况下,中文请不要编码,中间的冒号也不好编码,保留原样
3.插件验证
获取到用户授权完成传入回调地址的参数和值,
根据加密规则生成sign,
与回调地址参数中sign的值做对比,若一致,则说明,传入参数合法,否则,未非法参数
java示例代码
TreeMap<String, String> tree=new TreeMap<String, String>();
Enumeration<String> enums = request.getParameterNames();
String param="";
while(enums.hasMoreElements()){
String ele = enums.nextElement();
tree.put(ele, request.getParameter(ele));
}
Set<String> key = tree.keySet();
Iterator<String> it = key.iterator();
while( it.hasNext() ){
String v=it.next();
//System.out.println(" "+v+" decode:"+java.net.URLDecoder.decode(request.getParameter(v),"utf-8"));
if(!"sign".equals(v)){
param+=v+java.net.URLDecoder.decode(request.getParameter(v),"utf-8");
}
}
param = SECRET+param+SECRET;
String sign2=Md5.sign(param).toUpperCase();
System.out.println("sign:"+sign);
System.out.println("sign2:"+sign2);
if(!sign2.equalsIgnoreCase(sign)){
System.out.println("非法访问,请退出并重新登陆");
}
千牛组件、API
通过JSSDK内置方法
接口分一级层次:
QN.plugin.invoke // 工具栏插件调用协议
QN.wwplugin.invoke // 旺旺插件调用协议
QN.application.invoke // 应用本身提供的属性与方法等
QN.wangwang.invoke // 旺旺相关的接口
QN.top.invoke // top相关的接口透传调用
QN.component.invoke // 组件调用
调用API,包含参数:
cmd
param
其中plugin层和wwplugin层多一个额外的类别参数category,如:
plugin与wwplugin的调用:
QN.plugin.invoke( {
category : '类别',//jianyiguanli
cmd : 'API名称',//
param : {/* defined obj */ },
error : function(msg, categroy, cmd, param) {
// 调用失败
},
success : function(rsp, categroy, cmd, param) {
// 回调结果
}
} );
application、wangwang以及top的调用,以获取千牛版本为例:
QN.application.invoke( {
cmd : ' getVersion',
param : {/* defined obj */ },
error : function(msg, cmd, param) {
// 调用失败
},
success : function(rsp, cmd, param) {
// 回调结果
}
} );
component的调用,以改价组件为例:
QN.component.invoke( {
category : 'updatePrice',
cmd : '',
param : {
uuid : '1234',
tid : '订单号'
},
error : function(msg, cmd, param) {
// 调用失败
},
success : function(rsp, cmd, param) {
// 回调结果
}
});
API返回结果
通过JSSDK调用千牛API返回的结果是Object ,具体属性可查看API列表。
如需将msg 和rsp对象的打印出,可以通过JSON.stringify(msg)和JSON.stringify(rsp)转化成JSON数据格式等方式输出。