php版本:釘釘第三方掃碼登陸;

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章