企业微信自动登录自定义系统

方法一:企业微信构造OAuth2链接跳转登录到自定义系统

企业微信自定义应用配置

  1. 构造网页授权链接

如果企业需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取code参数:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE&agentid=AGENTID#wechat_redirect

在这里插入图片描述
*注意,构造OAuth2链接中参数的redirect_uri是经过UrlEncode的*
在这里插入图片描述
2. 企业微信自定义应用配置

  • 设置可信域名,新应用首次配置需要下载可信用的txt文件上传到自定义系统服务器上,可信域名配置不支持ip地址
    在这里插入图片描述
    配置菜单调整链接
    在这里插入图片描述

  • 自定义系统配置
    前端根据跳转地址判断是不是企业微信跳转地址,根据code参数获取企业微信人员信息,userId对应企业微信的账号。
    后台使用 weixin-java-cp 插件

 /*** 获取企业微信访问用户身份* @param code* @param agentId* @param corpSecret* @return*/public static Map<String, Object>  getOauthUser(String code, int agentId, String corpSecret) {Map<String, Object> result = new HashMap<String, Object>();WxCpService wxCpService = getWxCpService(Wxperson.getCorpId(),agentId,corpSecret);try {WxCpOauth2UserInfo userInfo = wxCpService.getOauth2Service().getUserInfo(code);wxCpService.getJsapiTicket();if(null != userInfo) {result.put("code", "200");result.put("userId", userInfo.getUserId());result.put("deviceId", userInfo.getDeviceId());}} catch (Exception e) {e.printStackTrace();result.put("code", "500");result.put("message", e.getMessage());}return result;}

方法二:使用js-skd,可设置跳转到默认浏览器打开

  1. wx.config
    通过wx.config注入应用的权限,在index.html文件中通过 script 引入
    <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script><script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script><script src="https://wwcdn.weixin.qq.com/node/open/js/wecom-jssdk-1.3.1.js"></script>
  1. 前端增加企业微信登录页面wechatCPLogin.vue,后台构造OAuth2链接
<template><div></div>
</template>
<script setup lang="ts">
import { onMounted, ref, watch } from 'vue'
import { wechatConfig, getWechatOauth2Url } from '@/api/login'
import { HSoft } from '@/utils/hsoft'
import { useRouter } from 'vue-router'
import type { RouteLocationNormalizedLoaded } from 'vue-router'
import { ElMessage } from 'element-plus'const { currentRoute, push } = useRouter()const redirect = ref<string>('')const otherQuery = ref({})let wx =  window.wxconst userAgent = window.navigator.userAgent;watch(() => currentRoute.value,(route: RouteLocationNormalizedLoaded) => {redirect.value = route?.query?.redirect as stringotherQuery.value = getOtherQuery(route?.query)},{immediate: true}
)function getOtherQuery(query: any) {return Object.keys(query).reduce((acc: any, cur: any) => {if (cur !== 'redirect') {acc[cur] = query[cur]}return acc}, {})
}function getWeConfig() {console.log(window.navigator.userAgent,"HHHHH");//openDefaultBrowser()if(userAgent.includes('wxwork')) {if(userAgent.includes('Windows') || userAgent.includes('Mac')){let params = {// 当前网页的URL,不包含#及其后面部分,签名算法的时候会用到url: window.location.href.split("#")[0],agentId: HSoft.AGENTID,corpSecret: HSoft.CORPSECRET}wechatConfig(params).then(res => {console.log(res);const data = res.data;wx.config({beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: data.appId, // 必填,企业微信的corpID,必须是本企业的corpID,不允许跨企业使用timestamp: data.timestamp, // 必填,生成签名的时间戳nonceStr: data.nonceStr, // 必填,生成签名的随机串signature: data.signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法jsApiList: ['openDefaultBrowser'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来});wx.ready(function () {//执行你的业务逻辑代码//......//如果要使用到agent_config相关接口 初始化agentConfig配置openDefaultBrowser()    //getWechatAgentConfig()});wx.error(function (res) {console.log(res);// config信息验证失败会执行error函数,如签名过期导致验证失败// ,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,// 对于SPA可以在这里更新签名。});}).catch(err => {console.log(err)})}else{let params = {url: otherQuery.value['url'],agentId: HSoft.AGENTID,corpSecret: HSoft.CORPSECRET,state: 'wechatCP',}getWechatOauth2Url(params).then(res => {console.log(res);location.href = res.data.url;})}}else{push(`/login?unauto=true`)}
}function openDefaultBrowser(){let params = {url: otherQuery.value['url'],agentId: HSoft.AGENTID,corpSecret: HSoft.CORPSECRET,state: 'wechatCP',}getWechatOauth2Url(params).then(res => {console.log(res);//if((userAgent.includes('Windows') || userAgent.includes('Mac'))){wx.invoke('openDefaultBrowser', {// 在默认浏览器打开redirect_uri,并附加code参数;也可以直接指定要打开的url,此时不会附带上code参数。// 'url': "https://open.weixin.qq.com/connect/oauth2/authorize?appid=******&redirect_uri=http%3A%2F%2Fabc.com%3A6868%2Fwechat%2Fpc&response_type=code&scope=snsapi_userinfo&agentid=**&state=STATE#wechat_redirect"'url': res.data.url}, function(res){console.log('res------------->', res)if(res.err_msg != "openDefaultBrowser:ok"){//错误处理ElMessage.error("企业微信授权登录地址获取异常,请使用账号密码登录")push(`/login?unauto=true`)}else{wx.closeWindow();window.close();}})// }else{//     location.href = res.data.url;// }}).catch(err => {console.log(err)})}
onMounted(() => {getWeConfig();
})</script>

后台方法 wechatConfig

public static Map<String, Object> wechatConfig(String url, Integer agentId, String corpSecret) {Map<String, Object> result = new HashMap<String, Object>();WxCpService wxCpService = getWxCpService(Wxperson.getCorpId(),agentId,corpSecret);try {WxJsapiSignature createJsapiSignature = wxCpService.createJsapiSignature(url);if(null != createJsapiSignature) {result.put("code", "200");result.put("appId",createJsapiSignature.getAppId());result.put("timestamp",createJsapiSignature.getTimestamp());result.put("nonceStr",createJsapiSignature.getNonceStr());result.put("signature",createJsapiSignature.getSignature());}} catch (Exception e) {e.printStackTrace();result.put("code", "500");result.put("message", e.getMessage());}return result;}

getWechatOauth2Url

public static Map<String, Object> getWechatOauth2Url(String url, Integer agentId, String corpSecret, String state, String scope) {Map<String, Object> result = new HashMap<String, Object>();WxCpService wxCpService = getWxCpService(Wxperson.getCorpId(),agentId,corpSecret);try {String buildAuthorizationUrl = wxCpService.getOauth2Service().buildAuthorizationUrl(url, state, scope);if(HSoft.isNotEmpty(buildAuthorizationUrl)) {result.put("code", "200");result.put("url",buildAuthorizationUrl);}} catch (Exception e) {e.printStackTrace();result.put("code", "500");result.put("message", e.getMessage());}return result;}
  1. 剩余步骤参考方法一

企业微信扫码登录自定义系统

企业微信web登录

  1. 使用企业微信 JS-SDK:wecom/jssdk >=1.3.1
    通过 script 标签引入
<script src="https://wwcdn.weixin.qq.com/node/open/js/wecom-jssdk-1.3.1.js"></script>
  1. 创建企业微信登录面板
    API接口 ww.createWWLoginPanel
<!--企业微信扫码登录-->
<template><div id="wechatScanLogin" ></div>
</template><script setup lang="ts">
import { onMounted } from 'vue'
import { HSoft } from '@/utils/hsoft'// 初始化
const wwLogin = () => {window.ww.createWWLoginPanel({el: '#wechatScanLogin',params: {login_type: 'CorpApp',appid: HSoft.APPID,agentid: HSoft.AGENTID,redirect_uri: 'http://xxx.xxx.com:8088/login',state: 'loginState',redirect_type: 'callback',},onCheckWeComLogin({ isWeComLogin }) {  // 企业微信桌面端是否已登录console.log(isWeComLogin)},onLoginSuccess({ code }) {	// 企业微信登录成功回调 Auth Codeconsole.log({ code })//调用获取企业微信自动登录接口},onLoginFail(err) {console.log(err)},})
} onMounted( () => {wwLogin()
})</script>

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

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

相关文章

数据可视化---饼图、环形图、雷达图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

ubuntu18.04 升级到ubuntu22.04版本

要将 Ubuntu 18.04 LTS 升级到 Ubuntu 22.04 LTS&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 备份您的数据 在进行系统升级之前&#xff0c;建议备份所有重要数据&#xff0c;以防升级过程中出现任何问题。 2. 更新当前系统 确保您的 Ubuntu 18.04 系统是最新的。打…

【微服务】springboot整合minio详解

目录 一、前言 二、Minio 概述 2.1 Minio简介 2.1 Minio特点 三、Minio 环境搭建 3.1 部署过程 3.1.1 拉取镜像 3.1.2 启动容器 3.1.3 访问web页面 四、Minio基本使用 4.1 基本概念 4.2 上传文件演示 4.3 用户管理 4.4 Java操作Minio 4.4.1 导入依赖 4.4.2 上传…

MATLAB 平面拟合并可视化(34)

MATLAB 平面拟合并可视化(34) 一、效果二、代码一、效果 二、代码 % 生成三维点数据 x = rand(100, 1); y = rand(100, 1

Express及mongoose搭建数据库(增删改查)

express是什么&#xff1f; Express.js 是一个基于 Node.js 平台的 Web 应用程序框架&#xff0c;它旨在帮助开发者轻松构建和管理 Web 服务和应用程序。Express 提供了许多强大的功能&#xff0c;使得创建可扩展、灵活且高性能的 Web 应用变得相对容易。 安装Express步骤 确保…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候&#xff0c;需要使用灯控管理&#xff0c;在开始计时的时候打开灯&#xff0c;在结账后关闭灯&#xff0c;也有的不需要用灯控&#xff0c;只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明&#xff1a; 软件试用版下载或技术支…

【PostgreSQL】从零开始:(七)PostgreSQL-Initdb命令初始化数据库

概述 initdb是PostgreSQL初始化数据库的工具&#xff0c;用来生成PostgreSQL的Data目录结构 使用initdb 创建数据库集群时&#xff0c;会自动初始化区域设置支持。 initdb 默认情况下将使用其执行环境的区域设置来初始化数据库集群&#xff0c;因此&#xff0c;如果您的系统已…

LVS+Keepalived集群的介绍和搭建

目录 LVSKeepalived集群的介绍 Keepalived及其工作原理 Keepalived体系主要模块及其作用 一个合格的集群应该具备的特性 健康检查&#xff08;探针&#xff09;的方式 实验&#xff1a;搭建LVSKeepalived集群 实验准备 实验步骤 LVS 部署 配置节点服务器 实验验证 实…

【【UART 传输数据实验】】

UART 传输数据实验 通信方式在日常的应用中一般分为串行通信&#xff08;serial communication&#xff09;和并行通信&#xff08;parallel communication&#xff09;。 我们再来了解下串行通信的特点。串行通信是指数据在一条数据线上&#xff0c;一比特接一比特地按顺序传…

中英购物商城 中英文网店系统怎么选

中英文网店系统能帮助企业将商品卖到不同国家和地区&#xff0c;有效走出国门的工具&#xff0c;在选择中英购物商城时&#xff0c;需要考虑以下几个方面&#xff1a; 1、语言支持&#xff1a;选择一款能够支持中英文双语的购物商城系统是必要的&#xff0c;同时建议选择能确认…

feign返回参数为统一转化

原因&#xff1a;使用feign调用接口&#xff0c;接收的数据结构必须和报文返回的结构一样。返回报文中data是对象&#xff0c;用string接收会报错。 扩充&#xff1a;jackson进行反序列化时&#xff0c;如果类型参数是JavaType&#xff0c;则使用泛型接收时&#xff0c;泛型需…

工大智信智能听诊器:为您提供健康报告的私人健康管家

工大智信智能听诊器&#xff1a;为您提供健康报告的私人健康管家 工大智信智能听诊器在日常健康监测中扮演着重要的角色&#xff0c;它的出现为预防疾病提供了有力的支持。以下是工大智信智能听诊器在监测和预防疾病方面的重要性描述&#xff0c;以及它如何帮助用户及早发现健康…

数据结构--图(更新ing~)

树具有灵活性&#xff0c;并且存在许多不同的树的应用&#xff0c;但是就树本身而言有一定的局限性&#xff0c;树只能表示层次关系&#xff0c;比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中&#xff0c;数据元素之间的关系是任意的。 一、图…

[PTA]分寝室

学校新建了宿舍楼&#xff0c;共有 n 间寝室。等待分配的学生中&#xff0c;有女生 位、男生 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去&#xff0c;最后不能有寝室留空。 现请你写程序完成寝室的自动分配。分配规则如下&#xff1a; 男女生不能混住&…

如何去掉视频中不想要的水印,分享几个视频去水印技巧给你

如何去掉视频中不想要的水印&#xff1f;视频中的水印往往会遮挡画面&#xff0c;降低观看体验。本文将为您介绍三种方法&#xff0c;帮助您轻松去除视频中的水印&#xff0c;以便更好地欣赏和分享视频内容。 视频去水印技巧一&#xff1a;使用水印云 是一款操作简便、功能强大…

【C语言初阶】数组

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作…

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

图片速览 OOD用于零样本 OOD 检测的 CLIPN:教 CLIP 说不

PAPERCODEhttps://arxiv.org/pdf/2308.12213v2.pdfhttps://github.com/xmed-lab/clipn 文章创新 以往由CLIP驱动的零样本OOD检测方法&#xff0c;只需要ID的类名&#xff0c;受到的关注较少。 本文提出了一种新的方法&#xff0c;即CLIP说“不”&#xff08;CLIPN&#xff09;…

nlohmann json:通过json_pointer读取设置object/array

通过json_pointer可以不必一层一层的读取或设置json值,可以直接完成。 其实json类似一个树,可以通过从根节点/开始,指定每一个节点及叶子节点的名字,然后直接访问json数据: #include <iostream> #include <nlohmann/json.hpp> using namespace std; using j…

计算机基础,以及实施运维工程师介绍

目录 一.实施&#xff0c;运维工程师介绍 1.什么是实施工程师&#xff1f; 实施工程师职责 2.什么是运维工程师&#xff1f; 运维工程师职责 3.实施运维需要的技术 数据库 操作系统 网络 服务器 软件 硬件 网络 二.计算机介绍 CPU 存储器 io 总线 主板 三.操…