第一步需要在钉钉开放平台注册:https://ding-doc.dingtalk.com/
注册成功后:创建扫码登陆信息:
填写完成后获取到appId和appSecret
下面开始代码模块:
官方给了2种方式:
方式一 使用钉钉提供的扫码登录页面
方式二 支持网站将钉钉登录二维码内嵌到自己页面中
我使用的是方式二:官方文档L:https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6
前端实现方式:嵌入到前端页面;
引入:
<span style="color:#595959"><span style="color:#595959"><span style="color:#595959"><span style="color:#595959"><span style="color:#595959"><span style="color:#d73a49">< </span><span style="color:#595959">脚本</span> <span style="color:#595959">src </span><span style="color:#d73a49">= </span><span style="color:#669900">“ https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js” </span><span style="color:#d73a49">> </span><span style="color:#d73a49">< </span><span style="color:#669900">/ script></span></span></span></span></span></span>
下面是服务器代码:
实现思路:前端展示二维码-》用户扫码后会给前端返回一个loginTmpCode-》前端把这个loginTmpCode发送给后端-》后端接收到后访问钉钉服务器并重定向到指定方法-》后端获取code-》根据code拿到用户钉钉标识信息-》和当前用户进行账号信息绑定-》返回给前端绑定成功;
服务器实现步骤:根据loginTmpCode获取临时识别码code-》根据code获取到当前用户SNS_TOKEN-》根据SNS_TOKEN获取用户信息user_info;就可以获取到用户信息了
获取钉钉服务器信息到路径:
//获取token(GET)
protected $AccessTokneUrl = 'https://oapi.dingtalk.com/sns/gettoken?';
//获取临时授权码 (POST)
protected $PersistentCodeUrl = 'https://oapi.dingtalk.com/sns/get_persistent_code?';
//获取用户授权(POST)
protected $SnsTokneUrl = 'https://oapi.dingtalk.com/sns/get_sns_token?';
//获取用户信息
protected $UserInfoUrl = 'https://oapi.dingtalk.com/sns/getuserinfo?';
//登录获取路径
protected $SrcGoToUrl = 'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?';
protected $DingCon;//
protected $AppId;//钉钉appid
protected $AppSercret;//钉钉appSecret
protected $AccessTokne;//获取到的token
protected $EnvIp;
public function __construct()
{
$this->DingCon = $DingCon = config('common.DingDing');
$this->AppId = $DingCon['appId'];
$this->AppSercret = $DingCon['appSecret'];
$this->EnvIp = config('common.EnvIp');
$AppIdSercret = $this->AccessTokneUrl.
'appid='.$DingCon['appId'].
'&appsecret='.$DingCon['appSecret'];
$GetAccessToken = $this->JsonDecode(CurlCommon::CurlGet($AppIdSercret));
if($GetAccessToken['errcode'] == 0){
$this->AccessTokne = $GetAccessToken['access_token'];//获取访问钉钉访问器标识码方法;
}
}
获取钉钉临时码code ;需要使用到get_headers方法,这里面到 $this->GetGoToUrl()其实就是:前端里的goto然后在后面拼接前端发送过来loginTmpCode;
$Url = $this->GetGoToUrl()['url'].'&loginTmpCode='.$TmpCode;//访问路径拼接登陆码
$header = get_headers($Url,1);//访问
if (strpos($header[0],'301') || strpos($header[0],'302')) {//截取判断:是否是301和302状态码
if(!empty($header['Location'])) {
$parse_url = parse_url($header['Location']);
if(isset($parse_url['query'])){
$ContUrlQuery = $this->ContUrlQuery($parse_url['query']);
if(isset($ContUrlQuery['code']) && !empty($ContUrlQuery['code'])){
$Return = $this->TmpAuthCode($ContUrlQuery['code']);//获取到code
}
}
}
}
/**
* 字段处理获取code
*/
public function ContUrlQuery($query)
{
$queryParts = explode('&', $query);
$params = array();
foreach ($queryParts as $param) {
$item = explode('=', $param);
$params[$item[0]] = $item[1];
}
return $params;
}
/**
* 获取当前用户的临时授权码
* access_token
* tmp_auth_code
*/
public function TmpAuthCode($Code)
{
$PersistentCode = $this->PersistentCodeUrl.
'access_token='.$this->AccessTokne.
'&tmp_auth_code='.$Code;
$PersistentJson = json_encode([
'access_token'=>$this->AccessTokne,
'tmp_auth_code'=>$Code]
);
$GetPersistent = $this->JsonDecode(CurlCommon::CurlPost($PersistentCode,$PersistentJson));
if($GetPersistent['errcode'] == 0 && !empty($GetPersistent['openid']) && !empty($GetPersistent['persistent_code'])){
return $this->SnsToken($GetPersistent);
}else{
return ['code'=>$GetPersistent['errcode'],'msg'=>$GetPersistent['errmsg'],'data'=>[]];
}
}
/**
* 获取当前用户SNS_TOKEN
* access_token
* openid
* persistent_code
*/
public function SnsToken($Persistent)
{
$SnsTokenData = $this->SnsTokneUrl.
'access_token='.$this->AccessTokne.
'&openid='.$Persistent['openid'].
'&persistent_code='.$Persistent['persistent_code'];
$SnsTokenJson = json_encode([
'access_token'=>$this->AccessTokne,
'openid'=>$Persistent['openid'],
'persistent_code'=>$Persistent['persistent_code']]);
$GetSnsToken = $this->JsonDecode(CurlCommon::CurlPost($SnsTokenData,$SnsTokenJson));
if($GetSnsToken['errcode'] == 0){
return $this->GetUserInfo($GetSnsToken['sns_token']);
}else{
return ['code'=>$GetPersistent['errcode'],'msg'=>$GetPersistent['errmsg'],'data'=>[]];
}
}
/**
* 获取当前用户信息
* SnsToken
*/
public function GetUserInfo($SnsToken)
{
$UserInfo = $this->UserInfoUrl.
'sns_token='.$SnsToken;
$GetUserInfo = $this->JsonDecode(CurlCommon::CurlGet($UserInfo));
if($GetUserInfo['errcode'] == 0){
return $GetUserInfo['user_info'];
里面数据是:
}else{
return ['code'=>$GetPersistent['errcode'],'msg'=>$GetPersistent['errmsg'],'data'=>[]];
}
}