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

方法一:企业微信构造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.wx

const userAgent = window.navigator.userAgent;

watch(
  () => currentRoute.value,
  (route: RouteLocationNormalizedLoaded) => {
    redirect.value = route?.query?.redirect as string
    otherQuery.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 Code
        console.log({ code })
        //调用获取企业微信自动登录接口
      },
      onLoginFail(err) {
        console.log(err)
      },
    })
} 

onMounted( () => {
    wwLogin()
})

</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 向量相似搜索

Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档: 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(den…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5 参考文章&#xff1a; 《记录-下fedora 33安装deepin qq和微信 &#xff0c;不需要安装deepinwine》 https://tieba.baidu.com/p/7279470269 《opensuse使用virtualbox安装win10》 https://blog.c…

简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示

前言 在Web应用开发中&#xff0c;经常需要实现PDF文件的加载和显示功能。本文小编将为您介绍如何在ASP.NET Core中实现这一功能&#xff0c;以便用户可以在Web应用中查看和浏览PDF文件。 实现步骤 1&#xff09;在服务器端创建PDF 打开 Visual Studio 并创建新的 ASP. NET…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案&#xff1a;python PDF转图片pdf2image注意&#xff1a;poppler 安装 背景 最近接了一项目&#xff0c;主要的需求就是本地的文联单位&#xff0c;需要做一个电子刊物阅览的网站&#xff0c;将民族的刊物发布到网站上供…

Apipost检测接口工具的基本使用方法

&#x1f440; 今天言简意赅的介绍一款和postman一样好用的后端接口测试工具Apipost 专门用于测试后端接口的工具&#xff0c;可以生成接口使用文档官方下载网站&#xff1a;http://www.apipost.cn 傻瓜式安装—>register->项目->创建项目->APIs->新建目录&…

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

什么是DDOS攻击 DDoS攻击&#xff08;Distributed Denial of Service Attack&#xff09;即分布式拒绝服务攻击&#xff0c;是一种利用分布式网络来发起大量的请求&#xff0c;占用目标服务器或网络资源的攻击行为。这种攻击方式可以瘫痪目标系统&#xff0c;导致其无法正常提供…

springboot学习笔记(一)

本期内容&#xff1a; 1.springboot安装 2.springboot Hello world 1.springboot安装&#xff1a; 参考&#xff1a; springboot安装 Spring boot简介及安装 a. eclipse中打开help-->Eclipse Marketplace b. 在search栏目下&#xff0c;输入&#xff1a;spring-tool-…

Redis原理之网络模型笔记

目录 1. 阻塞IO 2. 非堵塞IO 3. IO多路复用 ​3.1 select 3.2 poll 3.3 epoll 4. 信号驱动IO 5. 异步IO 6. Redis是单线程还是多线程 Redis采用单线程模型&#xff0c;这意味着一个Redis服务器在任何时刻都只会处理一个请求。Redis的网络模型涉及到阻塞I/O&#xff08;Blo…

一天吃透Redis面试八股文

目录&#xff1a; Redis是什么&#xff1f;Redis优缺点&#xff1f;Redis为什么这么快&#xff1f;讲讲Redis的线程模型&#xff1f;Redis应用场景有哪些&#xff1f;Memcached和Redis的区别&#xff1f;为什么要用 Redis 而不用 map/guava 做缓存?Redis 数据类型有哪些&…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

【笑小枫的按步照搬系列】Windows下安装RabbitMQ,图文完整教程

笑小枫的专属目录 1. RabbitMq简介1.1 消息队列中间件简介1.2 什么是RabbitMQ 2. 安装准备工具2.1 百度网盘下载2.2 官网下载erlang2.3 GitHub下载RabbitMQ 3. 安装步骤3.1 erlang安装3.1.1 安装步骤图文讲解3.1.2 环境变量配置图文讲解 3.2 RabbitMq安装3.2.1 解压zip文件到执…

【LeetCode刷题笔记】位运算

231. 2 的幂 解题思路: 1. 除法 , 不断循环判断, 如果能被 2 整除,就不断除以 2 ,直到不能被 2 整除为止,最后结果如果是 1 ,说明可以除尽,是 2 的幂次方,否则就不是。 特判:

北斗三号短报文户外应急产品及应用方案

我国幅员辽阔物产丰富&#xff0c;各大地区生产线都有工人日夜躬耕投入生产&#xff0c;然而与无人区、无网络区域作业人员通信一直是难以解决的技术问题&#xff1b;通信链路不稳定、通信不畅&#xff0c;通信距离短&#xff0c;无法与无人区人员进行实时沟通&#xff0c;对于…

RabbitMQ 如何保证消息可靠性

RabbitMQ 如何保证消息可靠性 1. 保证生产者可靠1.1 生产者确认机制1.2 实现生产者确认1.2.1 开启生产者确认机制1.2.2 定义ReturnCallback1.3.3.定义ConfirmCallback 1.3 注意 2. 保证MQ可靠2.1 数据持久化2.1.1 交换机持久化2.1.2.队列持久化2.1.3 消息持久化2.1.4 注意 3. 保…

引领半导体划片机行业,实现钛酸锶基片切割的卓越效能

在当今快速发展的半导体行业中&#xff0c;博捷芯以其卓越的技术实力和精准的行业应用&#xff0c;脱颖而出&#xff0c;再次引领行业潮流。这次&#xff0c;他们将先进的BJX3356划片机技术应用于钛酸锶基片的切割&#xff0c;为半导体制造行业的进一步发展提供了强大的技术支持…

mysql中的server_id到底有什么用?详解mysql配置中的server_id配置项

当我们搭建MySQL集群时&#xff0c;自然需要完成数据库的主从同步来保证数据一致性。而主从同步的方式也分很多种&#xff0c;一主多从、链式主从、多主多从&#xff0c;根据你的需要来进行设置。但只要你需要主从同步&#xff0c;就一定要注意server-id的配置&#xff0c;否则…

YOLOv5改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)

一、本文介绍 本文给大家带来的改进是Triplet Attention三重注意力机制。这个机制&#xff0c;它通过三个不同的视角来分析输入的数据&#xff0c;就好比三个人从不同的角度来观察同一幅画&#xff0c;然后共同决定哪些部分最值得注意。三重注意力机制的主要思想是在网络中引入…

Gitlab仓库推送到Gitee仓库的一种思路

文章目录 Gitlab仓库推送到Gitee仓库的一种思路1、创建Gitee的ssh公钥&#xff08;默认已有Gitlab的ssh公钥&#xff09;2、添加Gitlab远程仓库地址3、添加Gitee远程仓库地址4、拉取Gitlab远程仓库指定分支到本地仓库指定分支&#xff08;以test分支为例&#xff09;5、推送本地…

Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?

Elasticsearch的分布式特性可能会导致写入操作的执行顺序与提交顺序稍有不同。在分布式环境中,Elasticsearch将数据分散到不同的节点上进行存储和处理,因此写入操作的执行顺序可能会受到网络延迟、负载均衡等因素的影响。 根源在于ES的分布式架构。如上图所示,客户端的命令首…

蓝桥杯嵌入式——KEY

CUBE里将这几个引脚配置成GPIO输入模式&#xff0c;再同时选中&#xff0c;配置成上拉&#xff0c;如下图&#xff1a; 同时配置定时器&#xff0c;定时10ms&#xff0c;每10ms扫描一次按键&#xff0c;计算公式&#xff1a;80 000 000 / 80 / 10000 100HZ 10ms&#xff0c;配…