钉钉企业内微应用对现有系统的免登和消息发送

在钉钉中对已有系统的免登

新建企业内部开发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中,设定多长的有效时间就自己决定吧。

今天时间有限,就先到这里了。