业务操作最基础的一个功能是获取访客的身份,传统的获取方式是提供一个登录页面用以访客登录。

在微信企业号中,用户在微信中访问页面时,可以根据相关API获取此用户的微信账号信息,以此来匹配业务服务器存储的相关用户信息。

目录

1. 获取步骤

1.1 介绍

企业号的网页开发,说白了就是移动端web开发,特殊点在于如何获取微信用户的身份信息。

在企业号中可以进行如下步骤获取微信用户信息:

访问一个业务页面时,可通过OAuth验证接口获取此用户信息 → 根据code获取userId → 根据userId获取微信信息。

1.2 详细流程

① 获取code

说明:网页经过OAuth2.0验证后,重定向到原来网页并在url后面添加code信息。

如:http://akmsg.com/a.html => OAhth2.0 => http://akmsg.com/a.html?code=CODE&state=STATE

② 根据code获取userId

说明:调用此接口后将会获得 userId;注:userId为加密后的微信账号。

③ 根据userId获取微信信息

说明:调用此接口后将会获得此访问者在企业号登记的具体信息;如:姓名、微信号、手机号、邮箱、职位等等。

④ 根据微信信息获取逻辑用户信息

说明:从上一步骤获取的微信信息,可以用来跟业务逻辑进行匹配获取此用户在业务层中的用户信息。

1.3 流程图

2. 代码示例

2.1 代码(C#)

逻辑:Asp.net对客户端发送的请求进行判断,符合微信企业号页面规则的将进行微信企业号用户身份认证操作。

此功能对访问请求的三种情况进行分别判断:

1.第一次访问,没code :进行OAuth验证

2.有code,没cookie :获取code对应的信息

3.有code,有cookie :验证cookie

///

/// 验证微信访问

///

public static void Auth(HttpContext webContext)

{

string requestURL = webContext.Request.Url.AbsoluteUri;

try

{

// 用户访问微信页面有3种情况:

// 1.第一次访问,没code

// 2.有code,没cookie;

// 3.有code,有cookie

// 1.第一次访问,没code,没cookie:跳转到Oauth2.0认证

if (string.IsNullOrEmpty(webContext.Request["code"]))

{

string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect", CORPID, webContext.Server.UrlEncode(requestURL));

webContext.Response.Redirect(url, false);

}

else if (!string.IsNullOrEmpty(webContext.Request["code"]) && string.IsNullOrEmpty(CookieHelper.GetCookie("WXToken")))

{

// 2.有code,没cookie:根据code获取userID

string code = webContext.Request["code"];

string userId = "";

string userInfo = "";

#region 1)根据code获取userId

string url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token={0}&code={1}", GetAccessToken(), code);

string responseText = HttpHelper.Instance.get(url);

/*

API:http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3#.E6.A0.B9.E6.8D.AEcode.E8.8E.B7.E5.8F.96.E6.88.90.E5.91.98.E4.BF.A1.E6.81.AF

正确的Json返回示例:

{

"UserId":"USERID",

"DeviceId":"DEVICEID"

}

未关注企业号时返回:

{

"OpenId":"OPENID",

"DeviceId":"DEVICEID"

}

错误的Json返回示例:

{

"errcode": "40029",

"errmsg": "invalid code"

}

*/

WeChatUserCodeEntity codeEn = JsonHelper.GetEntity(responseText);

if (codeEn.errcode > 0)

{

throw new Exception(codeEn.errmsg);

}

else if (string.IsNullOrEmpty(codeEn.UserId))

{

throw new Exception("请先关注企业号!");

}

userId = codeEn.UserId;

#endregion

#region 2)根据userId获取用户信息

url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={0}&userid={1}", GetAccessToken(), userId);

responseText = HttpHelper.Instance.get(url);

/*

API:http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E6%88%90%E5%91%98#.E8.8E.B7.E5.8F.96.E6.88.90.E5.91.98

正确的Json返回示例:

{

"errcode": 0,

"errmsg": "ok",

"userid": "zhangsan",

"name": "李四",

"department": [1, 2],

"position": "后台工程师",

"mobile": "15913215421",

"gender": "1",

"email": "[email protected]",

"weixinid": "lisifordev",

"avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",

"status": 1,

"extattr": {"attrs":[{"name":"爱好","value":"旅游"},{"name":"卡号","value":"1234567234"}]}

}

错误的Json返回示例:

{

"errcode": "40029",

"errmsg": "invalid code"

}

*/

WeChatUserInfoEntity userInfoEn = JsonHelper.GetEntity(responseText);

if (userInfoEn.errcode > 0)

{

throw new Exception(userInfoEn.errmsg);

}

userInfo = responseText;

#endregion

// 3.把userInfo传入到cookie里

CookieHelper.SetCookie("WXToken", userInfo, -1);

}

else if (!string.IsNullOrEmpty(webContext.Request["code"]) && !string.IsNullOrEmpty(CookieHelper.GetCookie("WXToken")))

{

#region 3.有code,有cookie:校验cookie

// TODO:在上面进行存入cookie时可采用AES加密,在这部进行解密校验

// CookieHelper.SetCookie("WXToken", "", -1);

#endregion

}

else

{

throw new Exception("非授权访问!");

}

}

catch (Exception ex)

{

throw ex;

}

}

2.2 运行图

1) 用户已关注访问时

2) 用户不属于企业通讯录访问时

2.3 Dmeo下载(C#)

==================================系列文章==========================================

本篇文章:1.3 微信企业号 获取用户信息

php 获取企业号用户,微信企业号 获取用户信息(示例代码)相关推荐

  1. python代码怎么修改_python修改微信和支付宝步数的示例代码

    项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该python脚本可以帮你实现. 实现方法 手机安装第三方软件乐心健 ...

  2. python修改自己的代码_python修改微信和支付宝步数的示例代码

    项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该python脚本可以帮你实现. 实现方法 手机安装第三方软件乐心健 ...

  3. python用户管理系统模块_Django的用户模块与权限系统的示例代码

    一 导言 设计一个好的用户系统往往不是那么容易,Django提供的用户系统可以快速实现基本的功能,并可以在此基础上继续扩展以满足我们的需求. 先看看Django的用户系统都提供哪些功能: 提供用户模块 ...

  4. java获取当前tomcat线程pid_java 查看tomcat线程信息(示例代码)

    查看线程信息 标签: 线程 堆栈 信息 日志 tomcat 响应 tomcat有时候会遇到所有操作都响应很慢,或者一直没有响应的情况.如果这个时候通过日志无法看到错误信息.可能就不好分析问题出处. 这 ...

  5. ajax跨域获取cookie,ajax跨域获取cookie信息(示例代码)

    js脚本ajax请求 news.xxx.com 请求www.xxx.com获取登录状态信息 $.ajax({ type: "GET", url: 'http://www.xxx.c ...

  6. 058:vue+openlayers用moveend事件获取地图左上和右下的坐标信息(示例代码)

    第058个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers中使用extent,利用moveend事件获取地图左上和右下的坐标信息. 直接复制下面的 vue+openlayers ...

  7. html js获取天气预报,js 读取天气预报信息 示例代码(百度地图天气接口)

    [实例简介] [实例截图] [核心代码] 郑州市 - 天气预报 html,body{ width: 100%; height: 100%; margin: 0; text-shadow: 1px 0p ...

  8. Java获取上海期货交易所数据_上海期货交易所价格示例代码

    package api.binstd.silver; import api.util.HttpUtil; import net.sf.json.JSONArray; import net.sf.jso ...

  9. 微信公众平台服务器的官方示例代码,微信公众平台API接口(示例代码)

    简介 微信公众平台消息接口为开发者提供了一种新的消息处理方式.微信公众平台消息接口为开发者提供与用户进行消息交互的能力.对于成功接入消息接口的微信公众账号,当用户发消息给公众号,微信公众平台服务器会使 ...

最新文章

  1. 明日方舟抽卡模拟器wiki_明日方舟兑换码地址官服介绍 官服兑换码地址
  2. 挂载失败-日志中显示僵尸pod的问题
  3. Opportunity的status改为lost后,chance of success仍然为100的原因
  4. 7. SVM松弛变量
  5. 查看mysql日志post_(转)MySQL 日志组提交
  6. 如何查看电脑是几核几线程
  7. 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例TableBean---大数据之hadoop3.x工作笔记0129
  8. 第十六章:springboot 整合logback日志
  9. 易宝典——玩转O365中的EXO服务 之四十六 如何启用审核功能
  10. 【android原生态RPG游戏框架源码】
  11. 1. -vinc- = -vict- 胜利,征服
  12. 【现代信号处理】 15 - 谱分析基础和周期图谱分析
  13. 加州大学戴维斯分校 计算机科学,2020年加州大学戴维斯分校排名TFE Times美国最佳计算机科学硕士专业排名第43...
  14. python所有字母大写_在python中将所有字母改为大写
  15. Python入门——一个沙雕的表情包
  16. 搭建vpn linux,vpn在linux下搭建
  17. Linux centos7 代码运行时出现已放弃(吐核)的问题解决
  18. 《我和我的儿女们》:是否所有的不可理喻都情有可原?
  19. 蚂蚁队-冲刺日志(第1天)
  20. SSH整合过程中遇到的头秃问题

热门文章

  1. 【资源汇总分享】Android开发资源汇总之一
  2. H3C 多区域MSTP配置
  3. 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结
  4. action和servlet的关系
  5. HBase总结(十三)HBase Shell 常用命令及例子
  6. android studio下的NDK开发详解
  7. Hadoop源码分析-Context
  8. 算法:螺旋矩阵 ||
  9. BOOL,int,float,指针变量 与“零值”比较
  10. muduo之Socket和SocketsOps