我们在推送图文消息到企业微信应用的时候,通常在图文消息中会包含网页地址,往往需要用户输入账号密码进行登录,现在要做到不需要用户自己输入账号密码,后台自动验证用户身份登录
1.构造网页授权链接
需要构建一个这样结构的连接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
当用户在企业微信上点击这个链接时会先请求企业微信的api再跳转至redirect_uri并带上code,根据返回的code就可以获取用户身份了
参数 | 必须 | 说明 |
---|---|---|
appid | 是 | 企业的CorpID |
redirect_uri | 是 | 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
response_type | 是 | 返回类型,此时固定为:code |
scope | 是 | 应用授权作用域。企业自建应用固定填写:snsapi_base |
state | 否 | 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节 |
#wechat_redirect | 是 | 终端使用此参数判断是否需要带上身份信息 |
[AllowAnonymous]
public HttpResponseMessage Get()
{
//获取code
var allUrlKeyValues = ControllerContext.Request.GetQueryNameValuePairs();
string code = allUrlKeyValues.LastOrDefault(x => x.Key == "code").Value;
HttpResponseMessage resp = new HttpResponseMessage(HttpStatusCode.Moved);
if (string.IsNullOrEmpty(code))
{
string redirect_uri = Request.RequestUri.AbsoluteUri;
//构造回调连接
resp.Headers.Location = new Uri($"https://open.weixin.qq.com/connect/oauth2/authorize?appid={corpid}&redirect_uri={redirect_uri}&response_type=code&scope=snsapi_base&state=#wechat_redirect");
return resp;
}
//第一步,获取ACCESS_TOKEN
string access_token = get_access_token();
//第二步获取访问用户身份
string UserId = get_userid(access_token, code);
//Url.Request.RequestUri.
resp.Headers.Location = new Uri($"url?UserId={UserId}");
return resp;
}
获取access_token的方法get_access_token() 在上一篇文章.NET推送图文消息到企业微信应用中提到过
这里默认GET方式请求所以没加HttpGet特性
该回调只能在企业微信上进行,即只能在企业微信上点击链接
重定向到构造的回调连接后会返回code,通过code来获取用户id
2.获取用户ID
private string get_userid(string access_token, string code)
{
//第二步获取访问用户身份
string result = HttpHelper.GetUrlString(
httpUrl: $"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token={access_token}&code={code}",
isProxy: true);//开启代理
LogHelper.Debug(result);
var obj = JObject.Parse(result);
//取出用户ID
string UserId = obj["UserId"].ToString();
return UserId;
}
GetUrlString方法——获取请求地址内容,在之前的文章中提到过
获取用户ID之后可以另外进行处理,这里只是简单的将用户ID传到页面上,通常情况是不会这样做的
总结思路:连接地址直接到控制器,当用户点击企业微信应用上的连接时直接跳转到这个控制器,然后在控制器上构造网页授权链接进行回调,再通过code获取用户id
下一篇:使用.NET推送企业微信群聊消息