微信 网页授权_微信解除其他app授权

微信 网页授权_微信解除其他app授权一、背景近期实现微信招聘公众号的需求,需要在微信用户同意公众号授权后,获取到微信用户信息。这一步操作在前端无法完成,所以这里我们使用了C#WebApi项目,通过接口实现后台获取微信用户数据再重定向到前端页面。二、思路具体而言,微信网页授权流程分为四步:1、引导用户进入授权页面同意授权,获取code;2、通过code换取网页授权access_toke…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

一、背景

    近期实现微信招聘公众号的需求,需要在微信用户同意公众号授权后,获取到微信用户信息。这一步操作在前端无法完成,所以这里我们使用了C# WebApi项目,通过接口实现后台获取微信用户数据再重定向到前端页面。

二、思路

    具体而言,微信网页授权流程分为四步:
    1、引导用户进入授权页面同意授权,获取code;
    2、通过code换取网页授权access_token(与基础支持中的access_token不同);
    3、如果需要,开发者可以刷新网页授权access_token,避免过期;

    4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制);

    首先,我们需要明确传递给后台的参数,以及后台返回的数据是什么。根据上述思路,前端第一次请求后台是需要引导用户进入授权页面同意授权,获取code,只要这一过程发生在微信端并且用户点击同意,就可以获取到code;此时操作仍然在后台,我们还需要进一步获取用户信息,所以我们在后台需要伪跳转(在后台接口进行跳转至另一信息获取接口),调用微信接口获取到用户信息。这个时候鉴权、获取用户信息都完成了,后台如何把用户信息给前端、如何定位前端页面呢?所以我们需要在前端传递给后台的参数里,加上鉴权、获取用户信息后的重定向URL,并将用户信息拼接到URL上。

    看到这里,思路就很清晰了。前端请求后台鉴权并带上重定向URL、后台获取用户信息并将用户信息添加到URL上、后台重定向此URL,最终微信端展示页面的就是每个用户的个人数据了。

三、代码实现

ConfigurationManager.AppSettings["appid"]配置为微信公众号的AppID;
ConfigurationManager.AppSettings["appsecret"]配置为微信公众号的AppSecret;
ConfigurationManager.AppSettings["apppath"]配置为后台接口服务器域名,这个是需要在公众号后台配置的.

Jetbrains全家桶1年46,售后保障稳定

 下面这种方法可以获取微信OpenID,但不能获取到微信UnionID。

    /// <summary>
    /// 微信公众号用户信息获取
    /// </summary>
    public class AuthController : Controller
    {
        private static string appId = ConfigurationManager.AppSettings["appid"];
        private static string secret = ConfigurationManager.AppSettings["appsecret"];
        /// <summary>
        /// 微信公众号引导页
        /// </summary>
        /// <returns>成功时,返回带有用户信息的URL并重定向</returns>
        public ActionResult GetUserInfo()
        {
            string code = Request.QueryString["code"];
            string state = Request.QueryString["state"];
            try
            {
                if (!string.IsNullOrEmpty(code) && !string.IsNullOrEmpty(state))
                {
                    OAuthToken oauthToken = JsonConvert.DeserializeObject<OAuthToken>(new WXHelper().Request(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, secret, code), "", "GET"));
 
                    string accesstoken = string.Empty;
                    AccessToken token = JsonConvert.DeserializeObject<AccessToken>(new WXHelper().Request(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, secret), "", "GET"));
 
                    if (token != null && !string.IsNullOrEmpty(token.access_token))
                    {
                        accesstoken = token.access_token;
                    }
 
                    if (oauthToken != null && !string.IsNullOrEmpty(oauthToken.openid))
                    {
                        OAuthUserInfo userInfo = JsonConvert.DeserializeObject<OAuthUserInfo>(new WXHelper().Request(string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", accesstoken, oauthToken.openid), "", "GET"));
                        
                    }
                    else
                    {
                        ViewData["errmsg"] = "Token获取失败!";
                    }
                }
                else
                {
                    ViewData["errmsg"] = "用户code获取失败!";
                }
            }
            catch (Exception ex)
            {
                ViewData["errmsg"] = ex.Message;
            }
 
            return View();
        }
        /// <summary>
        /// 微信公众号引导页
        /// </summary>
        /// <param name="url">微信前端传递的跳转url</param>
        /// <returns>成功时,重定向至获取用户信息</returns>
        public ActionResult Index(string url)
        {
            if (!string.IsNullOrEmpty(url))
            {
                url = WXHelper.DecodeBase64(url);
                string state = EncryptHelper.MD5Encrypt(url);
                //使用微信接口,重定向地址为本接口中的另一方法
                return Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect", appId, ConfigurationManager.AppSettings["apppath"] + "/**/**/GetUserInfo", state));
            }
            else
                ViewData["errmsg"] = "重定向url不能为空!";
 
            return View();
        }
    }

下面这种方法,使用sns token可以获取微信OpenID、UnionID:

 

    /// <summary>
    /// 微信公众号用户信息获取
    /// </summary>
    public class AuthController : Controller
    {
        private static string appId = ConfigurationManager.AppSettings["appid"];
        private static string secret = ConfigurationManager.AppSettings["appsecret"];
        /// <summary>
        /// 微信公众号引导页
        /// </summary>
        /// <returns>成功时,返回带有用户信息的URL并重定向</returns>
        public ActionResult GetUserInfo()
        {
            string code = Request.QueryString["code"];
            string state = Request.QueryString["state"];
            try
            {
                if (!string.IsNullOrEmpty(code) && !string.IsNullOrEmpty(state))
                {
                    string strGetSnsToken = new WXHelper().Request(string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, secret, code), "", "GET");
                    JObject jo1 = JsonConvert.DeserializeObject<JObject>(strGetSnsToken);

                    string strResult = new WXHelper().Request(string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN ", jo1["access_token"].ToString(), jo1["openid"].ToString()), "", "GET");
                    OAuthUserInfo userInfo = JsonConvert.DeserializeObject<OAuthUserInfo>(strResult);
                }
                else
                {
                    ViewData["errmsg"] = "用户code获取失败!";
                }
            }
            catch (Exception ex)
            {
                ViewData["errmsg"] = ex.Message;
            }
 
            return View();
        }
        /// <summary>
        /// 微信公众号引导页
        /// </summary>
        /// <param name="url">微信前端传递的跳转url</param>
        /// <returns>成功时,重定向至获取用户信息</returns>
        public ActionResult Index(string url)
        {
            if (!string.IsNullOrEmpty(url))
            {
                url = WXHelper.DecodeBase64(url);
                string state = EncryptHelper.MD5Encrypt(url);
                //使用微信接口,重定向地址为本接口中的另一方法
                return Redirect(string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect", appId, ConfigurationManager.AppSettings["apppath"] + "/**/**/GetUserInfo", state));
            }
            else
                ViewData["errmsg"] = "重定向url不能为空!";
 
            return View();
        }
    }

   四、思考

    在实际项目中做微信网页授权会因为场景不同而产生不同的代码实现,但是基本的微信授权逻辑,在上述代码中都有体现,希望能给各位开发者在类似业务场景下带来些许帮助。微信接口的严格性(局限性),会给开发者带来一些麻烦,但是办法总比困难多。通过不断的发现问题、思考问题、解决问题,才是开发者的生存之道。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210445.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php 容器_php依赖注入容器库

    php 容器_php依赖注入容器库原标题:PHP容器——Pimple运行流程浅析需要具备的知识点闭包闭包和匿名函数在PHP5.3.0中引入的。闭包是指:创建时封装周围状态的函数。即使闭包所处的环境不存在了,闭包中封装的状态依然存在。理论上,闭包和匿名函数是不同的概念。但是PHP将其视作相同概念。实际上,闭包和匿名函数是伪装成函数的对象。他们是Closure类的实例。闭包和字符串、整数一样,是一等值类型。创建闭包:$closure…

    2022年10月24日
    0
  • 标准正态分布的分布函数服从均匀分布_python 正态分布

    标准正态分布的分布函数服从均匀分布_python 正态分布三种由(0,1)均匀分布构造标准正态分布随机变量的方法:Box–Muller算法,中心极限定理和KindermanandMonahanmethod。

    2025年7月21日
    1
  • linux中iostat命令_ios命令行怎么打开

    linux中iostat命令_ios命令行怎么打开简介iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 语法iostat[-c][-d][-h][-N][-k|-m][-t][-V][-x][-

    2022年10月5日
    0
  • VR虚拟现实开发_vr虚拟世界

    VR虚拟现实开发_vr虚拟世界Here,you’llgettoknowaboutVirtualRealityandhowyoushouldstepbystepstartdevelopingaVRApplicationandkeepyourfirstfootintheVRDevelopmentaura.在这里,您将了解虚拟现实以及如何逐步开始开发VR应用程序,并使您的…

    2022年9月12日
    1
  • docker 容器内部访问宿主机_docker访问宿主机文件

    docker 容器内部访问宿主机_docker访问宿主机文件在使用Docker部署应用时,Docker推荐的方式是将应用及其所依赖的服务(MySQL,Redis等)均使用Docker部署,并通过link或自定义网络相连接。但是,当应用所依赖的服务被安装在宿主机上时,我们需要让容器中的应用能够访问到部署在宿主机上的服务。本文将介绍实现这一目的的几种方案,并分析其优缺点。首先我们需要了解一些关于Docker网络的基础知识。Docker网络Docker提供…

    2022年8月20日
    62
  • 基于单片机的毕业设计简单点的_毕业设计设计思路范文

    基于单片机的毕业设计简单点的_毕业设计设计思路范文单片机毕业设计不用愁!!30篇单片机毕业设计参考案例30篇单片机毕业设计参考案例 这篇文章分享给大四的小伙伴,是时候该准备毕业设计了吧,别偷懒了,第二学期就准备实习了喔,所以小编我就开始为你们准备资料啦,30篇单片机毕业设计参考案例给你们啦,有什么不懂的问题可以加群讨论:813238832。下面就是案例: 更多单片机、物联网,MTK和proteus等资料分享,持续增加中,敬请关…

    2022年10月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号