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

2023-12-15 22:47:15

背景

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

文章来源:https://blog.csdn.net/qq_37237487/article/details/135026108
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。