第6章 间接通过code获取微信网页授权中的微信access_token

1 WeChatWebApi.Models.WechatAccessTokenModel

///

    /// 【微信用户令牌信息模型--类】

    ///

    /// 摘要:

    ///     微信发送的令牌信息,记录到当前程序的内存中。

    ///

    ///

    public class WechatAccessTokenModel

    {

        ///

        /// 【令牌】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的令牌信息,开发者通过该信息让当前程序集成微信的第3方授权认证。

        ///

        ///

        public string access_token { get; set; }

        ///

        /// 【过期时间】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的令牌信息的过期时间,开发者通过该信息让当前程序集成微信的第3方授权认证,微信将其设定为7200秒=2小时。

        ///

        ///

        public int expires_in { get; set; }

    }

2 WeChatWebApi.Models.WechatAuthorizationCodeModel

namespace WeChatWebApi.Models

{

    ///

    /// 【微信授权认证信息模型--类】

    ///

    /// 摘要:

    ///     微信发送的权认证信息,记录到当前程序的内存中。

    ///

    ///

    public class WechatAuthorizationCodeModel

    {

        ///

        /// 【令牌】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的令牌信息,开发者通过该信息让当前程序集成微信的第3方授权认证。

        ///

        ///

        public string access_token { get; set; }

        ///

        /// 【过期时间】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的令牌信息的过期时间,开发者通过该信息让当前程序集成微信的第3方授权认证,微信将其设定为7200秒=2小时。

        ///

        ///

        public int expires_in { get; set; }

        ///

        /// 【刷新令牌】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的刷新令牌信息,开发者通过该信息让当前程序集成微信的第3方授权认证。

        ///

        ///

        public string refresh_token { get; set; }

        ///

        /// 【唯一标识】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的唯一标识。

        ///

        ///

        public string openid { get; set; }

        ///

        /// 【作用域】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的所使用的授权作用域,该作用域的值一般情况下由开发者根据程序功能直接写死。

        ///  说明:

        ///     使用域不同,当前程序从能同1个微信Api中获取的数据也不相同,要想获取微信登录用户的信息作用哉的值必须为:"snsapi_userinfo"。

        ///

        ///

        public string scope { get; set; }

    }

}

3 WeChatWebApi.Models.WechatLoginUserInfoModel

namespace WeChatWebApi.Models

{

    ///

    /// 【微信登录微信用户信息模型模型--类】

    ///

    /// 摘要:

    ///     微信发送的登录微信用户信息,记录到当前程序的内存中。

    ///

    ///

    public class WechatLoginUserInfoModel

    {

        ///

        /// 【唯一标识】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的唯一标识。

        ///

        ///

        public string openid { get; set; }

        ///

        /// 【昵称】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的昵称。

        ///

        ///

        public string nickname { get; set; }

        ///

        /// 【性别】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的性别。

        ///

        ///

        public int sex { get; set; }

        ///

        /// 【语言】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户所使用的语言。

        ///

        ///

        public string language { get; set; }

        ///

        /// 【城市】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户所在的城市。

        ///

        ///

        public string city { get; set; }

        ///

        /// 【省/直辖市/州】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户所在的省/直辖市/州。

        ///

        ///

        public string province { get; set; }

        ///

        /// 【省/直辖市/州】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户所在的省/直辖市/州。

        ///

        ///

        public string country { get; set; }

        ///

        /// 【头像图片URL】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,1个指定微信用户的头像图片的URL字符串。

        ///

        ///

        public string headimgurl { get; set; }

        ///

        /// 【省/直辖市/州】

        ///

        /// 摘要:

        ///     获取/设置用户使用微信登录后,用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)。

        ///

        ///

        public object[] privilege { get; set; }

    }

}

4 重构WeChatGetCode.Controllers.HomeController

   /// name="weChatCode">从微信浏览器中获取的code值。

        ///

        /// 【使用微信进行登录时获取微信提供的授权认证信息】

        ///

        /// 摘要:

        ///     当前程序使用使用微信进行身份认证后进行授权登录时,获取微信提供的授权认证信息。

        ///

        ///

        /// 返回:

        ///     微信授权认证信息模型实例。

        ///

        ///

        [HttpGet]

        public WechatAuthorizationCodeModel GetWechatAuthorizationCode(string weChatCode)

        {

            var url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={AppId}&secret={AppSecret}&code={weChatCode}&grant_type=authorization_code";

            var httpClient = new HttpClient();

            var result = httpClient.GetStringAsync(url).Result;

            //return JsonSerializer.Deserialize(result)!.openid;

            return JsonSerializer.Deserialize(result)!;

        }

        ///

        /// 【获取code的回调URL为微信用户信息】

        ///

        /// 摘要:

        ///     当前程序使用使用微信进行身份认证后进行授权登录时,微信服务器向当前程序发送的code值,该code值为使用微信进行登录时获取微信用户的信息提供参数支持。

        ///

        ///

        /// 返回:

        ///     URL字符串,该字符串用于从微信浏览器中获取1个指定的code值,该code值为使用微信进行登录时获取微信用户的信息提供参数支持。

        ///

        ///

        [HttpGet]

        public string GetUrlToPrivacyBySnsapi_userinfo()

        {

            var RedirectUri1 = "https://7cn7680860.imdo.co/Home/Privacy";

            //要想使用微信授权,并获取该微信登录用户的信息,Scope的参数值必须为:"snsapi_userinfo",而不能为:"snsapi_base",否则会出现异常:“errcode“:48001“errmsg“:“api unauthorized...“”

            var Scope = "snsapi_userinfo";

            var State = "123";

            var url = $"https://open.weixin.qq.com/connect/oauth2/authorize?appid={AppId}&redirect_uri={HttpUtility.UrlEncode(RedirectUri1)}&response_type=code&scope={Scope}&state={State}#wechat_redirect";

            return url;

        }

        /// name="weChatCode">从微信浏览器中获取的code值。

        ///

        /// 【使用微信进行登录时获取微信用户的信息】

        ///

        /// 摘要:

        ///     当前程序使用使用微信进行身份认证后进行授权登录时,获取已经登录的指定微信用户相关信息。

        /// 注意:

        ///     想要获取登录时微信用户的信息,Scope的参数值必须为:"snsapi_userinfo",而不能为:"snsapi_base",否则会出现异常:“errcode“:48001“errmsg“:“api unauthorized...“”,

        ///  所该方法中所需要code值必须从“GetUrlToPrivacyBySnsapi_userinfo”中获取。

        ///

        ///

        /// 返回:

        ///     微信登录微信用户信息模型实例。

        ///

        ///

        [HttpGet]

        public WechatLoginUserInfoModel GetWechatLoginUserInfo(string weChatCode)

        {

            var url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={AppId}&secret={AppSecret}&code={weChatCode}&grant_type=authorization_code";

            var httpClient = new HttpClient();

            var result = httpClient.GetStringAsync(url).Result;

            var wechatAuthorizationCode = JsonSerializer.Deserialize(result)!;

            var url1 = $"https://api.weixin.qq.com/sns/userinfo?access_token={wechatAuthorizationCode.access_token}&&openid={wechatAuthorizationCode.openid}";

            var result1 = httpClient.GetStringAsync(url1).Result;

            return JsonSerializer.Deserialize(result1)!;

        }

        ///

        /// 【使用微信进行登录时获取微信用户的令牌信息】

        ///

        /// 摘要:

        ///     当前程序使用使用微信进行身份认证后进行授权登录时,获取已经登录的指定微信用户的令牌信息。

        ///

        ///

        /// 返回:

        ///     微信登录微信用户令牌信息模型实例。

        ///

        ///

        [HttpGet]

        public WechatAccessTokenModel GetWechatAccessToken()

        {

            var url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxc7337c066242de8b&secret=85901b3e6cbec634298c1707afcf915e";

            var httpClient = new HttpClient();

            var result = httpClient.GetStringAsync(url).Result;

            return JsonSerializer.Deserialize(result)!;

        }

对以上功能更为具体实现和注释见:230807_006WeChatWebApi(间接通过code获取微信网页授权中的微信access_token)。

你可能感兴趣的:(.Net7,微信)