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'=>[]];
        }
    }

 

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