第一步需要在釘釘開放平臺註冊: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'=>[]];
}
}