前言:通过上一章配置测试公众号,初步实现了菜单调用网页的功能,本章主要讲如何获取到微信的用户信息。获取微信用户信息只要三步就可以实现。第一步配置菜单连接获取微信的code;第二步通过code、appId和appSecret获取access_token、openId;第三步,通过access_token、openId就可以获取到微信用户的信息了。大致步骤就是这样,下面来讲一下具体实现方式。
第一步:配置菜单连接获取微信的code
先提前拼接好调用的URL:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
这个是微信技术文档的URL实例,我们对这个URL修改的部分是参数,注意的点是redirect_uri是你自己的网页地址并且进行urlencode编译(附编译地址:http://tool.chinaz.com/Tools/urlencode.aspx),将自己的网址输入进去(例如:http://mysite.test.com/Home/GetWinXinInfo)点击“urlencode编码”。其他参数可参考下图(偷个懒,从微信技术文档上截的图)。
创建微信公众号-菜单按钮,链接为上面拼接好的URL,不会创建自定义菜单的同学可以看我写的第一篇微信公众号开发的文章最后一部分《微信公众号开发-测试号管理配置详解(.net版)》(https://www.cnblogs.com/hjxh/p/9947814.html)。
第二步和第三步结合:通过code、appId和appSecret获取access_token、openId,最终获取用户信息
通过菜单地址(例如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://mysite.test.com/Home/GetWinXinInfo&response_type=code&scope=snsapi_base&state=snsapi_userinfo#wechat_redirect,红色部分需要urlencode转译)调用获取具体实现代码如下:
public class HomeController : Controller { string appId = "wx4******a1"; string appSecret = "13a9f1*******1b21beb0"; /// <summary> /// 获取AccessToken /// </summary> /// <param name="code"></param> /// <param name="state"></param> public void GetWinXinInfo(string code, string state) { //获取AccessToken string getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code"; string getAccessTokenReponse = Get(getAccessTokenUrl); AccessTokenReponse modeAccessToken = JsonConvert.DeserializeObject<AccessTokenReponse>(getAccessTokenReponse); //获取用户信息 string getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + modeAccessToken.access_token + "&openid=" + modeAccessToken.openid + "&lang=zh_CN"; string getUserInfoReponse = Get(getUserInfoUrl); Response.Write(getUserInfoReponse); Response.End(); } public string Get(string url, string contentType = "application/json") { HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url); myRequest.Method = "Get"; myRequest.ContentType = contentType; myRequest.Proxy = null; using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse()) { using (StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } } }
方法所需要的实体
public class AccessTokenReponse { public string access_token { get; set; } public int expires_in { get; set; } public string refresh_token { get; set; } public string openid { get; set; } public string scope { get; set; } }
总结:通过本章节,最终可以获得微信用户的相关信息,关于微信用户的相关信息注意的一点是unionid,如果公众号没有绑定到微信开放平台,则此参数为Null。建议保存unionid,因为此参数是针对与微信开放平台生成的,微信开放平台可以挂接多个公众号,一个微信针对一个开发平台unionid只有一个,而openid会有多个(逻辑如下图),若需求上有多公众号联合登陆的,可以通过验证unionid进行实现。