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

背景

随着公司微信相关业务场景的不断拓展,从最初的一个微信移动应用、然后发展成微信公众号应用、然后又有了微信小程序应用。但是随着应用的拓展,如何保证相同用户的微信用户在不同应用中登录的同一个账号呢?今天的主题就来了.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

图片

参考文章

  • https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277544.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Modbus转Profinet网关配置步骤

Modbus转Profinet网关&#xff08;XD-MDPN100/200&#xff09;是用于将Modbus协议和Profinet协议进行转换并进行通迅的设备。Modbus转Profinet网关&#xff08;XD-MDPN100/200&#xff09;无论是新项目还是改造项目都可轻松配置完成通迅互联。 正确的安装和配置对于确保设备的正…

LVM逻辑卷管理

lvm的特点 #传统分区的缺点: 传统的文件系统是基于分区的&#xff0c;一个文件系统对应一个分区。这种方式比较直观&#xff0c;但不易改变。当一个分区空间已满时&#xff0c;无法对其扩充&#xff0c;只能采用重新分区&#xff0f;建立文件系统&#xff0c;非常麻烦&#…

【教3妹学编程-算法题】反转二叉树的奇数层

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;“你不是真正的快乐&#xff0c; 你的…

机器学习入门笔记

文章目录 背景具体步骤1.环境搭建2.写个demo1.数据处理2.分割数据集3.用模型训练数据&#xff0c;并得到预测结果4.绘制结果5.评估 背景 最近学习了一些关于机器学习的内容&#xff0c;做个笔记。 具体步骤 1.环境搭建 需要用到的工具&#xff1a;pycharm&#xff0c;anaco…

Cloudflare始终使用HTTPS且带参数跳转到www的域名

文章目录 设置教程设置图跳转实测 设置教程 关闭 SSL/TLS -> 边缘证书 的 Always Use HTTPS 规则 -> 页面规则 -> URL: http://www.example.com/* 设置成始终使用HTTPS 规则 -> 页面规则 -> URL: example.com/* 设置成 转发URL301重定向到 to https://www.ex…

【深度学习目标检测】七、基于深度学习的火灾烟雾识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法&#xff0c;是YOLO系列算法的最新版本。 YOLO&#xff08;You Only Look Once&#xff09;是一种实时物体检测算法&#xff0c;其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化&#xff0c;提高了检测速度和准确性。…

大数据Doris(三十六):Duplicate 模型(冗余模型)介绍

文章目录 Duplicate 模型(冗余模型)介绍 一、创建doris表 二、插入数据

JVM的类的生命周期

目录 前言 1. 加载&#xff08;Loading&#xff09;&#xff1a; 2. 验证&#xff08;Verification&#xff09;&#xff1a; 3. 准备&#xff08;Preparation&#xff09;&#xff1a; 4. 解析&#xff08;Resolution&#xff09;&#xff1a; 5. 初始化&#xff08;Ini…

一个可以找回误删文件的技巧,抓紧收藏吧

U盘文件夹误删是我们在日常生活中经常会遇到的问题之一&#xff0c;也是一种令人头疼的数据丢失情况。这种情况的发生&#xff0c;往往是由于用户的误操作、病毒攻击或者系统错误等原因引起的。误删文件夹可能会导致重要数据的丢失&#xff0c;从而影响工作、学习或生活。本文将…

HHDESK个性化脚本功能

HHDESK可以把脚本配置在对话框中&#xff0c;生成按钮&#xff0c;便捷操作。 在界面下方的脚本框中&#xff0c;点击“”&#xff0c;选择新建&#xff1b; 随后在弹出框内填写名称及脚本&#xff0c;按需求选择填写参数&#xff0c;及运行过程中是否弹出参数框&#xff1b;…

Qt中moveToThread注意的地方

Qt中的QObject对象默认是在主线程创建的。当使用moveToThread方法将对象移动到其他线程后,对象的构造函数仍然是在主线程执行的。moveToThread方法仅仅是让对象的事件循环、信号槽连接等引用主线程的资源移动到目标线程,但对象本身是不会移动的。 例如: class Work : public …

7. 异常、断言及日志

1.异常 1).什么是异常 异常&#xff0c;就是不正常的意思。指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出了一个异常…