虽钉钉开发文档上写着不须要JSAPI签权,但这仅仅是针对Android手机前端
因此为了保险起见,在使用JSAPI前,都须要签权。后端
不然:dd.ready({}) 将不会执行。api
JSAPI签权步骤:服务器
1.获取accessTokenapp
请求方式:GET(HTTPS)
请求地址:https://oapi.dingtalk.com/gettoken?corpid=id&corpsecret=secret
参数说明:函数
参数post |
参数类型url |
必须spa |
说明代理 |
corpid |
String |
是 |
企业Id |
corpsecret |
String |
是 |
企业应用的凭证密钥 |
返回说明:(token有效期是:7200s)
{
"errcode": 0,
"errmsg": "ok",
"access_token": "fw8ef8we8f76e6f7s8df8s"
}
2.获取jsapi_ticket
请求说明
请求方式:GET(HTTPS)
请求地址:https://oapi.dingtalk.com/get_jsapi_ticket?access_token=ACCESS_TOKEN
参数说明:
参数 |
参数类型 |
必须 |
说明 |
access_token |
String |
是 |
调用接口凭证 |
type |
String |
否 |
目前只支持jsapi |
正确时返回示例以下:
{
"errcode": 0,
"errmsg": "ok",
"ticket": "dsf8sdf87sd7f87sd8v8ds0vs09dvu09sd8vy87dsv87",
"expires_in": 7200
}
参数 |
说明 |
errcode |
错误码 |
errmsg |
错误信息 |
ticket |
用于JS API的临时票据 |
expires_in |
票据过时时间 |
出错时返回示例以下:
{
"errcode": 45009,
"errmsg": "接口调用超过限制"
}
3.获取签名参数
在前端进行免登鉴权以前,咱们要先拿到一些免登鉴权的参数,主要有有url, nonceStr, agentId, timeStamp, corpId 。
参数 |
说明 |
企业 |
ISV |
url |
当前网页的URL,不包含#及其后面部分 |
|
|
nonceStr |
随机串,本身定义 |
|
|
agentId |
应用的标识 |
编辑企业应用能够看到 |
在ISV调用get_auth_info接口里面能够获取 |
timeStamp |
时间戳 |
当前时间,可是前端和服务端进行校验时候的值要一致 |
当前时间,可是前端和服务端进行校验时候的值要一致 |
corpId |
企业ID |
企业ID,在开发者后台中企业视图下开发者帐号设置里面能够看到 |
经过在页面地址上追加?corpId=CORPID进行获取 |
注:url参数须要注意,若是url中?号后有中文参数,则参数须要进行URLDecoder.decode(“name=中&age=18”);处理
4.生成签名
在服务端经过sign(ticket, nonceStr, timeStamp, url)计算前端校验须要使用的签名信息。
代码展现:
public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException {
String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp)
+ "&url=" + url;
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.reset();
sha1.update(plain.getBytes("UTF-8"));
return bytesToHex(sha1.digest());
} catch (NoSuchAlgorithmException e) {
throw new OApiResultException(e.getMessage());
} catch (UnsupportedEncodingException e) {
throw new OApiResultException(e.getMessage());
}
}
//将bytes类型的数据转化为16进制类型
private static String bytesToHex(byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
将:url,nonceStr,agentId,timeStamp,corpId,signature传递到前端页面,在前端HTML5页面使用jsapi提供的dd.config接口进行签名校验。
封装成JSON 字符串:
"{\"jsticket\":\"" + ticket + "\",\"signature\":\"" + signature + "\",\"nonceStr\":\"" + nonceStr + "\",\"timeStamp\":\""
+ timeStamp + "\",\"corpId\":\"" + Env.CORP_ID + "\",\"agentid\":\"" + Config.agentId + "\"}"
5.引入JS
<script src="http://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>
注:若是页面地址是HTTPS协议,这个js的src也必须使用HTTPS,即:
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>
6.JSAPI鉴权
示例代码:
dd.config({
agentId: '', // 必填,微应用ID
corpId: '',//必填,企业ID
timeStamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '', // 必填,签名
type:0/1, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
jsApiList : [
'runtime.info',
'biz.contact.choose',
'device.notification.confirm',
'device.notification.alert',
'device.notification.prompt',
'biz.ding.post',
'biz.util.openLink',
] // 必填,须要使用的jsapi列表,注意:不要带dd。
});
参数 |
参数类型 |
必须 |
说明 |
agentId |
String |
是 |
微应用ID,普通企业能够经过OA后台的微应用-设置查看agentId,点击查看。ISV须要经过调用受权成功后的get_auth_info获取受权方的agentId |
corpId |
String |
是 |
企业ID |
timeStamp |
String |
是 |
生成签名的时间戳 |
nonceStr |
String |
是 |
生成签名的随机串 |
signature |
String |
是 |
JS-API签名,能够参考简易教程中的获取签名的示例代码 |
type |
number |
否 |
若是是要调用服务窗的jsapi,请填1 |
jsApiList |
Array |
是 |
须要调用的jsapi列表 |
URL不一致致使免登报错52013,签名校验失败?
经过error接口处理失败验证
dd.config验证失败会执行error函数,错误信息能够在返回的error参数中参看,下面为error信息示例:
dd.error(function(error){
/**
{
errorMessage:"错误信息",// errorMessage 信息会展现出钉钉服务端生成签名使用的参数,请和您生成签名的参数做对比,找出错误的参数
errorCode: "错误码"
}
**/
alert('dd error: ' + JSON.stringify(err));
});