使用钉钉的扫码会出现多个回调(DTFrameLogin)

这篇具有很好参考价值的文章主要介绍了使用钉钉的扫码会出现多个回调(DTFrameLogin)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方:地址

出现的问题

1692861955468

解决后效果

1692861665687

正常使用(按照官网的流程进行使用)

fn.js
该文件就是钉钉官网的js文件,我下载到了本地
js文件下载地址

!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1382)}({1382:function(e,t){var r=function(e,t){var r=e.match(new RegExp("[?&]"+t+"=([^&]+)"));return r?r[1]:null};window.DTFrameLogin=function(e,t,n,o){var i,u=e.id&&document.getElementById(e.id)||null,c=document.createElement("iframe");t.client_id&&t.redirect_uri&&t.response_type&&t.scope?u?(u.innerHTML="",u.appendChild(c),c&&c.contentWindow&&c.contentWindow.postMessage&&window.addEventListener?(c.src="https://"+((i=t).isPre?"pre-login":"login")+".dingtalk.com/oauth2/auth?iframe=true&redirect_uri="+i.redirect_uri+"&response_type="+i.response_type+"&client_id="+i.client_id+"&scope="+i.scope+(i.prompt?"&prompt="+i.prompt:"")+(i.state?"&state="+i.state:"")+(i.org_type?"&org_type="+i.org_type:"")+(i.corpId?"&corpId="+i.corpId:"")+(i.exclusiveLogin?"&exclusiveLogin="+i.exclusiveLogin:"")+(i.exclusiveCorpId?"&exclusiveCorpId="+i.exclusiveCorpId:""),c.width=""+(e.width||300),c.height=""+(e.height||300),c.frameBorder="0",c.scrolling="no",window.addEventListener("message",(function(e){var t=e.data,i=e.origin;if(/login\.dingtalk\.com/.test(i)&&t)if(t.success&&t.redirectUrl){var u=t.redirectUrl,c=r(u,"authCode")||"",d=r(u,"state")||"",s=r(u,"error")||"";c?n&&n({redirectUrl:u,authCode:c,state:d}):o&&o(s)}else o&&o(t.errorMsg)}))):o&&o("Browser not support")):o&&o("Element not found"):o&&o("Missing parameters")}}});

util.js
这个文件就是按照钉钉文档的流程编写的代码

//钉钉js文件地址
import './fn.js'
//跳转地址,需要在钉钉后台提前配置好,暂时未用到
const url = location.origin + '/#/'
export const BASE_URL = encodeURIComponent(url);
const appid_default = 'xxxxxx' //填写自己的钉钉应用id
const state_default = 'PC'

const fn = () => {
    console.log('默认的回调');
}

//INIT_DINDING 生成钉钉二维码 传递两个参数
//参数一,html标签id,该标签用来渲染二维码
//参数二,回调,在扫码完成后,进行的操作
export const INIT_DINDING = (id = "qr_code_div", callback = fn) => {

    const demo = new window.DTFrameLogin(
        {
            id,
            width: 300,//二维码宽度
            height: 300,//二维码高度
        },
        {
            client_id: appid_default,
            redirect_uri: BASE_URL,
            client_id: appid_default,
            scope: 'openid',
            response_type: 'code',
            state: state_default,
            prompt: 'consent',

        },
        (loginResult) => {
            // const { redirectUrl, authCode, state } = loginResult;
            //loginResult字段说明____________________________
            //redirectUrl  重定向的地址
            //authCode     !!!很重要,这个就是钉钉返回的唯一标识
            //state        我上面写的PC,因此这个值就是PC,用来以后区别pc和app
            
            // 这里可以直接进行重定向
            // window.location.href = redirectUrl;
            // 也可以在不跳转页面的情况下,使用code进行授权
            
            //——————————————触发回调————————————————————————————————————
            callback && callback(loginResult)
            return
        },
    )
}

edit.vue
封装出现二维码的组件

<template>
  <div>
    <div class="qr_code_div" ref="qrCodeDiv" id="qr_code_div"></div>
  </div>
</template>
<script>
//看准你自己的文件地址---------------
import { INIT_DINDING, SET_MESSAGE } from "./util.js";
export default {
  data() {
    return {};
  },

  mounted() {
    INIT_DINDING("qr_code_div",function () {
      console.log("this__________________这是扫码的回调");
      // fn=null
    });
  },
  created() {},
  methods: {},
  beforeDestroy(){
  }
};
</script>
<style lang="scss" scoped>
.qr_code_div {
  width: 300px;
  height: 300px;
  margin: 0 auto;
}
</style>

app.vue
使用组件

<template>
  <div>
    <button @click='blg = !blg'>{{blg}}</button>
    <edit v-if="blg"></edit>
  </div>
</template>
<script>
import edit from './edit'
export default {
  data() {
    return {
      blg:true
    };
  },
  components:{
    edit
  },
  mounted() {

  },
  created() {},
  methods: {},
};
</script>
<style lang="scss" scoped>
</style>


按照上面的流程便可以正常的在h5使用钉钉的扫码组件了

修改后使用(解决方式)

解决组件关闭后,多次开启组件会产生多个回调的bug

在上方的edit.vue组件中进行修改

<template>
  <div>
    <div class="qr_code_div" ref="qrCodeDiv" id="qr_code_div"></div>
  </div>
</template>
<script>
import { INIT_DINDING, SET_MESSAGE } from "../utils/init";
//1、步骤一
//修改之前的匿名回调
let fn = function () {
  console.log("this__________________这是扫码的回调");
  //2、步骤二
  //回调执行后把函数置空
  fn = null;
};
export default {
  data() {
    return {};
  },

  mounted() {
    //3、步骤三,传递修改后的回调
    INIT_DINDING("qr_code_div", fn);
  },
  created() {},
  methods: {},
  beforeDestroy() {
    //4、步骤四---组件销毁也把函数置空
    fn = null;
  },
};
</script>
<style lang="scss" scoped>
.qr_code_div {
  width: 300px;
  height: 300px;
  margin: 0 auto;
}
</style>

自己的理解(路人可忽略该内容!)

查看钉钉的打包后的源码,发现是通过绑定message监听来接受回调的
其实还有另外一种,就是在message事件执行后,立即取消绑定,只让他执行一次
但是考虑到是匿名事件,并且是打包后的代码,并没有进行更改
就使用了另一种方法,也就是上诉的方法
钉钉源码文章来源地址https://www.toymoban.com/news/detail-670520.html

! function (e) {
    var t = {};

    function r(n) {
        if (t[n]) return t[n].exports;
        var o = t[n] = {
            i: n,
            l: !1,
            exports: {}
        };
        return e[n].call(o.exports, o, o.exports, r), o.l = !0, o.exports
    }
    r.m = e, r.c = t, r.d = function (e, t, n) {
        r.o(e, t) || Object.defineProperty(e, t, {
            enumerable: !0,
            get: n
        })
    }, r.r = function (e) {
        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
            value: "Module"
        }), Object.defineProperty(e, "__esModule", {
            value: !0
        })
    }, r.t = function (e, t) {
        if (1 & t && (e = r(e)), 8 & t) return e;
        if (4 & t && "object" == typeof e && e && e.__esModule) return e;
        var n = Object.create(null);
        if (r.r(n), Object.defineProperty(n, "default", {
                enumerable: !0,
                value: e
            }), 2 & t && "string" != typeof e)
            for (var o in e) r.d(n, o, function (t) {
                return e[t]
            }.bind(null, o));
        return n
    }, r.n = function (e) {
        var t = e && e.__esModule ? function () {
            return e.default
        } : function () {
            return e
        };
        return r.d(t, "a", t), t
    }, r.o = function (e, t) {
        return Object.prototype.hasOwnProperty.call(e, t)
    }, r.p = "", r(r.s = 1382)
}({
    1382: function (e, t) {
        var r = function (e, t) {
            var r = e.match(new RegExp("[?&]" + t + "=([^&]+)"));
            return r ? r[1] : null
        };
        window.DTFrameLogin = function (e, t, n, o) {
            var i, u = e.id && document.getElementById(e.id) || null,
                c = document.createElement("iframe");
            t.client_id && t.redirect_uri && t.response_type && t.scope ? u ? (u.innerHTML = "", u.appendChild(c), c && c.contentWindow && c.contentWindow.postMessage && window.addEventListener ? (c.src = "https://" + ((i = t).isPre ? "pre-login" : "login") + ".dingtalk.com/oauth2/auth?iframe=true&redirect_uri=" + i.redirect_uri + "&response_type=" + i.response_type + "&client_id=" + i.client_id + "&scope=" + i.scope + (i.prompt ? "&prompt=" + i.prompt : "") + (i.state ? "&state=" + i.state : "") + (i.org_type ? "&org_type=" + i.org_type : "") + (i.corpId ? "&corpId=" + i.corpId : "") + (i.exclusiveLogin ? "&exclusiveLogin=" + i.exclusiveLogin : "") + (i.exclusiveCorpId ? "&exclusiveCorpId=" + i.exclusiveCorpId : ""), c.width = "" + (e.width || 300), c.height = "" + (e.height || 300), c.frameBorder = "0", c.scrolling = "no", window.addEventListener("message", (function (e) {
                var t = e.data,
                    i = e.origin;
                    //这里这里-------------------------------看上面👆
                if (/login\.dingtalk\.com/.test(i) && t)
                    if (t.success && t.redirectUrl) {
                        var u = t.redirectUrl,
                            c = r(u, "authCode") || "",
                            d = r(u, "state") || "",
                            s = r(u, "error") || "";
                        c ? n && n({
                            redirectUrl: u,
                            authCode: c,
                            state: d
                        }) : o && o(s)
                    } else o && o(t.errorMsg)
            }))) : o && o("Browser not support")) : o && o("Element not found") : o && o("Missing parameters")
        }
    }
});

到了这里,关于使用钉钉的扫码会出现多个回调(DTFrameLogin)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 钉钉小程序生态3—钉钉扫码登录PC端网站

    钉钉小程序生态1—区分企业内部应用、第三方企业应用、第三方个人应用 钉钉小程序生态2—区分小程序和H5微应用 钉钉小程序生态3—钉钉扫码登录PC端网站 钉钉小程序生态4—钉钉小程序三方企业应用事件与回调 钉钉小程序生态5—钉钉群机器人消息通知和钉钉工作通知 钉

    2024年02月11日
    浏览(35)
  • vue3-pc端生成微信二维码、扫码支付监听支付回调(WebSocket)功能实现

    项目场景:后台系统中采购订单列表需要支持微信扫描支付功能,支付成功需要返回到订单列表。 调用接口接收后端返回数据, npm install qrcode --save 安装插件,处理返回数据生成二维码。 1. 后端接口返回数据如下: 2. 前端代码如下: 3. 效果图如下: 生成二维码功能到这就完

    2024年02月12日
    浏览(30)
  • (一)Qt下实现多个海康工业相机内触发采集回调取流显示

    提示:这里是该系列文章的所有文章的目录 第一章:(一)Qt下实现多个海康工业相机内触发采集回调取流显示 第二章:(二)Qt下多线程实现多个海康工业相机内触发采集回调取流显示 在我之前所记录的关于海康工业相机的系列文章中 ,讲述的是使用外触发采集模式中的

    2024年02月16日
    浏览(40)
  • (二)Qt下多线程实现多个海康工业相机内触发采集回调取流显示

    提示:这里是该系列文章的所有文章的目录 第一章:(一)Qt下实现多个海康工业相机内触发采集回调取流显示 第二章:(二)Qt下多线程实现多个海康工业相机内触发采集回调取流显示 在本系列的上一篇文章中,我们讲述了实现海康工业相机的连接,采用内触发采集模式,

    2024年02月16日
    浏览(33)
  • php对接微信公众号扫码登录开发实录(H5微信扫描登录、服务出现故障调试、模版消息设置、扫码轮询交互)

    微信公众号扫码登录在安全性、用户体验和数据收集方面优势明显,是目前许多应用程序采用的登录方式之一。 无需记住账号密码:用户无需输入和记住账号和密码,只需使用微信扫描二维码即可快速登录。 安全性高:微信采用 OAuth2.0 协议,将用户信息传递给第三方应用程

    2024年02月07日
    浏览(40)
  • 巧用回调函数解决微信小程序与后台数据交互出现的异步问题

            微信小程序端需要发送一个包含文字与图片的表单数据给后端,我一开始的思路是 先 上传图片得到临时的URL, 后 执行POST请求将表单数据发送给后端,但后端只能获取到文字,而图片URL却始终获取不到。         注意看我上面的思路, 一先一后 ,无形中将两

    2024年02月16日
    浏览(36)
  • AIGC+图片验证码会有什么效果?

    上个礼拜因为家里的老人有感而发,思考了验证码适老化方面的改造。最近在思考AIGC在验证码方面的应用。 传统的验证码,总的来说,因为通常是将数字、字母、符号等随机组合在一起,形成一个图像,要求用户输入其中的内容。这种方式对于人类用户来说比较容易识别,

    2024年02月08日
    浏览(21)
  • Flutter实现ControlExecutor进行多个异步任务执行时监听状态并可指定最后执行的异步并在指定的异步执行完毕后结束executor并回调。

    1.场景 当有多个接口请求时,且接口调用不是同时进行时,而且接口调用有可能时链式的,中间也有可能加入别的逻辑,但是需要在第一个接口调用时打开等待框,在最后一个接口调用完成时关闭等待框类似需求时,可以用到ControlExecutor进行接口执行过程的监听,并可标记最

    2024年02月09日
    浏览(24)
  • 解决centos出现多个ip或ip地址消失

    使用VMware Workstation创建虚拟机后,有时在挂起虚拟机恢复后,虚拟机会出现两个ip地址或者ip地址消失。为虚拟机设置静态ip可以解决这个问题。 不同虚拟机网卡配置文件名可能不同,一般是 ifcfg-ens33,可以通过 ifconfig 命令查看网卡名称: 确认好网卡名称后,编辑网卡配置文

    2024年02月15日
    浏览(33)
  • 【Elemnt-UI——el-popover点击出现多个弹框】

    效果图 解决 :append-to-body=\\\"false\\\" 添加这个属性就可以了

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包