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

文章导航

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

第一部分、准备材料🌲

1.公网环境

老版钉钉扫码中必须要配置一个域名才可以调试,新版支持IP配置调了。我是手机打开热点,电脑连接热点进行调试的,比老版要方便了不少。

查看本机IP地址方法:
如果使用的Windows,执行命令:ipconfig

如果使用的Mac,执行命令:ifconfig en0

2.创建一个小程序(企业内应用即可)

这个小程序可以是H5微应用也可以是小程序,但需要是企业内应用。
将创建后的小程序appKey和appSecret复制后保存下来。

在这里插入图片描述

3.搭建SpringBoot项目

目录结构如下:
在这里插入图片描述

注意:resources中的目录结构和文件名一定要和我的一致,不能多不能少,否则会出现启动报错或者找不到文件的问题。

第二部分、环境配置⚙

1.SpringBoot项目pom.xml

这里我引入了VM模板用来放置扫码页与首页的html代码,引入DingTalk调用三方接口获取扫码用户的基本信息。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>SpringBoot-DDScan</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringBoot-DDScan</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- dingding --><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>1.1.1</version><exclusions><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion></exclusions></dependency><dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>1.2.5</version></dependency><!-- VM 模板 --><dependency><groupId>com.alibaba.boot</groupId><artifactId>velocity-spring-boot-starter</artifactId><version>1.0.4.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.SpringBoot项目application.properties

spring.application.name=dd-scan
server.port=8080## 小程序AppID和AppSecret(此处填入自己复制的)
qr.appId=xxxx
qr.appSerret=xxxx# Velocity\u914D\u7F6E\uFF0C\u8BE6\u89C1 http://gitlab.alibaba-inc.com/middleware-container/pandora-boot/wikis/spring-boot-velocity
spring.velocity.resource-loader-path=classpath:/velocity/templates
spring.velocity.toolbox-config-location=/velocity/toolbox.xml
spring.velocity.layout-url=/velocity/layout/default.vm

3.钉钉开放平台-登录与分享配置回调域名

这里的回调地址就是扫码后跳转的地址。这里的地址与下面login.vm中的window.url 一定要一模一样,否则会扫码会弹出”回调域名配置错误“的提示。
在这里插入图片描述

4.钉钉开放平台-权限管理授权

选择:个人手机号信息、成员信息读权限权限即可
在这里插入图片描述

第三部分、代码📚

1.后端代码

(1)SpringBootDdScanApplication.java

package com.example.springbootddscan;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootDdScanApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDdScanApplication.class, args);}}

(2)MainController.java

package com.example.springbootddscan.controller;import com.aliyun.dingtalkcontact_1_0.models.GetUserHeaders;
import com.aliyun.dingtalkcontact_1_0.models.GetUserResponse;
import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/login")
public class MainController {@Value("${qr.appId}")private String qrAppId;@Value("${qr.appSerret}")private String qrAppSecret;@GetMapping("/toLoginPage")public ModelAndView toLoginPage() {return new ModelAndView("login");}@GetMapping("/scanLogin")public ModelAndView scanLogin(@RequestParam String authCode) throws Exception {//获取当前小程序的accesstokenGetUserTokenResponse userTokenResponse = getUserAccessToken(qrAppId, qrAppSecret, authCode, "authorization_code");//查询当前用户信息GetUserResponse me = getUserWithOptions(userTokenResponse.getBody().getAccessToken(), "me");//获取首页模板ModelAndView modelAndView = new ModelAndView("index");modelAndView.addObject("userid",me.getBody().getOpenId());modelAndView.addObject("userName",me.getBody().getNick());modelAndView.addObject("userPhone",me.getBody().getMobile());return modelAndView;}public GetUserResponse getUserWithOptions(String accessToken, String unionId) throws Exception {// 准备请求配置参数Config config = new Config();// 设置请求协议config.protocol = "https";// 设置请求区域config.regionId = "central";// 初始化账号Clientcom.aliyun.dingtalkcontact_1_0.Client client = new com.aliyun.dingtalkcontact_1_0.Client(config);GetUserHeaders getUserHeaders = new GetUserHeaders();getUserHeaders.xAcsDingtalkAccessToken = accessToken;return client.getUserWithOptions(unionId, getUserHeaders, new RuntimeOptions());}public GetUserTokenResponse getUserAccessToken(String suiteKey, String suiteSecret, String authCode, String grantType) throws Exception {// 准备请求配置参数Config config = new Config();// 设置请求协议config.protocol = "https";// 设置请求区域config.regionId = "central";// 初始化账号Clientcom.aliyun.dingtalkoauth2_1_0.Client client = new com.aliyun.dingtalkoauth2_1_0.Client(config);GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest().setClientId(suiteKey).setClientSecret(suiteSecret).setCode(authCode).setGrantType(grantType);return client.getUserToken(getUserTokenRequest);}
}

2.前端代码

(1)login.vm

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>钉钉扫码登录</title>
</head>
<body>
<!-- 方案二 ,该方法依赖jquery库-->
<script src="https://g.alicdn.com/dingding/h5-dingtalk-login/0.21.0/ddlogin.js"></script>
<script><!-- 获取到的IP地址 -->window.url = 'http://xxx.xx.xxx.xx:8080/login/scanLogin'<!-- 小程序的appId -->window.appid = 'xxxx'
</script>
<!-- STEP1:在HTML中添加包裹容器元素 -->
<div id="self_defined_element" class="self-defined-classname"></div>
<style>/* STEP2:指定这个包裹容器元素的CSS样式,尤其注意宽高的设置 */.self-defined-classname {width: 300px;height: 300px;}
</style>
<script>// STEP3:在需要的时候,调用 window.DTFrameLogin 方法构造登录二维码,并处理登录成功或失败的回调。window.DTFrameLogin({id: 'self_defined_element',width: 300,height: 300,},{redirect_uri: encodeURIComponent(window.url),client_id: window.appid,scope: 'openid',response_type: 'code',state: 'test',prompt: 'consent',},(loginResult) => {console.log(loginResult)const {redirectUrl, authCode, state} = loginResult;// 这里可以直接进行重定向window.location.href = redirectUrl;// 也可以在不跳转页面的情况下,使用code进行授权console.log(authCode);},(errorMsg) => {// 这里一般需要展示登录失败的具体原因alert(`Login Error: ${errorMsg}`);},);
</script>
</body>
</html>

(2)index.vm

<h1>首页</h1>
<h2>userid: ${userid}</h2>
<h2>用户名: ${userName}</h2>
<h2>手机号码:${userPhone}</h2>

3.其他文件

(1)toolbox.xml

<?xml version="1.0" encoding="UTF-8"?><tools><data type="number" key="TOOLS_VERSION" value="2.0"/><data type="boolean" key="GENERIC_TOOLS_AVAILABLE" value="true"/><toolbox scope="application"><tool class="org.apache.velocity.tools.generic.AlternatorTool"/><tool class="org.apache.velocity.tools.generic.ClassTool"/><tool class="org.apache.velocity.tools.generic.ComparisonDateTool"/><tool class="org.apache.velocity.tools.generic.ConversionTool"/><tool class="org.apache.velocity.tools.generic.DisplayTool"/><tool class="org.apache.velocity.tools.generic.EscapeTool"/><tool class="org.apache.velocity.tools.generic.FieldTool"/><tool class="org.apache.velocity.tools.generic.MathTool"/><tool class="org.apache.velocity.tools.generic.NumberTool"/><tool class="org.apache.velocity.tools.generic.ResourceTool"/><tool class="org.apache.velocity.tools.generic.SortTool"/><tool class="org.apache.velocity.tools.generic.XmlTool"/></toolbox><toolbox scope="request"><tool class="org.apache.velocity.tools.generic.ContextTool"/><tool class="org.apache.velocity.tools.generic.LinkTool"/><tool class="org.apache.velocity.tools.generic.LoopTool"/><tool class="org.apache.velocity.tools.generic.RenderTool"/><tool class="org.apache.velocity.tools.view.CookieTool"/><tool class="org.apache.velocity.tools.view.ImportTool"/><tool class="org.apache.velocity.tools.view.IncludeTool"/><tool class="org.apache.velocity.tools.view.PagerTool"/><tool class="org.apache.velocity.tools.view.ParameterTool"/><tool class="org.apache.velocity.tools.view.ViewContextTool"/><!--This is not directly useable.<tool class="org.apache.velocity.tools.view.AbstractSearchTool"/>--><!-- move this to request scope --><tool class="org.apache.velocity.tools.generic.ResourceTool"/><!--This is not useful in its default form.But, if it were, it'd be request-scoped.<tool class="org.apache.velocity.tools.generic.ValueParser"/>--></toolbox>
</tools>

(2)default.vm

$!{screen_content}

第四部分、演示🍓

1.输入登录地址

http://xxx.xxx.xxx.xxx:8080/login/toLoginPage

这里记住一定要用IP,不能使用localhost或者127.0.0.1,否则即使二维码能出现,扫码完也不会有反应。
在这里插入图片描述

2.使用钉钉扫码

扫完码后钉钉会弹出一个授权页,点击同意即可。

在这里插入图片描述

3.钉钉回调地址进入首页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llcMLSRh-1670244714400)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bbbfd463657841febc7bed7e481ce3b5~tplv-k3u1fbpfcp-watermark.image?)]

第五部分、原理解释

钉钉文档链接:https://open.dingtalk.com/document/orgapp-server/tutorial-obtaining-user-personal-information

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/47961.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钉钉dingtalk=6.3.5版本RCE复现

看到网上公开了钉钉RCE的利用方式&#xff0c;第一时间来复现一下。 钉钉dingtalk6.3.5版本RCE复现 免责声明&#xff1a; 影响版本&#xff1a;漏洞POC&#xff1a;漏洞复现&#xff1a;存在漏洞版本下载地址&#xff1a; 免责声明&#xff1a; 本文章仅供学习和研究使用&am…

企业版移动端钉钉对接

企业版手机端钉钉对接&#xff1a; 作为后台我把钉钉理解成了一个特殊的浏览器。 dingding文档https://open-doc.dingtalk.com/?spma219a.7629140.0.0.o6fMoq 这个文档的开发者接入里有对应的接口&#xff0c;也就是你访问对应url&#xff0c;dingding会回复对应的信息&…

钉钉桌面版(dingtalk)介绍:支持Linux、Windows和macOS平台

钉钉桌面版&#xff08;dingtalk&#xff09;介绍&#xff1a;支持Linux、Windows和macOS平台 钉钉桌面版&#xff08;dingtalk&#xff09;&#xff0c;它基于electron及钉钉网页版开发的跨平台桌面版钉钉&#xff0c;支持Linux、Windows和macOS平台。以下是关于钉钉桌面版&am…

亚马逊新手卖家如何快速出单必掌握的运营技巧分享?

对于一个新开店铺(或者说账号)来说,前90天是卖家运营的黄金时段,亚马逊会给予一定的流程扶持。因此,这段时间也被称之为“亚马逊黄金90天”。本周亚马逊运营知识时间,船长BI将围绕“新手卖家的黄金90天”和大家一起探讨有关亚马逊新手卖家的入门指南,帮助你更好地把握好…

亚马逊如何提高商品listing转化率?测评自养号优势和技巧有哪些?

之前有讲过&#xff0c;亚马逊店铺流量的几大入口&#xff0c;如何获取流量。那么获取了流量之后&#xff0c;亚马逊卖家就需要考虑到转化率的问题&#xff0c;如果流量来没有转化率&#xff0c;一样不会产生订单。如果转化率太低还会影响到商品的表现&#xff0c;比如排名会下…

跨境电商平台运营知识:亚马逊日常运营技巧

亚马逊运营是一个综合性很强的职业&#xff0c;有非常多的亚马逊运营技巧需要去学习&#xff0c;下面海熹跨境人才网整理亚马逊日常八大运营技巧&#xff0c;一起来学习一下吧。 1.首页 进行CPC时&#xff0c;关键词的转换率越高&#xff0c;排名就会提高得越快。因此人为刷单的…

财富自由、技术瓶颈、面试技巧,找另一半...这些程序员最关心的问题,AI的回答神了!

距离ChatGPT发布已经好几周了&#xff0c;我还沉迷在和它的聊天当中&#xff0c;每天一遇到问题&#xff0c;我的第一反应就是先问问ChatGPT的建议&#xff0c;作为一名程序员&#xff0c;我们可能有很多问题或困惑&#xff0c;我也问问了它&#xff0c;整理了一些比较有代表性…

手机总是显示服务器太忙,手机总提示服务器太忙请稍后重试

手机总提示服务器太忙请稍后重试 内容精选 换一换 使用MSTSC方式登录Windows云服务器时,系统报错提示“内部错误”。在本地主机以管理员身份运行cmd。执行netsh winsock reset重启本地主机。重试远程登录。如果仍无法登录云服务器,我们首先建议您排查本地的网络是否正常。更换…

微软和 OpenAI 在 LLM 竞争中脱颖而出

过去几周&#xff0c;微软、OpenAI、谷歌和其他组织发布了重大人工智能公告。科技公司正争先恐后地巩固其在快速扩展的大型语言模型 (LLM) 和生成 AI 市场中的地位。 随着大型科技公司继续向该领域投入更多资金&#xff0c;微软和谷歌之间的竞争逐渐两极分化。到目前为止&#…

高考作文AI大比拼「GPT-4 vs 文心一言 vs 通义千问」

2023 年 6 月 7 日上午&#xff0c;全国高考语文科目已经考试结束&#xff0c;第一时间拿到了全国甲卷的高考作文题目&#xff1a; 阅读下面的资料&#xff0c;根据需要写作 人们因技术发展得更好地掌控时间&#xff0c;但也有人因此成为了时间的仆人。 这句话引出了你怎样的联…

2023年湖北高考作文AI写

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 2023年湖北高考作文AI写 &#x1f9ca;摘要&#x1f9ca;原题&#x1f9ca;解析&#x1f9ca;AIGCInsCode AI 创作助手文心一言讯飞星火 SparkDeskChatGPT3.5 &#x1f9ca;摘要 本文…

TeeChart Pro VCL,提供高性能图表

TeeChart Pro VCL,提供高性能图表 TeeChart Pro VCL 允许您为所有领域(包括商业、工程、金融、统计、科学、医疗、实时和网络)创建通用和专用图表和图形应用程序。TeeChart Pro VCL 具有一个图表库&#xff0c;其中包含多种图表类型&#xff0c;包括 2D 或 3D 线、条、水平条、…

vue使用甘特图插件dhtmlx-gantt( 简单版)

一. 文档地址 官方文档 使用html生成的图表&#xff0c;样式修改会容易的多 二. 引用方式 yarn install dhtmlx-gantt import { gantt } from dhtmlx-gantt; // 引入dhtmlx-gantt <style> import dhtmlx-gantt/codebase/dhtmlxgantt.css; </style>三. 部分组成…

React Antv G2Plot 「指标拆解图」 前端可视化实战 实现渲染、重置、筛选功能

背景 实现对指定数据的「指标拆解图」 渲染&#xff0c;并且可以根据筛选项进行变化。 任务分解 antv 的图表&#xff0c;以及请求后端的载荷对传入的数据结构有严格要求 一个工具函数将后端接口返回的数据格式化成 antv 图表要求的格式一个工具函数将前端提交的请求数据格…

Unity数据可视化图表插件XCharts3.0发布

Unity数据可视化图表插件XCharts3.0发布 历时8个多月&#xff0c;业余时间&#xff0c;断断续续&#xff0c;XCharts3.0 总算发布了。如果要打个满意度&#xff0c;我给 3.0 版本来个80分。 对于代码框架结构设计的调整改动&#xff0c;基本符合预期&#xff0c;甚是满意。相比…

成为一名成熟优质的亚马逊运营,这几个能力你必须具备

亚马逊&#xff0c;目前全球最大的跨境电商平台&#xff0c;是真正意义上的全球电商鼻祖。亚马逊一年的销售规模接近或者超过1000亿美元亿以上&#xff0c;据数据显示&#xff0c;亚马逊是回购率最高的电商平台。说它是全球在线零售之王&#xff0c;也毫不为过。 面对这样一个充…

武汉星起航:深度剖析个人卖家在亚马逊上开店的流程

亚马逊是一个比较受欢迎的跨境电商平台&#xff0c;部分卖家想在亚马逊上开店&#xff0c;但是不知道开店流程。下面星起航将为大家介绍一下个人卖家怎么在亚马逊上开店&#xff0c;主要包括以下几个步骤&#xff1a; 创建亚马逊账户&#xff1a;访问亚马逊官网&#xff0c;点击…

进来看新手该怎么选择自己的第一个平台——shopee、lazada、速卖通版

很多新手在刚刚接触跨境电商的时候&#xff0c;都会卡在第一步选平台的问题。大家也逐渐开始意识到大平台其实不适合新手入局了&#xff0c;已经是大卖家们的市场。而且欧美市场最近也不太好做&#xff0c;开始把目光投向东南亚这边&#xff0c;今天龙哥就打算从三个东南亚市场…

亚马逊运营的三大关联销售入口你都清楚吗?

从亚马逊平台用户体验出发&#xff0c;你会发现&#xff0c;关联流量是非常重要的。 亚马逊关联流量和消费者的购买路径、消费者的流量路径、消费者购买习惯有关&#xff0c;另外与卖家站内广告投放也会影响关联结果。 对于亚马逊平台来说&#xff0c;将更多的产品推荐给消费…

亚马逊运营知识:亚马逊排名规则是怎么样的

亚马逊作为全球最大的电子商务平台&#xff0c;市场份额非常大&#xff0c;容易赚到钱。所以国内很多卖家都喜欢在亚马逊平台开店。电商平台&#xff0c;产品排名越高就越有优势&#xff0c;所以卖家都需要非常了解亚马逊排名规则。今天海熹跨境人才网就来给大家说说亚马逊排名…