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

方法一:企业微信构造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.hqwc.cn/news/285901.html

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

相关文章

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算…

探索拉普拉斯算子:计算机视觉中用于边缘检测和图像分析的关键工具

一、介绍 拉普拉斯算子是 n 维欧几里得空间中的二阶微分算子&#xff0c;表示为 ∇。它是函数梯度的发散度。在图像处理的上下文中&#xff0c;该运算符应用于图像的强度函数&#xff0c;可以将其视为每个像素具有强度值的二维信号。拉普拉斯算子是计算机视觉领域的关键工具&am…

“最美中国女生”——AI绘画还没上车的有难了!!!

废话少说&#xff0c;先上图&#xff01;&#xff01;&#xff01; 前段时间&#xff0c;ChatGPT生成了一张自诩为“最美的中国女生”。虽然审美是主观的&#xff0c;但不可否认&#xff0c;图片的客观美。不过——你不会还只是看到图片里的美女&#xff0c;肤浅地欣赏高颜值吧…

Java_正则表达式

正则表达式 接下来&#xff0c;我们学习一个全新的知识&#xff0c;叫做正则表达式。正则表达式其实是由一些特殊的符号组成的&#xff0c;它代表的是某种规则。 正则表达式的作用1&#xff1a;用来校验字符串数据是否合法 正则表达式的作用2&#xff1a;可以从一段文本中查找…

JavaOOP篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、一个java类中包含那些内容&#xff1f;二、那针对浮点型数据运算出现的误差的问题&#xff0c;你怎么解决&#xff1f;三、面向对象的特征有哪些方面?四、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff0…

springboot整合vue,将vue项目整合到springboot项目中

将vue项目打包后&#xff0c;与springboot项目整合。 第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-t…

luttuce(RedisTempate)实现hash(动态数据) expire lua脚本

话不多说先放脚本&#xff1a; local argv ARGV local length #argv if length > 0 then local unpackArgs {} for i 1, length - 1 dotable.insert(unpackArgs, argv[i]) end if redis.call(exists, KEYS[1]) 1 thenredis.call(del, KEYS[1])redis.call(hset, KEYS[…

Opencv C++ 绘制中文

零、源码 GitHub - ITC-AI/Opencv_Chinese: C 的 Opencv绘制中文 一、代码编写 参考 https://blog.csdn.net/long630576366/article/details/131440684 1、cvxFont.h #ifndef OPENCVUNICODE_CVXFONT_H #define OPENCVUNICODE_CVXFONT_H#include <ft2build.h> #inclu…

RabbitMQ入门指南(一):初识与安装

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消息队列介绍 1.同步调用和异步调用 2.常见消息队列介绍 二、RabbitMQ简介及其安装步骤 1.RabbitMQ简介 2.RabbitMQ安装步骤&#xff08;使用Docker&#xff09; (1) 创建网络 (2) 使用Docker来…

【LeetCode:1901. 寻找峰值 II | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

初识Python之Networkx模块

初识Python之Networkx模块 文章目录 初识Python之Networkx模块简介安装Networkx导入模块、查看版本信息一些基本操作创建Graph添加边&#xff08;节点&#xff09;获取Graph的基本信息Graph的基本绘图 简单应用案例使用内置的Graph数据创建一个无向图创建一个有向图在计算机网络…

LinuxCNC系统安装

首先我们需要准备一个U盘来安装系统&#xff0c;然后进入Debian官网。操作系统处&#xff0c;点击“下载Debian”。 如果需要下载其他比较全版本&#xff0c;可以点击“其他下载链接”&#xff0c;选择DVD的安装&#xff0c;因为是国外的网站&#xff0c;最好不要选择网络安装。…