通过OAuth2.0方式弹出授权页面获得用户基本信息

2023-05-16

获取微信用户的个人的信息的时候,要特别注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token,一种是OAuth2.0授权中产生的access_token.

我们获取微信的个人信息就必须获取Oauth2.0授权产生的access_token.

1. 首先配置回调域名 

在微信公众平台去设置

 2. 构造请求url如下:


https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect  
3. 回调页面得到链接如下,回调url中将包含参数code


http://mascot.duapp.com/oauth2.php?code=00b788e3b42043c8459a57a8d8ab5d9f&state=1
或者 http://mascot.duapp.com/oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&code=00b788e3b42043c8459a57a8d8ab5d9f&state=1
4. 再使用code换取oauth2的授权access_token


https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code  

5. 再使用授权Access Token获取用户信息

url如下:


https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc  



  protected virtual void PageBase_Load(object sender, EventArgs e)
        {
            //访问微信的类
            WeiXinOAuth au = new WeiXinOAuth();  

	    //结果
            WeiXinAccessTokenResult result = null;
            string AppID = "xxxxx";
            string AppSecret = "xxxx";
            string _code = ReqUtils.GetString("code", "");
            string _state = ReqUtils.GetString("state", "");
            //判断用户是否存在  
            if (SesssionWx.Current == null)
            {
                //微信第一次握手后得到的code 和state
                if (_code == "" || _code == "authdeny")
                {     
                    if (_code == "")
                    {
                       //转发到微信的授权页面
                        string authUrl = au.GetWeiXinCode(AppID.Trim(), AppSecret.Trim(), HttpContext.Current.Server.UrlEncode(HttpContext.Current.Request.Url.ToString()), "STATE");
                        HttpContext.Current.Response.Redirect(authUrl, true);
                       
                    }
                    else
                    { // 用户取消授权
                        HttpContext.Current.Response.Redirect("~/Error.html", true);
                    }
                }
                else
                {  

			
                        result = au.GetWeiXinAccessToken(AppID, AppSecret, _code);                 
                        if (result != null)
                    {
                        string ms = JsonSerializeUtils.JsSerializer(result);
                    }
                    else
                    {
                       
                        return;
                    }
                    userinfo = au.GetWeiXinUserInfo(result.SuccessResult.access_token, result.SuccessResult.openid);
                   // string mss = JsonSerializeUtils.JsSerializer(userinfo);
                  //  DesignHawk.Common.LogHelper.WriteLog(null, "当前userinfo为:" + mss);
                    if (userinfo != null)
                    {
                        userBasic = userBasicBll.GetUserOpenID(userinfo.UserInfo.openid);
                       
                    }
                    else
                    {


                    }
                }
            }
            else
            {


            }
        }  

WeiXinOAuth.cs类


  
public class WeiXinOAuth
    {
        /// <summary>
        /// 获取微信Code
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <param name="redirectUrl"></param>
        public string GetWeiXinCode(string appId, string appSecret, string redirectUrl,string state)
        {
            Random r = new Random();
            //微信登录授权
            //string url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
            //微信OpenId授权
            //string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl +"&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";
            //微信用户信息授权
            string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + redirectUrl + "&response_type=code&scope=snsapi_userinfo&state="+state+"#wechat_redirect";


            return url;
        }
        /// <summary>
        /// 通过code获取access_token
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        public WeiXinAccessTokenResult GetWeiXinAccessToken(string appId, string appSecret, string code)
        {
            string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret +
                "&code=" + code + "&grant_type=authorization_code";
            //string jsonStr = Tools.GetHttpRequest(url);
            string jsonStr = GetJson(url);


            //SPC.Common.DLog.Write("GetWeiXinAccessToken , jsonStr =  " + jsonStr, SPC.Common.DLog.LogMessageType.Info);


            WeiXinAccessTokenResult result = new WeiXinAccessTokenResult();
            if (jsonStr.Contains("errcode"))
            {
                WeiXinErrorMsg errorResult = new WeiXinErrorMsg();
              //  errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
                errorResult = JsonSerializeUtils.JsDeSerializer<WeiXinErrorMsg>(jsonStr);
                result.ErrorResult = errorResult;
                result.Result = false;
            }
            else
            {
                WeiXinAccessTokenModel model = new WeiXinAccessTokenModel();
              //  model = JsonHelper.FromJson<Model.WeiXinAccessTokenModel>(jsonStr);
                model = JsonSerializeUtils.JsDeSerializer<WeiXinAccessTokenModel>(jsonStr);
                result.SuccessResult = model;
                result.Result = true;
            }
            return result;
        }
        /// <summary>
        /// 获取基础acess_token  
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <returns></returns>
        public Access_token GetAcess_token(string appId, string appSecret)
        {
            string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret+"";
            string json = GetJson(url);
            Access_token token = new Access_token();
            if (json.Contains("errcode"))
            {


            }
            else
            {
                token = JsonSerializeUtils.JsDeSerializer<Access_token>(json);
            }
            return token;


        }






        /// <summary>
        /// 获取jsapi_ticket
        /// jsapi_ticket是公众号用于调用微信JS接口的临时票据。
        /// 正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。
        /// 由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
        /// </summary>
        /// <param name="access_token">BasicAPI获取的access_token,也可以通过TokenHelper获取</param>
        /// <returns></returns>
        public WeiXinJsapi_ticket GetTickect(string access_token)
        {
            var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
            string json = GetJson(url);




            WeiXinJsapi_ticket result = new WeiXinJsapi_ticket();
            if (json.Contains("errcode"))
            {


                //  errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
                result = JsonSerializeUtils.JsDeSerializer<WeiXinJsapi_ticket>(json);
              
            }
            else
            {


                //  model = JsonHelper.FromJson<Model.WeiXinAccessTokenModel>(jsonStr);
                result = JsonSerializeUtils.JsDeSerializer<WeiXinJsapi_ticket>(json);
               
            }
            return result;
        }


        /// <summary>
        /// 签名算法
        /// </summary>
        /// <param name="jsapi_ticket">jsapi_ticket</param>
        /// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param>
        /// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param>
        /// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param>
        /// <returns></returns>
        public  string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url,  string string1)
        {
            var string1Builder = new StringBuilder();
            string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
                          .Append("noncestr=").Append(noncestr).Append("&")
                          .Append("timestamp=").Append(timestamp).Append("&")
                          .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
            string1 = string1Builder.ToString();
            DesignHawk.Common.LogHelper.WriteLog(null, "JSAPI:" + string1);
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string1, "SHA1");
             //Sha1(string1);
        }
        /// Sha1
        /// </summary>
        /// <param name="orgStr"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        public static string Sha1(string orgStr, string encode = "UTF-8")
        {
            var sha1 = new SHA1Managed();
            var sha1bytes = System.Text.Encoding.GetEncoding(encode).GetBytes(orgStr);
            byte[] resultHash = sha1.ComputeHash(sha1bytes);
            string sha1String = BitConverter.ToString(resultHash).ToLower();
            sha1String = sha1String.Replace("-", "");
            return sha1String;
        }
        public string GetNoncestr()
        {
            Random rd = new Random();
            string str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY";
            string result = "";
            for (int i = 0; i < 15; i++)
            {
                result += str[rd.Next(str.Length)];
            }
            return result;
        }
        public long GetTimeStamp()
        {
            return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
        }


        /// <summary>
        /// 拉取用户信息
        /// </summary>
        /// <param name="accessToken"></param>
        /// <param name="openId"></param>
        /// <returns></returns>
        public WeiXinUserInfoResult GetWeiXinUserInfo(string accessToken, string openId)
        {
            string url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
          //  SPC.Common.DLog.Write("获取微信的用户信息(第三次微信握手):", SPC.Common.DLog.LogMessageType.Info);
            //string jsonStr = Tools.GetHttpRequest(url);
            string jsonStr = GetJson(url);
           // SPC.Common.DLog.Write("jsonStr =" + jsonStr, SPC.Common.DLog.LogMessageType.Info);
          
            WeiXinUserInfoResult result = new WeiXinUserInfoResult();
            if (jsonStr.Contains("errcode"))
            {
                WeiXinErrorMsg errorResult = new WeiXinErrorMsg();
                // errorResult = JsonHelper.FromJson<Model.WeiXinErrorMsg>(jsonStr);
                errorResult = JsonSerializeUtils.JsDeSerializer<WeiXinErrorMsg>(jsonStr);
                result.ErrorMsg = errorResult;
                result.Result = false;
            }
            else
            {
                WeiXinUserInfo userInfo = new WeiXinUserInfo();
               // userInfo = JsonHelper.FromJson<Model.WeiXinUserInfo>(jsonStr);
                userInfo = JsonSerializeUtils.JsDeSerializer<WeiXinUserInfo>(jsonStr);
                result.UserInfo = userInfo;
                result.Result = true;
                
            }
            return result;
        }




        //访问微信url并返回微信信息
        protected string GetJson(string url)
        {
            WebClient wc = new WebClient();  
            wc.Credentials = CredentialCache.DefaultCredentials;
            wc.Encoding = Encoding.UTF8;
            string returnText = wc.DownloadString(url);


            if (returnText.Contains("errcode"))
            {
                //可能发生错误
            }
            return returnText;
        }       
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过OAuth2.0方式弹出授权页面获得用户基本信息 的相关文章

随机推荐

  • Ubuntu检测ip有效性 且 修改系统ip

    正则表达式实现检测IP地址是否有效 bool UntilTool CheckIPAddrIsVaild string str regex check ip 34 25 0 5 2 0 4 0 9 1 0 9 0 9 1 9 0 9 1 9
  • clion同一个项目创建多个可执行文件

    简述需求 xff1a 需要写多个可执行文件 xff0c 但是文件一些工具类等都是通用的 xff0c 比较麻烦的就是创建多个项目 xff0c 下来让你一个项目中生成多个可执行文件 xff0c 用到那个编译那个就可以了 默认创建好项目后 xff
  • Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++(Windows)【真正的小白版】

    写在前面的前面 xff1a 这篇文章vscode和cpp插件版本有点老了 xff0c 仅供大家参考 xff0c 最新的和最详细的更新见我的另一篇文章 xff1a https blog csdn net bat67 article detai
  • linux服务端下的c++ udp socket demo

    linux服务端 udp socket demo 如下 xff1a 创建接受数据的socket int iSock 61 socket PF INET SOCK DGRAM 0 printf 34 socket ss d n 34 iSoc
  • ROS个别命令的使用 ros ros2

    ros1 录包 rosbag record a O filename bag 解释 xff1a a是把所有的包都进行录制 xff0c O表示后面需要跟输出的文件名字 xff0c o的话系统会自己添加录制日期为文件名上 xff1b rosba
  • 浅析 自动驾驶、遥控驾驶、平行驾驶区别

    以下内容仅为个人粗浅理解 xff0c 欢迎大家留言指正 图片内容来源于互联网 xff0c 图片权利归图片作者所有 xff0c 本文仅引用 自动驾驶 xff1a 重点在车端 xff0c 自动驾驶相关资源部署在车端 xff0c 或大部分算力等都
  • CNN图像分割简史:从R-CNN到Mask R-CNN(译)

    一直想总结一下CNN在图像分割中的发展脉络 xff08 主要是R CNN及其改进方法 xff09 xff0c 看到一篇不错的英文博文 A Brief History of CNNs in Image Segmentation From R
  • c: __FILE__, __LINE__

    这是编译器内置宏 xff0c 这些宏定义不仅可以帮助我们完成跨平台的源码编写 xff0c 灵活使用也可以巧妙地帮我们输出非常有用的调试信息 注意 xff0c 是双下划线 xff0c 而不是单下划线 FILE 包含当前程序文件名的字符串 LI
  • 当数组遇到mybatis in 的时候

    我想实现 多个id 传入sql 语句 的操作 1 我试着将数组 stringUtils join 数组 34 34 数组转string 并以逗号分隔 没成功 因为传到sql 里是 123 234 435 xff0c 而我们需要的是 123
  • jeesite中的ztree应用

    话不多说 xff0c 直接开始一二三 jeesite页面上通过以自定义jstl lt sys treeselect gt 方式引入树形选择 1 lt sys treeselect id 61 34 company 34 name 61 34
  • getByte()用法小结

    在Java中 xff0c String的getBytes 方法是得到一个操作系统默认的编码格式的字节数组 这个表示在不同情况下 xff0c 返回的东西不一样 xff01 String getBytes String decode 方法会根据
  • plsql 导出表和表数据

    导出数据表结构 打开pl sql客户端 Tools Export User Objects xff08 工具 导出用户对象 xff09 按图选择自己需要导出的表 xff0c 在选择导出文件位置 导出表数据 Tools Exports Tab
  • String的按值传递,java传参都是传值

    看完绝对清晰 java中对象作为参数传递给一个方法 xff0c 到底是值传递 xff0c 还是引用传递 xff1f pdd xff1a 所谓java只有按值传递 xff1a 基本类型 值传递 xff1b 引用类型 xff0c 地址值传递 x
  • Bili视频弹幕播放器后台源码

    介绍 此款播放器源码添加及修复了很多功能 xff0c 且所有源码均本地化 xff0c 不存在外链的情况 xff0c 测试环境 xff1a PHP7 0 43 MySQL5 6 播放器跨域远程下一集代码 xff1a 说明 xff1a 就是你的
  • 小程序与java的session问题

    一般web开发中 xff0c 我们需要通过session将数据用户重要数据存储到session中 xff0c 而由于html自带cookie xff0c 能够帮助我们存储从服务器端发送jsessionid到客户端浏览器 xff0c 客户端发
  • mac下java开发环境配置

    1 下载并安装jdk xff0c 配置环境变量 jdk1 8下载地址 xff1a http www oracle com technetwork java javase downloads jdk8 downloads 2133151 ht
  • 数组协变

    在某些情况下 xff0c 即使某个对象不是数组的基类型 xff0c 我们也可以把它赋值给数组元素 这种属性叫做协变 xff08 covariance xff09 在下面的情况下可以使用协变 xff1a 数组是引用类型数组 在赋值的对象类型和
  • 策略模式

    策略模式 由于最近在研究学习设计模式 xff0c 我会用自己的理解方式来表述对设计模式的学习和认识 xff0c 通过最常用 好记的案例来记住和使用设计模式 xff0c 希望对设计代码方面有所提高和改进 一 应用背景 在软件开发中常常遇到这种
  • Vs2010与VC的区别

    VS2010与VC 43 43 编译器的区别 xff1a 1 VS2010并不是针对C 43 43 的 xff0c C 43 43 只是它的一小部分 xff0c 它更加关注 net平台程序开发 xff08 主要是C VB xff0c C 4
  • 通过OAuth2.0方式弹出授权页面获得用户基本信息

    获取微信用户的个人的信息的时候 xff0c 要特别注意的是有两个不同的Access Token xff0c 他们产生的方式不一样 xff0c 一种是使用AppID和AppSecret获取的access token xff0c 一种是OAut