微信公众号开发及时获取当前用户Openid及注意事项
目录
(一)微信公众号开发之VS远程调试
(二)微信公众号开发之基础梳理
(三)微信公众号开发之自动消息回复和自定义菜单
(四)微信公众号开发之网页授权获取用户基本信息
(五)微信公众号开发之网页中及时获取当前用户Openid及注意事项
前言
这篇主要是承接上篇的网页授权获取用户基本信息的后文,也是对第一种静默授权之后,用户点击公众号内链接时,如何再次取得当前用户的OpenId的大致讲解和一些注意事项。
看过上一篇的小伙伴都知道,我们在用户关注的时候就已经将该用户的基本信息存入数据库中,那么如果该用户过了很久才点击公众号内的网页链接,那么我们该如何再次获取这个唯一标识呢?
重新获取openid
具体实现
首先,我们定一个获取openid的方法 ReGetOpenId

- public static void ReGetOpenId()
- {
- string url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri;//获取当前url
- if (System.Web.HttpContext.Current.Session["openid"] == "" || System.Web.HttpContext.Current.Session["openid"] == null)
- {
- //先要判断是否是获取code后跳转过来的
- if (System.Web.HttpContext.Current.Request.QueryString["code"] == "" || System.Web.HttpContext.Current.Request.QueryString["code"] == null)
- {
- //Code为空时,先获取Code
- string GetCodeUrls = GetCodeUrl(url);
- System.Web.HttpContext.Current.Response.Redirect(GetCodeUrls);//先跳转到微信的服务器,取得code后会跳回来这页面的
- }
- else
- {
- //Code非空,已经获取了code后跳回来啦,现在重新获取openid
- Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
- string openid = "";
- openid = GetOauthAccessOpenId(System.Web.HttpContext.Current.Request.QueryString["Code"]);//重新取得用户的openid
- System.Web.HttpContext.Current.Session["openid"] = openid;
- }
- }
- }

注:url最好是带域名的,花生壳的域名是行不通的,再调微信平台接口的时候,会报链接不正确错误
上文中GetCodeUrl方法如下

- #region 重新获取Code的跳转链接(没有用户授权的,只能获取基本信息)
- /// <summary>重新获取Code,以后面实现带着Code重新跳回目标页面(没有用户授权的,只能获取基本信息(openid))</summary>
- /// <param name="url">目标页面</param>
- /// <returns></returns>
- public static string GetCodeUrl(string url)
- {
- string CodeUrl = "";
- //对url进行编码
- url = System.Web.HttpUtility.UrlEncode(url);
- CodeUrl = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Appid + "&redirect_uri=" + url + "?action=viewtest&response_type=code&scope=snsapi_base&state=1#wechat_redirect");
- return CodeUrl;
- }
- #endregion

上文中 GetOauthAccessOpenId方法如下

- #region 以Code换取用户的openid、access_token
- /// <summary>根据Code获取用户的openid、access_token</summary>
- public static string GetOauthAccessOpenId(string code)
- {
- Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
- string Openid = "";
- string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + Secret + "&code=" + code + "&grant_type=authorization_code";
- string gethtml = MyHttpHelper.HttpGet(url);
- log.log("拿到的url是:" + url);
- log.log("获取到的gethtml是" + gethtml);
- OAuth_Token ac = new OAuth_Token();
- ac = JsonHelper.ToObject<OAuth_Token>(gethtml);
- log.log("能否从html里拿到openid=" + ac.openid);
- Openid = ac.openid;
- return Openid;
- }
- #endregion

通过以上方法即可拿到用户的Openid,如上文所示,用户id保存在System.Web.HttpContext.Current.Session["openid"] 中,所以获取也是非常简单
在需要获取的地方执行
- #region 获取当前用户Openid
- ReGetOpenId();
- log.log("走完获取openid的方法之后,当前Session的值是:" + System.Web.HttpContext.Current.Session["openid"]);
- #endregion
因为无法使用一般的url,所以是把程序部署在服务器上,无法进行调试,只有打印日志查看效果,最后点击链接,日志如下:
日志文件
用到的简单日志类也顺便提供放上来:

- /// <summary>
- /// 日志类
- /// </summary>
- public class Log
- {
- private string logFile;
- private StreamWriter writer;
- private FileStream fileStream = null;
- public Log(string fileName)
- {
- logFile = fileName;
- CreateDirectory(logFile);
- }
- public void log(string info)
- {
- try
- {
- System.IO.FileInfo fileInfo = new System.IO.FileInfo(logFile);
- if (!fileInfo.Exists)
- {
- fileStream = fileInfo.Create();
- writer = new StreamWriter(fileStream);
- }
- else
- {
- fileStream = fileInfo.Open(FileMode.Append, FileAccess.Write);
- writer = new StreamWriter(fileStream);
- }
- writer.WriteLine(DateTime.Now + ": " + info);
- }
- finally
- {
- if (writer != null)
- {
- writer.Close();
- writer.Dispose();
- fileStream.Close();
- fileStream.Dispose();
- }
- }
- }
- public void CreateDirectory(string infoPath)
- {
- DirectoryInfo directoryInfo = Directory.GetParent(infoPath);
- if (!directoryInfo.Exists)
- {
- directoryInfo.Create();
- }
- }
- }

调用呢,很简单,调用方法如下:
- Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
- log.log("我会被输入在日志文件中")
最后呢,拿到当前用户Openid,就可以从数据库再次获取到该用户的其他基本信息。从而可以更好的辅助你完成你项目中其他的业务模块。
来自:http://www.cnblogs.com/zhangxiaoyong/
微信公众号开发及时获取当前用户Openid及注意事项的更多相关文章
- 用户关注微信公众号后,获取该用户的openID存数据库失败
关注微信公众号后将关注人的openID存入数据库失败,而openID换成字符串写死却可以存入数据库: $wxid=$postObj->FromUserName; $data['wx_openid ...
- C#微信公众号开发 -- (三)用户关注之后自动回复
通过了上一篇文章之后的微信开发者验证之后,我们就可以做微信公众号的代码开发了. 当我们点击关注某个公众号的时候,有时候会发现他会自动给我们回复一条消息,比如欢迎关注XXX公众号.这个功能其实是在点击关 ...
- 微信公众号开发系列-获取微信OpenID
在微信开发时候在做消息接口交互的时候须要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID.接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获 ...
- Java微信公众号开发----定时获取access_token并保存到redis中
本人原本是想做微信公众号菜单的创建修改删除等操作的,但是发现需要access_token,通过阅读文档,发现文档要求有以下几点: 1.access_token 获取后有效期是2小时 2.access_ ...
- 微信公众号开发之获取微信用户的openID
(注:openID同一用户同一应用唯一,UnionID同一用户不同应用唯一.不同应用指微信开放平台下的不同用户.) 1. 申请测试号(获得appID.appsecret) 2. 填写服务器配置并验 ...
- 微信公众号开发前端获取openId
参考 https://blog.csdn.net/qq_35430000/article/details/79299529
- 微信公众号开发用户授权登录报"redirect_uri 参数错误"错误
微信公众号开发 授权获取用户信息报错 "redirect_uri 参数错误" 出现这个情况要检查下 微信公众号配置了网页授权域名 在这里配置微信公众号redirect_uri中的域 ...
- C#微信公众号开发 -- (六)自定义菜单事件之CLICK
微信公众号中当用户手动点击了按钮,微信公众号会被动的向用户发送文字消息或者图文消息. 通过C#微信公众号开发 -- (五)自定义菜单创建 我们知道了如何将CLICK类型的按钮添加到自己的微信公众平台上 ...
- C#微信公众号开发-高级接口-之网页授权oauth2.0获取用户基本信息(二)
C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一) 中讲解了如果通过微信授权2.0snsapi_base获取已经关注用户的基本信息,然而很多情况下我们经常需要获取非关注用户的信息,方法 ...
随机推荐
- 【Hibernate】(2)Hibernate配置与session、transaction
1. Hibernate经常使用配置 使用hibernate.default_schema属性能够让全部生成的表都带一个指定的前缀. 2. session简单介绍 不建议直接使用jdbc的connec ...
- 微信小程序 - 音频播放(1.2版本和1.2版本之后)
不多说了,直接贴code // 1.2版本以后便不在维护 wx.getBackgroundAudioManager({ success:function(res){ var status =res.s ...
- 时间格式 2016-08-15T16:00:00.000Z
我修改的时间是2016-08-16(转换成Date后默认为2016-08-16 00:00:00),而我得到的时间却是2016-08-15T16:00:00.000Z 联想到我们当前的时区是+8区 ...
- 【Mongodb教程 第十八课 】MongoDB常用命令 数据库命令 集合操作命令
面向文档的 NoSQL 数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能. 条件操作符 <, <=, >, >= 这个操作符就不用多 ...
- oracle user locke
1:管理员登录 sqlplus sys/pwd as sysdba sql->alter user jd account unlock; commit; SQL> password new ...
- Python基础——数据类型、流程控制、常用函数
Python tutorial :Python网站上的对 Python 语言和系统的基本概念和功能进行的非正式的介绍. 在学习Python之前,我们需要学会在各个平台配置Python的运行环境,下文中 ...
- Enum to String 一般用法
目录 一.Enum Review 二.使用name()方法转换为String 三.使用toString()方法转换为String 四.使用成员属性转换为String 一.Enum Review J ...
- atitit.窗口静听esc退出本窗口java swing c# .net php
atitit.窗口静听esc退出本窗口java swing c# .net php 1. 监听esc 按键 1 1.1. 监听一个组件 1 1.2. 监听加在form上 1 2. 关闭窗口 2 1. ...
- 简明扼要谈Spring IOC的好处
http://a-kuei.iteye.com/blog/676524 iOC:控制反转,它是不是什么技术,它是一种设计模式.所谓控制反转就是由容器控制程序间的关系,而不是传统实现中,由编程代码直接操 ...
- thinkphp getField( )和field( )
thinkphp getField( )和field( ) 做数据库查询的时候,比较经常用到这两个,总是查手册,记不住,现在把它总结下,希望以后用的时候不查手册了. 不管是用select 查询数据 ...