首页 > 其他分享 >.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题

.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题

时间:2023-12-15 23:24:40浏览次数:48  
标签:code string 微信 用户 UnionID NET public

背景

随着公司微信相关业务场景的不断拓展,从最初的一个微信移动应用、然后发展成微信公众号应用、然后又有了微信小程序应用。但是随着应用的拓展,如何保证相同用户的微信用户在不同应用中登录的同一个账号呢?今天的主题就来了.NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题。

UnionID 机制

如果开发者拥有多个移动应用、网站应用、和公众账号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台账号下的移动应用、网站应用和公众账号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。

获取用户基本信息(UnionID机制)

在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过对应接口来根据OpenID获取用户基本信息,包括语言和关注时间。

请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户账号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

微信开放平台配置

登录地址:https://open.weixin.qq.com/

微信公众号微信登录配置

在基本配置中获取微信公众号的appid和appsecrect(一定是要自己公众号的),白名单是你在本地调试的微信项目的时候需要添加的你本地的ip地址,不然获取不到你想要的accsee_token。

配置服务器地址(url):这里是你的项目与微信服务器通讯的地方,一定不能填错,Token是你项目中的,将其复制到这里即可,消息加密解密密钥是微信端随机生成的。

在微信公众号设置设置对应业务域名,js接口安全域名,以及网页授权域名:

 

微信网页公众号获取用户UnionID(用户统一标识)

注意:用户统一标识(针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的),只有当scope为"snsapi_userinfo"时返回

用户同意授权获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(已认证服务号,默认拥有scope参数中的snsapi_base和snsapi_userinfo 权限),引导关注者打开如下页面:

若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。跳转回调redirect_uri,应当使用https链接来确保授权code的安全性,并且是在微信公众号后台配置的网页授权域名的访问地址。

  • https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

请求参数:

通过code获取用户UnionID(用户统一标识)

  • 获取code后,请求以下链接获取access_token:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

请求参数:

返回参数:

请求示例代码:

    public class WeChatLogin : Controller
    {

        /// <summary>
        /// 获取用户UnionID(用户统一标识)
        /// </summary>
        /// <param name="state">自定义参数</param>
        /// <param name="code">通过用户授权后得到的code</param>
        /// <returns></returns>
        public async Task<Response> GetWeChatUnionID(string state, string code)
        {
            string appId = "YourAppId";
            string appSecret = "YourAppSecret";
            string requestUrl = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appId}&secret={appSecret}&code={code}&grant_type=authorization_code";

            using (var httpClient = new HttpClient())
            {
                var httpRequest = new HttpRequestMessage(HttpMethod.Get, requestUrl);
                using (var response = await httpClient.SendAsync(httpRequest))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        var responseString = await response.Content.ReadAsStringAsync();
                        var responseData = JsonConvert.DeserializeObject<WeChatTokenResponse>(responseString);

                        return new Response
                        {
                            Code = 1,
                            Message = responseData.UnionId
                        };
                    }
                    else
                    {
                        var errorResponseString = await response.Content.ReadAsStringAsync();
                        var errorData = JsonConvert.DeserializeObject<ErrorResponse>(errorResponseString);

                        return new Response
                        {
                            Code = 0,
                            Message = $"Failed to get access token: {errorData.ErrMsg}"
                        };
                    }
                }
            }
        }
    }

    public class WeChatTokenResponse
    {
        [JsonProperty("access_token")]
        public string AccessToken { get; set; }

        [JsonProperty("expires_in")]
        public int ExpiresIn { get; set; }

        [JsonProperty("refresh_token")]
        public string RefreshToken { get; set; }

        [JsonProperty("openid")]
        public string OpenId { get; set; }

        [JsonProperty("scope")]
        public string Scope { get; set; }

        [JsonProperty("is_snapshotuser")]
        public int IsSnapshotUser { get; set; }

        [JsonProperty("unionid")]
        public string UnionId { get; set; }
    }

    public class ErrorResponse
    {
        [JsonProperty("errcode")]
        public int ErrCode { get; set; }

        [JsonProperty("errmsg")]
        public string ErrMsg { get; set; }
    }

.NET微信网页开发相关文章教程

https://github.com/YSGStudyHards/DotNetGuide

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
  • 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

标签:code,string,微信,用户,UnionID,NET,public
From: https://www.cnblogs.com/Can-daydayup/p/17904343.html

相关文章

  • 访问上传至.Net服务器本地的文件。
    1porgame.cs添加以下代码//使用默认静态文件目录wwwrootapp.UseDefaultFiles();app.UseStaticFiles();2在项目跟目录下创建wwwroot文件,需要提供访问的视频放在这个文件夹下面!!!注意,要区分大小写,我之前访问不了,就是创建的是WWWRoot.3访问方式!!!注意是服务器地址+......
  • Kubernetes v1.29 新特性一览
    新特性一览大纲一、Core组件增强调度器增强在Kubernetesv1.29中,Core组件经历了一系列增强,其中一个重要的改进是调度器的增强。这些增强使得调度器能够更加智能和高效地管理容器的调度和分配。通过引入新的调度算法和策略,调度器能够更好地适应不同的资源需求和约束条件,提高集群的容......
  • Modbus和Profinet通信协议简介
    Modbus和Profinet通信协议简介Modbus是一种通信协议,广泛应用于工业自动化领域。它通过串口或以太网等物理介质实现设备间的数据交换。Modbus采用主从结构,主设备负责发起通信请求,从设备则负责响应请求并提供数据。Modbus具有简单、可靠、易于实现的特点,被广泛用于传感器、执行器、P......
  • 微信终于支持“上锁”了
    有时候偶尔需要离开工位电脑又不想关机的时候怎么办......
  • 运营微信视频号要注意哪些问题?
    视频号运营的5个雷点你别踩!今天荷包蛋和你说的视频号运营的5大雷点你踩过没?这5点虽然和野花似的但也不能踩哦雷点1:违规行为雷点2:抄袭剽窃雷点3:没有明确目标受众雷点4:短视频质量过低雷点5:缺少社交互动相信不管是视频号还是别的平台都通用哈......
  • 机器学习ml.net例子笔记1
    详细内容参考: ml.net例子笔记1(yuque.com)  https://www.yuque.com/wushifengcn/kb/yb6xa6d01zr3tdit 如下是大纲1ml.net例子概要二元分类多类分类建议回归时间序列预测异常情况检测聚类分析排名计算机视觉跨领域......
  • net8获取泛微token以及访问api示例
    工作中涉及到调用泛微的场景,官方的示例又臭又长,抽空用NET8简化了写法,为了简化http访问,用了Flurl.Http这个库。在座各位大佬,我们直接就看代码了 usingSystem.Security.Cryptography;usingSystem.Text.Json;usingFlurl.Http;//请按照官方内容做好初始化工作https://e-c......
  • “System.Net.Http.HttpContent”不包含“ReadAsAsync”的定义
    WebApi当道的今天,之前要自己写的序列化,现在有人都做好了publicclassPostHelper{staticHttpClientclient=newHttpClient();publicstaticasyncTask<T>PostTestAsync<T>(stringurl,Targs){//stringjson=JsonS......
  • asp.net 启动后重启 端口被占用 Global.asax 以及Application_End
    最近在维护一个老的asp.net项目最开始发现一个诡异的现象,那就是本地调试的时候这个项目经常在启动后莫名其妙的重启逐步调试发现原来是该项目会监听一个本地端口,项目重启时会出现端口被占用的情况,为了保证端口不会占用,会先判断一下端口的情况,如果发现端口被占用,就强制杀掉占用该......
  • 记录一次在k8s上,web服务内嵌的netty-socketio注册到nacos,gateway转发路由 遇到的问题
    web服务内嵌的nacos怎么注册?使用javasdk方式参考链接:https://nacos.io/zh-cn/docs/sdk.html每个socket不同怎么设置端口我这里使用的是注解,让用户传过来,并且在bean初始化之前进行变量存储。这个链接里面的[netty-socketio服务端代码编写目录]:https://www.cnblogs.com/x......