开发日志:企业微信实现扫码登录(WEB)

news2024/11/17 22:43:03

一:获取扫码登陆所需的参数:appid,secret,agentid

登录企业微信:https://work.weixin.qq.com/

扫码登录文档:https://work.weixin.qq.com/api/doc/90000/90135/90988

1:获取appid

点击我的企业就可以看到企业ID信息,这就是appid

 

2:获取secret和agentid

(1):点击应用管理-》点击创建应用

 

(2):应用创建完成之后我们就可以在应用中看到secret和agentid

2:配置企业微信授权登录

二:开发企业微信二维码登录功能

(1):开发企业微信二维码登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>企业微信扫码登录</title>
    <script src="http://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js"></script>
</head>
<body class="body">
    <div id="wx_reg" style="text-align: center;margin-top: 10%;">

    </div>

	<script>
		var wwLogin = new WwLogin({
			"id": "wx_reg",  
			"appid": "wwee5d37c708b1ecfb",
			"agentid": "1000020",
			"redirect_uri": encodeURIComponent('http://www.xxx.com/login/qywxlogin.ashx?type=qywxLogin'),
			"state": "lmg",
			"href":"",
		});
	</script>
</body>
</html>

(2):开发企业微信二维码登录回调  qywxlogin.ashx

<%@ WebHandler Language="C#" Class="qywxlogin" Debug="true" %>

using System;
using System.IO;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Web.SessionState;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Text;

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;

public class qywxlogin : IHttpHandler, IRequiresSessionState
{
    //企业微信
    public string appid = "";
    publi  string secret = "";
    public string PhyPath = "";
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", context.Session.SessionID));
        
        PhyPath = context.Server.MapPath("/");
        string type = context.Request["type"];
        switch(type) {
            case "qywxLogin": qywxLogin(context); break;
            default: context.Response.Write("非法访问"); break;
        }
        context.Response.End();
    }
    public void qywxLogin(HttpContext c){
    
        string state = c.Request["state"];
        string code = c.Request["code"]; 
    
        string url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+appid+"&corpsecret="+secret+"&debug=1";
        var token = HttpGet(url);
        if(!string.IsNullOrEmpty(token)) {
            JObject sk = JObject.Parse(token);
            if(sk["access_token"] != null) {
                string accessToken =sk["access_token"].ToString();
                url ="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+accessToken+"&code="+code+"&debug=1";
                var getuserinfo =HttpGet(url);
                JObject sk1 = JObject.Parse(getuserinfo);
                if(sk1["UserId"] != null) {
                    string UserId=sk1["UserId"].ToString(); //企业微信通讯录里的账户名称
                    string sql ="select * from [Base_Users] where WeixinID='"+UserId+"'";
                    DataTable dtW = DataBase.ExecuteTable(sql);
                    if(dtW != null && dtW.Rows.Count > 0) {
                        //写 session
                    }else{
               //绑定页面 c.Response.Redirect("qywxbind.html?WeixinID="+UserId); } }else{ c.Response.Write(getuserinfo); } }else{ c.Response.Write(token); } }else{ c.Response.Write("验证错误"); } } #region GET/POST public string HttpGet(string url) { StringBuilder builder = new StringBuilder(); builder.AppendLine("========================================================="); builder.AppendLine("url:" + url); string retString = string.Empty; try { string errMsg = string.Empty; HttpWebRequest wbRequest = (HttpWebRequest)WebRequest.Create(url); wbRequest.Method = "GET"; wbRequest.ContentType = "text/html;charset=UTF-8"; HttpWebResponse wbResponse = (HttpWebResponse)wbRequest.GetResponse(); using(Stream responseStream = wbResponse.GetResponseStream()) { using(StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"))) { retString = sReader.ReadToEnd(); } } builder.AppendLine(retString); } catch(Exception ex) { builder.AppendLine("errcode:" + ex.HResult); builder.AppendLine("errmsg:" + ex.Message); } LogWeChat(builder.ToString(), "Http"); return retString; } public string HttpPost(string url, string param = "", Dictionary<string, string> header = null,
     string contentType = "application/json") { StringBuilder builder = new StringBuilder(); builder.AppendLine("========================================================="); builder.AppendLine("url:" + url); builder.AppendLine("param:" + param); string data = ""; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = contentType; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; if(header != null && header.Count > 0) { foreach(var item in header) { request.Headers.Add(item.Key, item.Value); } } if(!string.IsNullOrWhiteSpace(param)) { byte[] byteData = UTF8Encoding.UTF8.GetBytes(param.ToString()); request.ContentLength = byteData.Length; using(Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); postStream.Close(); } } using(var response = request.GetResponse()) { StreamReader reader = new StreamReader(response.GetResponseStream()); data = reader.ReadToEnd(); } builder.AppendLine(data); } catch(Exception ex) { builder.AppendLine("errcode:" + ex.HResult); builder.AppendLine("errmsg:" + ex.Message); } LogWeChat(builder.ToString(), "Http"); return data; } #endregion #region Logging public void LogWeChat(string contents, string filename) { try { if(string.IsNullOrWhiteSpace(contents)) return; string msg = string.Format(@"{0}|{1}|" + filename + "|{2}" + Environment.NewLine, DateTime.Now, "", contents); string t = "logs"; string path = PhyPath + t; string logfile = path + "/wechat_" + filename + "_" + DateTime.Now.ToString("yyyyMMdd") + ".log"; if(!Directory.Exists(path)) { Directory.CreateDirectory(path); } File.AppendAllText(logfile, msg); } catch { } } #endregion public bool IsReusable { get { return false; } } }

(3):企业微信二维码登录(WEB)效果图:


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

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

相关文章

【AIGC】如何在使用stable-diffusion-webui生成图片时看到完整请求参数

文章目录 背景开搞使用遇到的问题 背景 通过代码调用Stable Diffusion的txt2img、img2img接口时&#xff0c;很多时候都不知道应该怎么传参&#xff0c;比如如何指定模型、如何开启并使用Controlnet、如何开启面部修复等等&#xff0c;在sd-webui上F12看到的请求也不是正式调用…

java生成验证码返回前端图片,后端通过redis存储和校验

目录 1.导入maven 2.编写config类 3.编写controller 4.验证 1.导入maven <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency> 2.编写config类 …

Mac 文件设置默认展示和排列方式

点击 现在默认展示方式是分栏方式&#xff0c;因我我勾选了 点击这里就可以修改 始终以xx打开&#xff0c;这里我选择了图标视图。 有快捷键 commandJ 修改默认配置。

烟雾文字动画效果

效果展示 CSS 知识点 transform 属性运用transform-origin 属性运用烟雾文字实现 整体页面结构布局实现 <section><p class"text">Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero dolorevoluptas incidunt exercitationem. Consecte…

编程初学者的“天然呆”时光

初学编程的时候&#xff0c;仿佛进入了一个全新的世界&#xff0c;兴奋之余难免迷茫。这个过程中&#xff0c;总是伴随着一些令人哭笑不得的“天然呆”瞬间。本文将回溯我刚开始学写代码时的一些愚蠢但难忘的经历&#xff0c;与读者分享那段独特的学习时光。 一、“Hello Worl…

【pv和pvc】

pv和pvc 一、存在原因二、存储卷分类一、emptyDir存储卷二、hostPath存储卷1.在 node01 节点上创建挂载目录2.在 node02 节点上创建挂载目录3.创建 Pod 资源4.访问测试5.删除pod&#xff0c;再重建&#xff0c;验证是否依旧可以访问原来的内容 三、nfs共享存储卷1.在stor01节点…

UE4 Unlua 初使用小记

function M:Construct()print(Hello World)print(self.Va)local mySubsystem UE4.UHMSGameInstanceSubsystemUE4.UKismetSystemLibrary.PrintString(self,"Get Click Msg From UnLua ")end unlua中tick不能调用的问题&#xff1a; 把该类的Event Tick为灰色显示的删…

Maven 构建配置文件

目录 构建配置文件的类型 配置文件激活 配置文件激活实例 1、配置文件激活 2、通过Maven设置激活配置文件 3、通过环境变量激活配置文件 4、通过操作系统激活配置文件 5、通过文件的存在或者缺失激活配置文件 构建配置文件是一系列的配置项的值&#xff0c;可以用来设置…

【面试经典150 | 哈希表】同构字符串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;哈希表 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内…

配电运维管理系统:电力数字化升级的关键

随着社会的快速发展和电力需求的增长&#xff0c;配电系统面临着越来越大的压力。为了确保电力供应的稳定性和可靠性&#xff0c;电力企业需要采用先进的管理系统&#xff0c;以提高配电运维的效率和质量。 一、配电运维管理系统的价值 配电运维管理系统通过集成了人工智能…

Nessus安装与使用_nessus安装使用教程

前言&#xff1a; Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&#xff0c;进行…

用jad反编译工具查看java接口相关的默认修饰符

接口抽象类复习 -> 默认修饰符是啥 -> jad反编译证明 https://www.cnblogs.com/changrunwei/p/6618117.html 文章目录 背景操作过程反编译前后对比操作截图结论 背景 今天刷到这篇文章&#xff0c;想起之前笔试题总是记不清&#xff0c;所以想证明下。 之前一直不清楚要…

d3dx9_39.dll如何修复?最新修复d3dx9_39.dll方法分享

大家好&#xff01;今天我要和大家分享的主题是“d3dx9_39.dll丢失的修复方法”。我们都知道&#xff0c;在使用电脑的过程中&#xff0c;经常会遇到各种问题&#xff0c;而其中最常见的就是文件丢失。d3dx9_39.dll就是其中一个常见的丢失文件。那么&#xff0c;如何修复这个丢…

Linux|软件安装包deb打包

参考&#xff1a; Ubuntu下的deb打包、安装与卸载 ubuntu打包软件 【Ubuntu】打包C程序及导出依赖库lib 文章目录 导出可执行程序依赖库安装打包工具创建工作目录设定安装的路径编写控制文件使用 dpkg 命令构建 deb包安装 deb包卸载deb包 导出可执行程序依赖库 在.out文件所在…

如何选择适合的Java服务器租用方案

随着共享经济的兴起&#xff0c;租车软件在如今的市场上变得越来越流行。但是&#xff0c;对于许多初创公司和开发者来说&#xff0c;了解开发一个租车软件所需的费用以及如何选择适合的Java服务器租用方案可能是一个挑战。本文将为您提供一些建议&#xff0c;以帮助您了解开发…

攻防世界题目练习——Web引导模式(一)

题目目录 1. command_execution2.xff_referer3.simple_js4.php_rce5.Web_php_include6.upload17. warmup 难度1全部写过了&#xff0c;这个系列里没有 指路&#xff1a; 攻防世界题目练习——Web难度1&#xff08;一&#xff09; 攻防世界题目练习——Web难度1&#xff08;二&a…

软件工程概论

文章目录 软件的定义软件的特点软件的种类软件工程的起源软件工程的三个阶段软件工程概念的提出软件开发的本质软件工程框架软件工程的目标软件工程的原则软件工程的活动 软件的定义 计算机系统中的程序及其文档。 程序是计算任务的处理对象和处理规则的描述&#xff1b; 文档…

Unity 引擎变身收费大亨,程序员们的钱包开始减肥计划

变天了&#xff01;Unity 引擎自 2024 年元旦起&#xff0c;要开始对我们开发者“开刀”了。别急&#xff0c;先听我慢慢道来这个悲欢离合的故事。 Unity 收费新政&#xff1a;别再白嫖了&#xff01; 喜大普奔&#xff01;Unity 引擎宣布从 2024 年 1 月 1 日开始&#xff0…

基于若依ruoyi-nbcio支持flowable流程分类里增加流程应用类型

主要考虑到流程分很多种&#xff0c;普通的是OA流程&#xff0c;还有自定义业务流程&#xff0c;钉钉流程等&#xff0c;所以这里加了一个appType的应用类型&#xff0c;以便后续对不同的应用流程做不同的处理。 1、首先增加一个字典wf_app_type的流程应用类型如下 2、先增加三…

【排序算法】插入排序

文章目录 一&#xff1a;基本概念1.1 介绍1.2 原理1.3 插入排序法思想 二&#xff1a;代码实现2.1 源码2.2 执行结果2.3 测试八万条数据 三&#xff1a;算法分析3.1 时间复杂度3.2 空间复杂度3.3 稳定性 一&#xff1a;基本概念 1.1 介绍 插入式排序属于内部排序法&#xff0…