钉钉第三方企业微应用开发与部署(三)

介绍

本文介绍基于钉钉应用开发第三方企业微应用(网页)的前端,可以对照官方文档地址

钉钉应用登录

如果你不需要获取用户的手机号等敏感信息,那么可以使用静默登录,根据这个授权码code调用钉钉服务端api获取用户信息。静默登录获取的授权码和授权登录获取的授权码不能混用,调用根据授权码获取用户信息的钉钉api接口也是不一样的

<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/3.0.46/dingtalk.open.js"></script>
<script>
// 通过钉钉提供的jsapi可以直接调用获取,不需要dd.config的配置
dd.requestAuthCode({
    corpId: corpId,
    onSuccess: function (result) {
        var code = result.code;
    }
});
</script>

如果需要获取用户的手机号登敏感信息,就必须使用授权登录。钉钉授权登录可以使用钉钉的oauth登录。oauth登录的redirect_uri必须要使用钉钉安全域名,且redirect_uri上不能携带参数,授权码只会回调到钉钉安全域名上。具体的申请流程参考钉钉第三方企业微应用开发与部署#申请钉钉安全域名

授权登录

为了方便展示使用js+html编写,还可以使用 npm install dingtalk-jsapi --save 安装dingtalk

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/3.0.46/dingtalk.open.js"></script>
<script>
    const domain = "****填写你的应用后端地址****";
    const dingDomain = "******填写你的钉钉安全域名*******";


    const queryString = new URLSearchParams(new URL(location.href).search);
    let corpId = queryString.get('corpId');
    const authCode = queryString.get('authCode');
    const state = queryString.get('state');
    if (state && !corpId) {
      corpId = state;
    }
    const userInfo = localStorage.getItem('userInfo');

    
    getApiInfo();
    if (authCode) {
        dingLogin();
    } 

    

   function getApiInfo() {
      let that = this
      $.ajax({
        url: `${domain}/api/public/ding/jsapi?corpId=${corpId}&url=${location.href}`,
        method: "GET",
        header: {
          'Content-Type': 'application/json'
        },
        success: function (res) {
          if (!authCode) {
            const url =
                `https://login.dingtalk.com/oauth2/auth?redirect_uri=${dingDomain}/&response_type=code&client_id=${res.data.data.clientId}&scope=openid&state=${res.data.data.corpId}&prompt=consent`;
            location.href=url;
          }

          dd.config({
            appId: res.data.data.appId, // 必填,授权应用的agentid
            agentId: res.data.data.appId, // 必填,授权应用的agentid
            corpId: res.data.data.corpId, //必填,企业ID
            timeStamp: res.data.data.timeStamp, // 必填,生成签名的时间戳
            nonceStr: res.data.data.nonceStr, // 必填,自定义固定字符串。
            signature: res.data.data.signature, // 必填,签名
            type: 0, //选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
            jsApiList: [] // 必填,需要使用的jsapi列表,注意:不要带dd。
          });
          dd.error(function (err) {
            console.log('dd error: ' + JSON.stringify(err));
          }) //该方法必须带上,用来捕获鉴权出现的异常信息,否则不方便排查出现的问题
        },
        fail: function (err) { // 失败回调(网络错误或超时)
          
        },
      })
    }


   function dingLogin() {
      let that = this;
      $.ajax({
        url: `${domain}/api/public/ding/login?code=${authCode}&corpId=${corpId}`,
        type: "POST",
        dataType: "json",
        success: function (res) {
          if (res.data.code === 200) {
            localStorage.setItem('userInfo', JSON.stringify(res.data.data);
          } 
        },
        fail: function (err) { // 失败回调
        },
      })
    }


    function isDingTalkEnvironment() {
        const userAgent = navigator.userAgent.toLowerCase();
        return /dingtalk/.test(userAgent);
    }
域名重定向

由于钉钉安全域名和应用后端域名不一致,前端保存的用户信息一般是需要保存到应用后端域名下的localStorage或者cookie,而发布的微应用首页地址必须是钉钉安全域名的url,所以需要增加从钉钉安全域名到应用后端域名的重定向,以nginx配置为例:


server {
    listen 80; #这里由于钉钉安全域名,一般是80
    server_name *******应用后端服务器ip****;
    return 302 *****应用后端域名******$request_uri;  
}
接入监控中心

在微应用需要上架应用市场之前,需要接入监控中心,将下面的应用id替换成你得微应用id,复制粘贴到微应用<header></header>标签中。当然你可以按照钉钉第三方企业微应用开发与部署#应用上架#2来处理

		<meta name="wpk-bid" content="dta_2_应用id">
		<script>
			var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
				CSS.supports('top: constant(a)'))
			document.write(
				'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
				(coverSupport ? ', viewport-fit=cover' : '') + '" />')


			var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);
			var isProductEnv = window && window.location && window.location.host && window.location.host.indexOf('127.0.0.1') ===
				-1 && window.location.host.indexOf('localhost') === -1 && window.location.host.indexOf('192.168.') === -1
			if (isProductEnv) {
				!(function(c, i, e, b) {
					var h = i.createElement("script");
					var f = i.getElementsByTagName("script")[0];
					h.type = "text/javascript";
					h.crossorigin = true;
					h.onload = function() {
						c[b] || (c[b] = new c.wpkReporter({
							bid: "dta_2_应用id"
						}));
						c[b].installAll()
					};
					f.parentNode.insertBefore(h, f);
					h.src = e
				})(window, document, "https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js", "__wpk");
			}
		</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值