#需求场景

一个.net开发的web应用接入到企业微信的应用中,实现微信用户点击应用,打开web,获取到用户信息,并实现自动登录功能。

#参考

企业微信官方API文档:https://work.weixin.qq.com/api/doc/90000/90135/91020

#具体步骤

1、获取access_token

获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。

  • 请求方式: GET(HTTPS)

  • 请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

    注:此处标注大写的单词ID和SECRET,为需要替换的变量,根据实际获取值更新。其它接口也采用相同的标注,不再说明。

  • 参数说明:

  • 权限说明:

    每个应用有独立的secret,获取到的access_token只能本应用使用,所以每个应用的access_token应该分开来获取

  • 返回结果:

{
"errcode": 0,
"errmsg": "ok",
"access_token": "accesstoken000001",
"expires_in": 7200
}

2、构造网页授权链接

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

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

  • 参数说明:

员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员工的userid。code长度最大为512字节。

  • 示例:

    假定当前企业CorpID:wxCorpId

    访问链接:http://www.wanwone.com?action=get

    根据URL规范,将上述参数分别进行UrlEncode,得到拼接的OAuth2链接为:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxCorpId&redirect_uri=http%3A%2F%2Fwww.wanwone.com%2Fcgi-bin%2Fquery%3Faction%3Dget&response_type=code&scope=snsapi_base&state=#wechat_redirect

注意,构造OAuth2链接中参数的redirect_uri是经过UrlEncode的

员工点击后,页面将跳转至

http://www.wanwone.com?action=get&code=AAAAAAgG333qs9EdaPbCAP1VaOrjuNkiAZHTWgaWsZQ&state=

企业可根据code参数调用获取员工的信息.

3、获取访问用户身份

该接口用于根据code获取成员信息

{
"errcode": 0,
"errmsg": "ok",
"UserId":"USERID",
"DeviceId":"DEVICEID"
}

b) 非企业成员授权时返回示例如下:

{
"errcode": 0,
"errmsg": "ok",
"OpenId":"OPENID",
"DeviceId":"DEVICEID"
}

#.Net具体代码

1、Web首页服务端代码

    protected void Page_Load(object sender, EventArgs e)
{
//获取配置信息(CorpId,Secret)
Dictionary<string, string> configs = GetConfig();
string access_token = Context.Cache["access_token"] as string;
if (!(Context.Request["code"] != null && Context.Request["state"] != null && Context.Request["state"].ToString() == "parasaga"))
{
if (access_token == null)
{
access_token = WXQYHelper.GetAccess_token(configs["CorpId"], configs["Secret"]);
//缓存到Cache
Context.Cache.Insert("access_token", access_token, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
} if (string.IsNullOrEmpty(access_token))
{
//获取token失败
}
else
{
string service = Context.Request.Url.GetLeftPart(UriPartial.Path);
//构造网页授权链接
string redirectUrl = WXQYHelper.GetAuthLink(configs["CorpId"], service);
//重定向到授权链接
Context.Response.Redirect(redirectUrl);
}
}
else
{
string code = Context.Request["code"].ToString();
//根据code获取访问用户身份
string uid = WXQYHelper.GetUserIdByCode(access_token, code);
if (string.IsNullOrEmpty(uid))
{
//获取失败
}
else
{
//获取成功
//进行应用本身的登录逻辑
}
}
}
public Dictionary<string, string> GetConfig()
{
Dictionary<string, string> configs = new Dictionary<string, string>(); string CorpId = System.Configuration.ConfigurationManager.AppSettings["CorpId"].ToString();
string Secret = System.Configuration.ConfigurationManager.AppSettings["Secret"].ToString();
configs.Add("CorpId", CorpId);
configs.Add("Secret", Secret);
return configs;
}

2、帮助类代码

    public class WXQYHelper
{
/// <summary>
/// 获取登陆标识access_token
/// </summary>
/// <returns></returns>
public static string GetAccess_token(string corpId,string secret)
{
string result = "";
try
{
//https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
string tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
var getStr = "corpid=" + corpId + "&corpsecret=" + secret;
result = Common.HttpWebRequest(tokenUrl, getStr, "GET");
}
catch (Exception e)
{
//PsLog.Error("获取登陆标识失败,返回结果:" + e.ToString());
return "";
}
//{
// "errcode": 0,
// "errmsg": "ok",
// "access_token": "accesstoken000001",
// "expires_in": 7200
//}
var jsonObj = (JObject)JsonConvert.DeserializeObject(result); var token = jsonObj["access_token"].ToString();
if (!string.IsNullOrEmpty(token))
{
return token;
}
else
{
return "";
}
}
/// <summary>
/// 构造网页授权链接
/// </summary>
/// <param name="corpId"></param>
/// <param name="appUrl"></param>
/// <returns></returns>
public static string GetAuthLink(string corpId,string appUrl)
{
string link = "";
//https://open.weixin.qq.com/connect/oauth2/authorize
//?appid=wxCorpId
//&redirect_uri=http%3a%2f%2fapi.3dept.com%2fcgi-bin%2fquery%3faction%3dget
//&response_type=code
//&scope=snsapi_base
//&state=#wechat_redirect
link = string.Format("{0}?appid={1}&redirect_uri={2}&response_type={3}&scope={4}&state={5}#wechat_redirect",
"https://open.weixin.qq.com/connect/oauth2/authorize",
corpId,
HttpUtility.UrlEncode(appUrl),
"code",
"snsapi_base",
"parasaga"
);
return link;
}
/// <summary>
/// 获取访问用户身份
/// </summary>
/// <param name="accessToken"></param>
/// <param name="code"></param>
/// <returns></returns>
public static string GetUserIdByCode(string accessToken, string code)
{
//https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE string result = "";
try
{
//https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
string tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo";
var getStr = "access_token=" + accessToken + "&code=" + code;
result = Common.HttpWebRequest(tokenUrl, getStr, "GET");
}
catch (Exception e)
{
//PsLog.Error("获取userid失败,返回结果:" + e.ToString());
return "";
}
//{
// "errcode": 0,
// "errmsg": "ok",
// "UserId":"USERID",
// "DeviceId":"DEVICEID"
//}
var jsonObj = (JObject)JsonConvert.DeserializeObject(result); var uid = jsonObj["UserId"].ToString();
if (!string.IsNullOrEmpty(uid))
{
return uid;
}
else
{
return "";
}
}
}

ASP.NET实现企业微信接入应用实现身份认证的更多相关文章

  1. 如何在ASP.NET Core中实现一个基础的身份认证

    注:本文提到的代码示例下载地址> How to achieve a basic authorization in ASP.NET Core 如何在ASP.NET Core中实现一个基础的身份认证 ...

  2. [转]如何在ASP.NET Core中实现一个基础的身份认证

    本文转自:http://www.cnblogs.com/onecodeonescript/p/6015512.html 注:本文提到的代码示例下载地址> How to achieve a bas ...

  3. asp.net mvc 5 微信接入VB版 - 接入认证

    微信接入官方文档是php的,网上被抄好几遍的代码是c#的,就是没vb的.今天我把这个坑填了,做vb版的接入认证. 首先是照着开发文档把微信接入的模型写好.在Models文件夹新建一个Model Pub ...

  4. asp.net mvc 5 微信接入VB版 - 获取AccessToken

    获取AccessToken是微信接入的又一个基础操作.很多微信接口需要这个2小时一刷新的AccessToken作为参数. 转载请说明作者Nukepayload2 首先根据开发文档把获取AccessTo ...

  5. Asp.Net Core 企业微信静默授权

    企业微信接口文档 1.构造授权网页链接 2.回调获取到 Code 通过code+access_token去请求用户信息 3.获取access_token 调试准备工作 -->内网穿透+域名 推荐 ...

  6. 在 ASP.NET Core 应用中使用 Cookie 进行身份认证

    Overview 身份认证是网站最基本的功能,最近因为业务部门的一个需求,需要对一个已经存在很久的小工具网站进行改造,因为在逐步的将一些离散的系统迁移至 .NET Core,所以趁这个机会将这个老的 ...

  7. ASP.NET Web API教程(六) 安全与身份认证

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  8. 企业微信的corpsecret在哪里?

      问题: 查看“企业微信”的官方开发文档,在“获取access_token”部分提到,使用GET请求方法,访问 https://qyapi.weixin.qq.com/cgi-bin/gettoke ...

  9. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

随机推荐

  1. 第四篇Scrum冲刺博客--Interesting-Corps

    第四篇Scrum冲刺博客 站立式会议 1.会议照片 2.队友完成情况 团队成员 昨日完成 今日计划 鲍鱼铭 搜索页面跳转.设计及布局实现 音乐详情页面跳转.设计及布局实现设计 叶学涛 编写设置页面 编 ...

  2. MPI聚合函数

    MPI聚合通信 MPI_Barrier int MPI_Barrier( MPI_Comm comm ); 所有在该通道的函数都执行完后,才开始其他步骤. 0进程在状态T1调用MPI_Barrier函 ...

  3. 安装openssl后yum不能使用的解决办法

    重新编译安装ioenssl后,发现yum命令不能使用,找到如下解决办法 提示错误是 openssl: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version ...

  4. 网站seo优化有什么优缺点

    http://www.wocaoseo.com/thread-94-1-1.html       seo是什么?这个可能是刚刚知道网络营销或搜索引擎营销的朋友们问的话,笔者在这里装一下,呵呵.说真的现 ...

  5. VUE+ElementUI创建项目

    1.官网下载node,安装node.js环境 安装完成后进入cmd,输入node -v和npm -v查看node和npm是否安装成功及对应的版本 2.全局安装vue-cli:cnpm install ...

  6. Qt 改变鼠标形状

    Qt 改变鼠标形状(转载) 改变鼠标形状,在绘制坐标系的时候有用到,特此记下: 1 this->setMouseTracking(true); //设置为不按下鼠标键触发moveEvent 2 ...

  7. Appium + Python App自动化第一个脚本

    今天跟大家讲解一个Appium和Python App自动化的脚本.[1]打开你的夜神模拟器(或者连接你的手机) [2]打开桌面的Appium [3]下载你要测的App的apk文件,放到桌面[4]拖动你 ...

  8. [PyTorch 学习笔记] 4.1 权值初始化

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson4/grad_vanish_explod.py 在搭建好网络 ...

  9. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  10. React.Fragment

    React 中一个常见模式是为一个组件返回多个元素.Fragments 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点. Fragments 看起来像空的 JSX 标签: render() ...