서문
이 글은 사용자의 기본 정보를 얻기 위해 이전 글의 웹페이지 인증을 주로 따른 것이며, 이후 사용자가 공식 계정의 링크를 클릭할 때 현재 사용자를 다시 얻는 방법에 관한 것입니다. 첫 번째 자동 인증 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에 도메인 이름을 사용하는 것이 가장 좋습니다. WeChat 플랫폼 인터페이스를 조정할 때 잘못된 링크 오류가 보고됩니다.
위의 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
참고: 위에서 언급한 OAuth_Token 클래스는 다음과 같습니다.
public class OAuth_Token { /// <summary> /// 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 /// </summary> public string access_token { get; set; } /// <summary> /// access_token接口调用凭证超时时间,单位(秒) /// </summary> public string expires_in { get; set; } /// <summary> /// 用户刷新access_token /// </summary> public string refresh_token { get; set; } /// <summary> /// 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID /// </summary> public string openid { get; set; } /// <summary> /// 用户授权作用域 /// </summary> public string scope { get; set; } }
로그 파일
사용한 간단한 로그 클래스도 제공됩니다.
/// <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를 가져오고, 사용자에 대한 기타 기본 정보는 데이터베이스에서 다시 가져올 수 있습니다. 이는 프로젝트의 다른 비즈니스 모듈을 완료하는 데 더 나은 도움이 될 수 있습니다.