业务操作最基础的一个功能是获取访客的身份传统的获取方式是提供一个登录页面用以访客登录。
在微信企业号中用户在微信中访问页面时可以根据相关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?codeCODESTATE
② 根据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}{1}codesnsapi_baseSTATE#wechat_redirect", CORPID, webContext.Server.UrlEncode(requestURL));
webContext.Response.Redirect(url, false);
}
else if (!string.IsNullOrEmpty(webContext.Request["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}{1}", GetAccessToken(), code);
string responseText HttpHelper.Instance.get(url);
/*
APIhttp://qydev.weixin.qq.com/wiki/index.php?titleOAuth%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}{1}", GetAccessToken(), userId);
responseText HttpHelper.Instance.get(url);
/*
APIhttp://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"]) 有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 微信企业号 获取用户信息