钉钉企业内微应用对现有系统的免登和消息发送
钉钉微应用 免登 消息发送
在钉钉中对已有系统的免登
新建企业内部开发H5微应用
对于为什么要选择企业内部H5微应用的开发,我这边也是比较尴尬,因为要满足原有系统的消息发送,所以只能选择企业内部应用,当然如果 只需要免登功能 的话选择移动应用接入,具体原因马上就来。
对H5微应用的配置
相信对于使用钉钉的管理员对于这些的配置,应该是不在话下的,简单明了。
其中应用首页地址就是点开微应用图标后会跳转的链接了。
那么可以跳转到现在使用的系统中就能进行各种码的获取和兑换,然后完成免登了。那么开始吧
免登授权码的获取
根据钉钉的官方开发文档,从微应用进行免登需要从前端页面获取免登授权码
ps:这个坑爹的操作可能有别的方法代替吧…
官方文档没有明确说一定要从前端获取,我下了PHP版本的SDK,但是东西太多太杂也没去详细了解,就问了一下客服,从那边得到了准确的答复,emmm,要从前端获取…基于已开发的系统功能,这种获取免登授权码的方式极其不友好!但是,人在屋檐下不得不低头。
上代码:
<script src="//g.alicdn.com/dingding/dingtalk-jsapi/2.6.0/dingtalk.open.js"></script>
<script type="text/javascript">
dd.ready(function() {
// dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。
dd.runtime.permission.requestAuthCode({
corpId: "dingd0d89575d06ae19c35c2f4657eb6378f",
onSuccess: function(result) {
//成功获取后跳转到指定的URL 通过GET传一下需要的参数 result.code就是获取到的免登授权码
window.location.href='/?/&state=D_LOGIN&code='+result.code;
},
onFail : function(err) {}
});
});
</script>
因为本来在使用的系统就是有判断COOKIE啊啥的免登判断的,现在又多个跳转导致点微应用还要再多跳转一次就很silly B= =
反正现在只是初步完成需求,等后期再优化也没什么大毛病。
获取免登授权码之后 就是通过该码换取用户身份了
根据免登授权码获取用户身份
获取access_token
这是一个老生常谈的问题了,如果曾经使用过微信公众平台相关功能的,坑定都知道这么个东西,简而言之这个凭证就是爸爸,有了这玩意才有资格做别的事情。
那么要获取access_token 需要使用微应用的 AppKey 和 AppSecret,这两项都能从钉钉开放平台中获取
继续上代码
function d_login($url, $sid = ''){
if($_GET['state']!="D_LOGIN") return;
$code = $_GET['code'];
$appKey = AppKey;
$appSecret = AppSecret;
$getAccessToken = curl_get("https://oapi.dingtalk.com/gettoken?appkey=".$appKey."&appsecret=".$appSecret);
$getAccessToken = _decode($getAccessToken);
$access_token = $getAccessToken['access_token'];
}
那么现在access_token就获取到了
ps: curl_get是我们系统封装过的curl请求 ,总体来说就是通过访问某个URL,然后就会返回结果。
通过access_token 和 免登授权码获取用户信息
现在access_token和免登授权码都有了,就能着手获取用户信息了
废话不多说,继续上面未完成的代码
function d_login($url, $sid = ''){
if($_GET['state']!="D_LOGIN") return;
$code = $_GET['code'];
$appKey = AppKey;
$appSecret = AppSecret;
$getAccessToken = curl_get("https://oapi.dingtalk.com/gettoken?appkey=".$appKey."&appsecret=".$appSecret);
$getAccessToken = _decode($getAccessToken);
$access_token = $getAccessToken['access_token'];
//如果不需要部门等信息,到这一步,获取userId其实就足够了
$getUserId = curl_get("https://oapi.dingtalk.com/user/getuserinfo?access_token=".$access_token."&code=".$code."");
$getUserId = _decode($getUserId);
//这边返回的就是详细的用户信息了,包括部门、是否管理员等信息
$getUserInfo = curl_get("https://oapi.dingtalk.com/user/get?access_token=".$access_token."&userid=".$getUserId['userid']."");
$getUserInfo = _decode($getUserInfo);
//因为我需要用唯一的id和系统内部的userid绑定 所以就只取了userid,然后绑起来
$d_openid = $getUserInfo['userid'];
}
至于怎么绑定到对应用户,这边再说我都感觉没面子,如果你不是开发人员,那就找开发人员,最多一顿午饭的事情,他就能帮你搞定= =
将d_openid存到cookie中,设定多长的有效时间就自己决定吧。
今天时间有限,就先到这里了。