每天学习一点点,成功增加一大步

discuz社区与钉钉企业应用的整合

PHP zhanghui 2658℃

要想实现discuz社区与钉钉企业应用的整合的主要目的就是通过点击钉钉的企业应用图标能够直接登录到 discuz ,而要想实现这个就要解决以下几个问题:

  1. 如何在用户点开钉钉企业应用时获取到当前钉钉用户的信息。
  2. 如何绕开discuz的登录验证通过url能直接登录(这个已经解决记录在上篇博文)
  3. 新用户的自动注册,这个可以通过 discuz 的 ucenter(UCenter 接口开发) 来解决 
  4. 通过 discuz 的 ucenter 注册的新用户默认是不自动激活的,要想能自动激活可官方论坛的或者是民间达人

 

本篇记录的是如何在用户点开钉钉企业应用时获取到当前钉钉用户的信息。在钉钉的开放平台上找来找去只找通过 JS-API 解决的途径。

官方DEMO地址:https://github.com/injekt/openapi-demo-php?spm=a219a.7629140.0.0.VPIEz6

这里面有两个版本:

  • isv目录:isv应用php demo
  • corp目录:企业应用php demo

刚开始我不明白这两个版本的区别,茫然的拿了 isv 目录来测试结果发现里面的 config.php 中有关配置与在申请钉钉的企业应用时官方所给的信息不相符,有些信息都没有。后来换了 corp 目录来测试也同样的在 config.php 中将以下有关的配置都填写了上。

<?php
define('DIR_ROOT', dirname(__FILE__).'/');
define("OAPI_HOST", "https://oapi.dingtalk.com");
define("CORPID", "");
define("SECRET", "");
define("AGENTID", "");//必填,在创建微应用的时候会分配

然后对照着 DEMO 中的 indexpc.php,自己修改了 index.php 和 public/javascripts/demo.js

index.php 修改代码:

<?php
require_once(__DIR__ . "/api/Auth.php");

//$config = Auth::getConfig();
//$access_token = Auth::getAccessToken();
//print_r($access_token);
//print_r($config);
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>jsapi demo</title>
    <link rel="stylesheet" href="/corp/public/stylesheets/style.css" type="text/css" />
    <!-- config中signature由jsticket产生,若jsticket失效,则signature失效,表现为dd.error()返回“权限校验失败”之错误。 -->
    <!-- 在请求新的jsticket之后,旧的ticket会失效,导致旧ticket产生的signature失效。 -->
    <link rel="stylesheet" href="http://g.alicdn.com/ilw/ding/0.2.3/styles/main.css?v=262192719_110744" type="text/css"/>
    <script type="text/javascript">
        var _config = <?php echo Auth::getConfig();?>
    </script>
    <script type="text/javascript" src="/corp/public/javascripts/zepto.min.js"></script>
    <script type="text/javascript" src="https://g.alicdn.com/dingding/dingtalk-pc-api/2.7.0/index.js"></script>
</head>
<body>
<div id="a"></div>
<button class="btn btn-block btn-default chooseonebtn">点击进入</button>
<script type="text/javascript" src="/corp/public/javascripts/logger.js"></script>
<script type="text/javascript" src="/corp/public/javascripts/testpc.js"></script>
</body>
</html>

然后按照官方文档:

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.t56jr0&treeId=172&articleId=104969&docType=1

修改 demo.js 主要作用是通过 get_userinfo 来获取当前钉钉用户的信息,代码:

/**
 * Created by wz_zh on 2017/3/11.
 */

logger.i('登录论坛...');

/**
 * _config comes from server-side template. see views/index.jade
 */
DingTalkPC.config({
    agentId: _config.agentId,
    corpId: _config.corpId,
    timeStamp: _config.timeStamp,
    nonceStr: _config.nonceStr,
    signature: _config.signature,
    jsApiList: [
        'runtime.permission.requestAuthCode',
        'device.notification.alert',
        'dd.biz.user.get'
    ] // 必填,需要使用的jsapi列表
});

DingTalkPC.userid=0;
DingTalkPC.ready(function(res){
    logger.i('dd.ready rocks!');
    $('.chooseonebtn').on('click', function () {
        logger.i('click!');
        DingTalkPC.runtime.permission.requestAuthCode({
            corpId:window._config.corpId, //企业ID
            onSuccess: function(result) {
                /*{
                 code: 'hYLK98jkf0m' //string authCode
                 }*/
                // logger.i(JSON.stringify(result));
                $.ajax({
                    url: '/corp/sendMsg.php',
                    type: "POST",
                    data: {"event": "get_userinfo", "code": result.code},
                    dataType: 'json',
                    timeout: 900,
                    success: function (data, status, xhr) {
                        var info = JSON.parse(data);
                        if (info.errcode === 0) {
                            logger.i('user: ' + JSON.stringify(info));
                            // logger.i('user id: ' + info.userid);
                            DingTalkPC.userid = info.userid;
                            // window.open('member.php?mod=logging&action=login&app=ding&ding_username='.info.userid)
                        }
                        else {
                            logger.e('auth error: ' + data);
                        }
                    },
                    error: function (xhr, errorType, error) {
                        logger.e(errorType + ', ' + error);
                    }
                });
            },
            onFail : function(err) {
                logger.e(JSON.stringify(err));
            }
        })
    });
});
DingTalkPC.error(function(error){
    /*{
     errorCode: 1001, //错误码
     errorMessage: '', //错误信息
     }*/
    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开调试窗口的 console查看,也可以在返回的res参数中查看。
    logger.e(JSON.stringify(error));
});

只可以获取到有用的数据也只是 userid 这一项,有点可惜所以第二天继续寻找答案,最后在官方的管理通讯录文档中找到了解决误诊误

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.OU1cfV&treeId=172&articleId=104979&docType=1

然后就可以可以通过上篇所说的【绕开discuz的登录验证通过url能直接登录】。

转载请注明:隨習筆記 » discuz社区与钉钉企业应用的整合