钉钉开发|钉钉微应用获取用户信息

前言 最近有个需求,要把之前做的一套H5应用放在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去H5系统直接登陆。就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所以自己记录一下。
应用开发流程

  1. 注册企业: 进入OA管理后台,通过一系列流程,完成企业注册。
  2. 创建微应用: 进入钉钉管理后台后可以进入 “企业应用-应用管理” 页面创建微应用。
  3. 需要填写应用Logo、应用名称、功能介绍、首页地址等必填信息。
  4. 完成后,可在钉钉App的“工作”Tab下找到企业,可以查看到微应用入口。
注意:首页URL必须真实,否则无法正常访问 创建微应用后会生成一个AgentID,方便后续开发使用。AgentID可用于免登鉴权、发送企业会话消息等场景。(后面会用到)

注意:企业内部应用是不需要钉钉审核的。如果是开发商,需要创建第三方应用,这个是需要钉钉审核的。内部应用创建完成后就会得到AgentId、AppKey和AppSecret。进入应用权限管理中社情对应的权限,默认开通的基础权限,如果需要审批、代办等权限需要在下面权限列表里面单独申请,不过还在不需要钉钉审核,即开即用。
免登流程 大致分四步:
【钉钉开发|钉钉微应用获取用户信息】1、前端获取钉钉免登授权码code;
2、后端获取access_token;
3、使用授权码code和access_token换取用户userid;
4、通过access_token和userid换去用户详情userinfo。
第一步:获取授权码code。
首先页面引入JSAPI。dd.ready(function() { dd.runtime.permission.requestAuthCode({ corpId: "CORPID", //你们企业钉钉的CORPID onSuccess: function(result) { { var code = result.code; var url = `/wework?code=${code}`; //把code传给后端 window.location.href = https://www.it610.com/article/url; } }, onFail : function(err) { alert('出错了, ' + JSON.stringify(err)); }}); });

第二步:后台获取access_token
public function getToken(){ //判断token是否存在 if(!Redis::exists('access_token_rep')){ //根据code 获取access_token $getTokenUrl = 'https://oapi.dingtalk.com/gettoken?appkey='.env('DINGDING_APPKEY') .'&appsecret='.env('DINGDING_APPSECRET'); $result = FormatUtil::httpGet($getTokenUrl); //发送get请求 if($result->errcode == 0){ $access_token = $result->access_token; //将token保存到reids中 Redis::setex('access_token_rep', 3600*2, $access_token); }else{ return false; } }else{ $access_token = Redis::get('access_token_rep'); } return $access_token; }

第三步、第四步:换取userId加获取userinfo
public function getUserInfo(){ //获取token $access_token = $this->getToken(); //获取用户的userId $getUserIdUrl = 'https://oapi.dingtalk.com/user/getuserinfo?access_token='.$access_token.'&code='.$code; $userIdResult = FormatUtil::httpGet($getUserIdUrl); if($userIdResult->errcode == 0){ //获取用户详细信息 $getInfoUrl = 'https://oapi.dingtalk.com/user/get?access_token='.$access_token.'&userid=' .$userIdResult->userid; $getInfoReslt = FormatUtil::httpGet($getInfoUrl); //获取用户信息成功 if($getInfoReslt->errcode == 0){ 用户信息 } } }

备注
  1. 授权码code是每次请求都不一样,单次请求的数据5分钟有效,所以没必要缓存,建议直接用一次调一次。
  2. access_token有效期7200秒,自动续期。建议使用缓存。

    推荐阅读