编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

钉钉应用开发

wxchong 2024-06-28 11:01:38 开源技术 17 ℃ 0 评论

引入js

<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/3.0.25/dingtalk.open.js"></script>
<script src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>


获取当前登录用户

<button id="getUser">获取用户</button>
$('#getUser').on('click',function (){
    dd.ready(function () {
        dd.runtime.permission.requestAuthCode({
            corpId: 'ding5ada5365adf12663', // 企业ID
            onSuccess: function (result) {
                var authCode = result.code; // 获取到授权码
                // 将授权码发送到服务端进行验证和获取用户信息等操作
                // 服务端可以通过钉钉开放平台的接口来获取用户信息,类似于之前提到的授权登录流程

                // 创建一个新的<div>元素来显示authCode的值
                var authCodeElement = document.createElement('div');
                authCodeElement.textContent = 'Auth Code: ' + authCode;

                // 将新的<div>元素添加到<body>中
                document.body.appendChild(authCodeElement);


                $.ajax({
                    url: '/ding_ding/getUserInfo',
                    method: 'GET',
                    data: {
                        code: authCode
                    },
                    success: function(response) {
                        // 处理成功响应
                        $("body").append('<p>getUserInfo:').append(JSON.stringify(response)).append('</p>');

                    },
                    error: function(xhr, status, error) {
                        // 处理错误
                    }
                });

            },
            onFail: function (err) {
                // 处理授权失败的情况
                $("body").append('<p>requestAuthCode.onFail:').append(JSON.stringify(err)).append('</p>');
            }
        });
    });
});

选择照片并上传

注意钉钉有些接口需要鉴权,具体需要鉴权的参考文档:

https://open.dingtalk.com/document/orgapp/jsapi-overview

<button id="choose">选择照片</button>
$('#choose').on('click', function() {
    // 点击事件处理逻辑
    $("body").append('<p>choose:').append("点击了选择照片按钮").append('</p>');
    $.ajax({
        url: '/ding_ding/auth',
        type: 'GET',
        success: function(response) {
            if (response) {
                response =response.data
                $("body").append('<p>config:').append(JSON.stringify({
                    agentId: response.agentId,
                    corpId: response.corpId,
                    timeStamp: response.timestamp,
                    nonceStr: response.nonceStr,
                    signature: response.signature,
                    type:0,
                    jsApiList: [
                        // 在这里添加你需要使用的钉钉 JSAPI
                        'biz.util.chooseImage'
                    ]
                })).append('</p>');
                // 鉴权参数获取成功
                // 调用钉钉 JSAPI的config方法
                dd.config({
                    agentId: response.agentId,
                    corpId: response.corpId,
                    timeStamp: response.timestamp,
                    nonceStr: response.nonceStr,
                    signature: response.signature,
                    type:0,
                    jsApiList: [
                        // 在这里添加你需要使用的钉钉 JSAPI
                        'biz.util.chooseImage'
                    ]
                })
                dd.ready(function () {
                    dd.biz.util.chooseImage({
                        count:1,
                        secret:false,
                        sourceType:['album'],
                        position:'back',
                        onSuccess: (res) => {
                            $("body").append('<p>onSuccess:').append(JSON.stringify(res)).append('</p>');
                            $("body").append('<p>onSuccess:').append( res.files[0].path).append('</p>');
                            dd.biz.util.uploadFile({
                                url: '/upload_image',
                                filePath: res.files[0].path,
                                fileName: 'file',
                                onSuccess: (res) => {
                                    $("body").append('<p>uploadFile.onSuccess:').append(JSON.stringify(res)).append('</p>');
                                },
                                onFail:(err) =>{
                                    $("body").append('<p>uploadFile.onFail:').append(JSON.stringify(err)).append('</p>');
                                }
                            })
                        },
                        onFail:(err) =>{
                            console.log(JSON.stringify(err))
                            $("body").append('<p>chooseImage.onFail:').append(JSON.stringify(err)).append('</p>');
                        }
                    })
                });
                dd.error(function(error) {
                    // 钉钉 JSAPI 加载失败
                    // 可以在这里处理失败情况
                    $("body").append('<p>dd.onFail:').append(JSON.stringify(error)).append('</p>');
                });
            } else {
                // 鉴权参数获取失败
                console.error(response.error);
            }
        },
        error: function(xhr, status, error) {
            // 处理错误情况
            console.error(error);
        }
    });

});


后端代码

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Str;

class DingDingAuthController extends Controller
{

    public function getUserInfo(Request $request)
    {
        // 获取access_token
        $token = $this->getAccessToken();

        //
        $response = resolve('guzzle')->request('POST', 'https://oapi.dingtalk.com/topapi/v2/user/getuserinfo', [
            'query' => [
                'access_token' => $token,
            ],
            'form_params' => [
                'code' => $request['code'],
            ]
        ]);
        $dingDingUser = json_decode($response->getBody()->getContents(), true);
        return $dingDingUser;
    }

    // AUTH
    public function auth(Request $request)
    {
        $corpId = DingDingAuthController::CORPID; //
        $agentId = DingDingAuthController::AGENTID; //

        $url = 'https://abc.com/getDingDingUser.html'; // 当前页面的完整 URL
        $timestamp = time(); // 当前时间戳
        $nonceStr = Str::random(16); // 生成随机字符串

        $signature = $this->generateSignature($nonceStr, $timestamp, $url);
        return successResponseArray(
            [
                'corpId' => $corpId,
                'agentId' => $agentId,
                'timestamp' => $timestamp,
                'nonceStr' => $nonceStr,
                'signature' => $signature,
            ]
        );
    }


    private function generateSignature($nonceStr, $timestamp, $url)
    {
        $ticket = $this->getJsapiTicket();
        $string = "jsapi_ticket={$ticket}&noncestr={$nonceStr}×tamp={$timestamp}&url={$url}";
        return sha1($string);
    }

    private function getJsapiTicket()
    {
        $accessToken = $this->getAccessToken();

        $response = resolve('guzzle')->request('GET', 'https://oapi.dingtalk.com/get_jsapi_ticket', [
            'query' => [
                'access_token' => $accessToken,
                'type' => 'jsapi',
            ],
        ]);
        $response = json_decode($response->getBody()->getContents(), true);
        return $response['ticket'];
    }

    private function getAccessToken()
    {
        // 获取access_token
        $response = resolve('guzzle')->request('GET', 'https://oapi.dingtalk.com/gettoken', [
            'query' => [
                'appkey' => DingDingAuthController::APPKEY,
                'appsecret' => DingDingAuthController::APPSECRET,
            ]
        ]);
        $accessToken = json_decode($response->getBody()->getContents(), true);
        return $accessToken['access_token'];
    }

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表