asp.net 、C#实现微信企业号OAuth2认证
以微信企业号作为入口的应用,几乎都会遇到需要应用系统中个人信息和微信用户关联问题、从而进行其他业务处理。目前所做项目采取在企业号通讯录添加自定义字段存入应用系统用户信息表中唯一标识UserGuid进行关联。那么如何获取微信企业号通讯录存储的自定义字段、从而实现应用用户信息和微信账号关联?把实现方案大致整理一下,如有不足,还望指出:
1:在企业号通讯录内添加用户Guid唯一字段。
aaarticlea/png;base64,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AAAAgVHVuNcAdINqHAAARBxDrDIeeGWFrV7bf/7nf37++ed37dr1xBNPPPHEE7t27Xr++ecPHDgwmddANQ4AACKOVY0L3AzYarF99dVXn3/++cc9+Pu///uf//znk3Al3/72t//8z/+cahwAAEQZI5EtxDP5owA+ePXVV7u6uoSxff/73zvf3BkAACAASURBVH/55ZePHDly5MiRl19++fvf/754vqur69VXX53oKxEaRzUOAACijJHKFVtTjXt554NtD+582f9RP9za1vbgzpeb2b+J87+888G2rT9QnvnBd9ratv4g+GqW1ltRh9uxY8e+fftqX923b9+OHTtETY5qHAAAwERTXVPVs+jhmx9sbWvb+oPqg/07H2xz4cGd++X++3c+KB977G4e8IOtLi9t/YHLC/ICxDm9H8IYOHDggKi37du3z2ufffv2iX0OHDgwoRdDNQ4AAMBIZPOpXPu476o/2CosSdjZD2qlSdU2sb/1yN2xbLvYdjJfqXcS28MGngi+EKW473//+/V3E62rzz///IReDBoHAABgxDP5RHa8feOkT1XlycXLbBpn29/V+o7WaJzysL7GOWt0W3faDdLrDaABu3btevzxx19++eX6u7388suPP/74rl27JvRi0DgAAAAjlSvG0+PTOEuH1Jqct8Y5JG6/r2qc+shPNU428tqreMou+z3sDjx44oknHn/88SNHjtTf7ciRI48//vgTTzwxoReDxgEAABjJbDExvr5x+3c8YFW+Xqg+5dqI+cCO/Y79rWdcNU68fNTZ887c/YWavnEvKAc7njm6f8cDjlZa9V137NhRe8F/9md/Np5vZorhU+N+9rOfoXEAAACTgJHI5lsz4cj+nVt3WJWxGi+rlagHpWOpP1u8YBXtHmize5tV1nvAqsapLvjC1gcffLBt6wuKCr6wtc3+Jvt3ON7VYXI4nAPRqLp/f4MCZmsbVb/tzZ//+Z8/+uijQf8FAQAABEarNG7/DkviXAxJqNoDqudZD2z1udry3QtuXdjczU++uHXnC1Wre2Hrgzv3y7dX/dLFNS2Tw+Fq8TnE4bnnnmvhEAc0DgAAwAsjlWtPZovjvNfaWje3vtCoGveDmt3rVuPccG+HFS/tfPCBHfvt57TqdtbzLq559OjRozt27MDhXGHCEQAAgFDRknnjXtgqu7kJPMpr1V2E9HnW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" alt="" />
2:创建应用并启用回调模式
aaarticlea/png;base64,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" alt="" />
3:以微信为入口的应用验证用户的方法,首先在用户访问应用主页时判断Cookie是否有UserGuid信息,如果没有则调用微信OAuth2认证接口。redirectUrl参数是回调页面地址,通过认证后会返回redirectUrl?code=XXXX信息。注:RedirectUrl回调地址必须是外网可以访问的。
if (Request.Cookies["UserGuid"] == null)
{
string httpUrl =
"https://open.weixin.qq.com/connect/oauth2/authorize?appid=XX&redirect_uri=URL&response_type=code&scope=snsapi_base&state=";
Response.Redirect(httpUrl);
}
else
{
//TODO 获取userguid之后处理步骤 Request.Cookies["UserGuid"].ToString(); }
4:回调页面处理思路
4.1首先获取通过认证后的Code参数,之后根据企业号的CorpID和Secret获取AccessToken。
Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
成功时返回:
{
"access_token": "XXX…………",
"expires_in": 7200
}
4.2获取token之后,根据code和accesstoken字符串参数获取微信用户信息,accesstoken7200秒内有效,code参数五分钟内有效且仅能使用一次。
Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
验证为企业成员时返回
{
"UserId":"USERID",
"DeviceId":"DEVICEID"
}
请求失败时返回
{
"errcode": "40029",
"errmsg": "invalid code"
}
4.3获取UerID之后,根据access_token和UerID获取用户通讯录中信息。自定义字段在extattr属性中。
Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=UerID
成功时返回
{
"errcode": 0,
"errmsg": "ok",
"userid": "zhangsan",
"name": "XX",
"department": [2],
"position": "XX",
"mobile": "XX",
"gender": "1",
"email": "XX",
"weixinid": "XX",
"avatar": "XX",
"status": 1,
"extattr": {"attrs":[{"name":"用户自定义字段名","value":"自定义字段值"}]}
}
4.4获取用户自定义字段UserGuid后存入cookie,并返回应用主页面。主页面此时验证Cookie,userguid信息。
5:回调页面代码C#
protected void Page_Load(object sender, EventArgs e)
{ try
{
//1.微信主页判断是否存在Cookie信息,如果存在则不需要再次验证
//2.如果不存在,则跳转到微信OAuth统一认证页面认证,之后到此页面获取用户信息存入Cookie返回主页
//3.获取Code,此code只能使用一次。
string code = Request["code"]; //4.根据企业ID:XX,Secret:XXX,获取token
string accessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
string accessTokenResult = HttpGet(accessTokenUrl, "corpid=XX&corpsecret=XXXX");
JavaScriptSerializer js = new JavaScriptSerializer();
token mytoken = js.Deserialize<token>(accessTokenResult);
string tokenValue = mytoken.access_token; //5.获取UserInfo,包含userId
string userinfoUrl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo";
string userinfojson = HttpGet(userinfoUrl, "access_token=" + tokenValue + "&code=" + code);
userinfo userinfo1 = js.Deserialize<userinfo>(userinfojson);
string UserId = userinfo1.UserId; //6.根据userId获取通讯录中用户的详细信息
string userinfodetailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get";
string userinfodetailResult = HttpGet(userinfodetailURL, "access_token=" + tokenValue + "&userid=" + UserId);
JObject jObject = (JObject)JsonConvert.DeserializeObject(userinfodetailResult);
JObject ja = (JObject)JsonConvert.DeserializeObject(jObject["extattr"].ToString());
JArray jObject1 = (JArray)JsonConvert.DeserializeObject(ja["attrs"].ToString());
//txtReturn2.Text = ja[0]["MainOrganization"].ToString(); //测试结果
//Response.Write("1:token:" + accessTokenResult + "<br/>2:tokenValue:" + tokenValue + "<br/>3:code:" + code + "<br/>4:userinfojson:" + userinfojson + "<br/>5.UserId:" + UserId + "<br/>6.userinfodetailResult:" + userinfodetailResult + "<br/>7:数组:" + jObject1[0]["value"].ToString()); //7.将Guid存入cookie
string userguid = jObject1[]["value"].ToString();
Response.Cookies["UserGuid"].Value = userguid;
Response.Cookies["UserGuid"].Expires = DateTime.Now.AddDays();
//todo:跳转到微信主页
Response.Redirect("XX", true);
}
catch (Exception ex)
{
//TODO 处理异常 }
}
/// <summary>
/// 发送HttpGet请求,返回string格式的json数据
/// </summary>
/// <param name="Url"></param>
/// <param name="postDataStr"></param>
/// <returns></returns>
public string HttpGet(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
6上面代码涉及到的两个类,为处理返回string类型的Json串,将json格式序列化为类。类的格式需和json保持一致。代码如下:
public class userinfo
{
public string UserId { get; set; }
public string DeviceId { get; set; }
} public class token
{ public string access_token { get; set; }
public int expires_in { get; set; } }
asp.net 、C#实现微信企业号OAuth2认证的更多相关文章
- 微信企业号OAuth2验证接口实例(使用SpringMVC)
微信企业号OAuth2验证接口(使用SpringMVC) 企业应用中的URL链接(包含自己定义菜单或者消息中的链接).能够通过OAuth2.0来获取员工的身份信息. 注意.此URL的域名,必须全然匹配 ...
- 微信企业号OAuth2.0验证接口来获取成员的身份信息
<?php $appid = "请输入您企业的appid"; $secret = "请输入您企业的secreat"; if (!isset($_GET[' ...
- .net之微信企业号开发(二) 企业号人员身份认证与开发
前言 这里完全可以链接一个登录页面,让用户输入用户名密码进行登录的...2333 但是,这样所就完全失去了微信企业号的意义,本来进入微信企业号的时候,就已经对人员身份进行认证了,你这里再让别人登录,不 ...
- 【Servlet】基于Jsp的微信Oauth2认证
作者:yongh701 挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台 ...
- Force.com微信企业号开发系列(一) - 启用二次验证
微信于9月份推出企业号后引起了业界不小的反响,许多企业都在思索企业号将如何影响企业的运营,从本文开始,我将详细阐述微信企业号开发的相关知识,而本文将着重介绍如何实现更高安全机制的二次验证. 申请企业体 ...
- 微信企业号SDK
1. 微信企业号SDK class class_wxqiye { var $corpid = CorpID; var $corpsecret = CorpSecret; var $agentid = ...
- 微信企业号 获取AccessToken
目录 1. AccessToken介绍 2. 示例代码 1. AccessToken介绍 1.1 什么是AccessToken AccessToken即访问凭证,业务服务器每次主动调用企业号接口时需要 ...
- C#开发微信门户及应用(20)-微信企业号的菜单管理
前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单 ...
- C#开发微信门户及应用(16)-微信企业号的配置和使用
在本系列随笔的前面,主要就是介绍微信公众号的门户应用开发,最近把整个微信框架进行了扩展补充,增加了最新的企业号的API封装和开发,后续主要介绍如何利用C#进行微信企业号的开发工作,本篇作为微信企业号的 ...
随机推荐
- replace函数结合正则表达式实现转化成驼峰与转化成连接字符串的方法
//连接符转成驼峰写法 function toCamel(str){ var reg=/-(\w)/g; return str.replace(reg,function(){ return argum ...
- nginx高性能WEB服务器系列之六--nginx负载均衡配置+健康检查
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- 由import javax.persistence.*;引用引发问题的思考(SpringBoot)
在学习SpringBoot的 JPA时候增加一个实体类的时候发现import包的时候一直报错. 对比一下,发现自己的项目里面是少了 spring-boot-starter-data-jpa.jar包的 ...
- 进阶篇:2.2)DFMA运用实例
本章目的:摘录一些DFMA运用的实例,可做参考. 1.DFMA的运用实例 DFMA提供了一个从装配和制造的角度去分析已给定设计的系统方法.采用这种方法可以使得产品结构更简单.性能更可靠.装配和制造的成 ...
- koa的中间件compose
用到的知识点: 1.bind函数 2.函数递归调用自身 3.promise 'use strict' /** * Expose compositor. */ module.exports = comp ...
- Shiro如何使用Ehcache实现Session共享
最近项目中用到的Session共享场景:两个独立应用,希望实现DB层共享用户,而且用户只需要登录一次. 分析:这种场合,不适用单点,因为用户数据并不需要单独在第三方应用管理,而且添加单点也会增加整个系 ...
- C#编写运行在Linux环境下的采用Mediainfo来获取多媒体文件信息的代码
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求调整为可以在Linux下运行,经过这两天的资料查找,实现了Linux下通过.NET来获取多 ...
- MySQL约束和修改数据表知识集结
一.约束 划分标准:功能.数据列的数目 功能: (1)NOT NULL(非空约束) (2)PRIMARY KEY(主键约束) (3)UNIQUE(唯一约束) (4)DEFAULT(默认约束) (5)F ...
- EasyNetQ自定义异常消息处理
20140310补充: rabbitmq有requeue属性,可以选择消息是否返回队列,另,本文的解决方式非常之山寨,只能应用于发送和接收方式. 这几天在折腾消息队列,在.Net环境下有基于Rabbi ...
- java中String,StringBuffer与StringBuilder的区别??
本文着重介绍下,应该在何时恰当的使用string,stringbuffer,stringbuilder. 1,执行速度 StringBuilder > StringBuffer > ...