前言 最近有个需求,要把之前做的一套H5应用放在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去H5系统直接登陆。就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所以自己记录一下。
应用开发流程
- 注册企业: 进入OA管理后台,通过一系列流程,完成企业注册。
- 创建微应用: 进入钉钉管理后台后可以进入 “企业应用-应用管理” 页面创建微应用。
- 需要填写应用Logo、应用名称、功能介绍、首页地址等必填信息。
- 完成后,可在钉钉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){
用户信息
}
}
}
备注
- 授权码code是每次请求都不一样,单次请求的数据5分钟有效,所以没必要缓存,建议直接用一次调一次。
- access_token有效期7200秒,自动续期。建议使用缓存。
推荐阅读
- 大数据|字节跳动火山引擎加入 Linux 云原生计算基金会(CNCF) | 新闻
- 数据可视化|几款免费在线甘特图工具
- career|万能辞职报告
- 敏捷学习记录
- python|DIY制作炫彩灯球
- Arduino MQTT PubSubClient 库 发送长文本
- 如何书写软件应用发明专利说明书(实例)
- 案例分享(一)——如何提高产品的用户体验
- android 显示flash视频播放器
- 项目管理|组建项目团队-执行过程组