前言
最近有个需求,要把之前做的一套H5应用放在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去H5系统直接登陆。就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所以自己记录一下。
应用开发流程
注册企业: 进入OA管理后台,通过一系列流程,完成企业注册。创建微应用: 进入钉钉管理后台后可以进入 “企业应用-应用管理” 页面创建微应用。需要填写应用Logo、应用名称、功能介绍、首页地址等必填信息。完成后,可在钉钉App的“工作”Tab下找到企业,可以查看到微应用入口。注意:首页URL必须真实,否则无法正常访问 创建微应用后会生成一个AgentID,方便后续开发使用。AgentID可用于免登鉴权、发送企业会话消息等场景。(后面会用到)
1
注意:企业内部应用是不需要钉钉审核的。如果是开发商,需要创建第三方应用,这个是需要钉钉审核的。内部应用创建完成后就会得到AgentId、AppKey和AppSecret。进入应用权限管理中社情对应的权限,默认开通的基础权限,如果需要审批、代办等权限需要在下面权限列表里面单独申请,不过还在不需要钉钉审核,即开即用。
免登流程
大致分四步:
1、前端获取钉钉免登授权码code; 2、后端获取access_token; 3、使用授权码code和access_token换取用户userid; 4、通过access_token和userid换去用户详情userinfo。
第一步:获取授权码code。
首先页面引入JSAPI。<script src="///dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script><script type="text/javascript">dd.ready(function() {dd.runtime.permission.requestAuthCode({corpId: "CORPID", //你们企业钉钉的CORPIDonSuccess: function(result) {{var code = result.code;var url = `/wework?code=${code}`; //把code传给后端window.location.href = url;}},onFail : function(err) {alert('出错了, ' + JSON.stringify(err));}});});
第二步:后台获取access_token
public function getToken(){//判断token是否存在if(!Redis::exists('access_token_rep')){//根据code 获取access_token$getTokenUrl = '/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 = '/user/getuserinfo?access_token='.$access_token.'&code='.$code;$userIdResult = FormatUtil::httpGet($getUserIdUrl);if($userIdResult->errcode == 0){//获取用户详细信息$getInfoUrl = '/user/get?access_token='.$access_token.'&userid='.$userIdResult->userid;$getInfoReslt = FormatUtil::httpGet($getInfoUrl);//获取用户信息成功if($getInfoReslt->errcode == 0){用户信息}}}