.Net之微信小程序获取用户UnionID

前言:

  在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理)。这段时间就有一个这样的需求,之前有个客户做了一个微信小程序商城(店主端的),然后现在又要做一个会员购物端的小程序商场。首先之前用户登录凭证都是使用微信openid来做的唯一标识,而现在客户需求是要做到用户在会员端小程序跳转到到店主端小程序假如之前该用户微信是在店主端审核通过的用户则不需要在进行资料提交审核操作,直接登录。所以,所以我们使用了UnionID来进行关联,如下是我们现在项目的基本流程(画的丑莫见怪)。

640?wx_fmt=png

说说UnionID机制:

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

官方UnionID机制详细说明:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html

微信开放平台绑定小程序流程:

登录微信开放平台 — 管理中心 — 小程序 — 绑定小程序(直接使用微信官方图)

640?wx_fmt=png

微信小程序获取UnoinID的两种方式:


调用接口 wx.getUserInfo,从解密数据(encryptedData)中获取 UnionID(推荐使用):

推荐使用原因:无需关注微信公众号即可获取到UnionID。

调用接口wx.getUserInfo前提:用户允许授权获取用户信息!


开发者后台校验与解密开放数据:

  微信为了保证用户信息,把用户通过wx.getUserInfo接口获取到的相关敏感信息进行了加密。加密方式对称加密(后面会提到),首先我们需要通过微信小程序登录流程获取到用户的session_key(会话密钥),然后我们可以报获取到的会话密钥使用缓存存起来,在通过用户授权获取用户相关信息,如下是用户授权成功获取到的用户信息:

640?wx_fmt=png


基本流程图如下:

640?wx_fmt=png


(encryptedData)加密数据解密算法:

开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。

  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。

  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。

  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回

很遗憾的是微信居然没有为我们大.Net提供解密算法demo,实属让人不算,最后自己根据网上的资料还是配上了符合微信对称加密的解密算法。

代码实现:

首先关于session_key(会话密钥)的获取,请看下面的wx.login+code2Session 方式


调用接口wx.getUserInfo获取encryptedData(加密数据)和iv(初始向量):

640?wx_fmt=png



.Net WebApi 解密数据接口:

640?wx_fmt=png

640?wx_fmt=png



注意参数使用Convert.FromBase64String转化,提示“Base-64字符数组的无效长度” 的问题:

原因:加密参数中的"+"通过地址栏传过来时,后台会解析为空格。

解决:最好的做法是 使用encryptedData.Replace("+", "%2B")先将空格编码,然后再作为参数传给另一页面传递,这样页面在提取参数时才会将“%2B”解码为加号.但这儿为了简化,将空格直接还原为"+"或者是直接在后台将空格替换为“+”encryptedData.Replace(' ', '+');


直接通过 wx.login + code2Session 获取到该用户 UnionID:


其实这个方式就是实现了小程序的登录流程,微信官方详细说明:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

优点:无需用户授权。

前提:用户需要关注该微信公众号。


小程序端调用接口wx.login获取code凭证,在通过请求auth.code2Session接口获取用户信息(UnionID,openid,session_key会话密钥)两种方式:

1.直接通过wx.login请求到code凭证后,在请求该地址获取用户信息:

详细说明请看微信官方文档(代码略):https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

2.通过请求wx.login获取code凭证,在向.net webapi后端请求code2Session接口:

原因:因为我们需要对获取的用户信息做相关业务逻辑处理。

微信小程序端代码:
/**
*封装用户promise登录,通过code凭证获取用户信息(UnionID,openid,session_key会话密钥)
*/
userLogin: function() {
var that = this;
//定义promise方法
return new Promise(function(resolve, reject) {
//调用登录接口
wx.login({
success: function(res) {
if (res.code) {
console.log("用户登录授权code为:" + res.code);
//调用wx.request请求传递code凭证换取用户openid,并获取后台用户信息
wx.request({
url: 'https://www.xxxx.xxx.api/User_oAuth/GetUserInfo',//后台请求用户信息方法
data: {
code: res.code //code凭证
},
header: {
'content-type':'application/json' // 默认值
},
success(res) {
console.log(res.data)
if (res.data.errcode == 0) {
//存入session缓存中
console.log(res.data.openid);//微信用户唯一标识
console.log(res.data.UnionID);//微信开发平台联合ID
console.log(res.data.session_key);//会话密钥
//***注意****
//注意:这里是直接把session_key缓存起来,在上面wx.getUserInfo会使用到
wx.setStorageSync("session_key",res.data.session_key);
//promise机制放回成功数据 
resolve(res.data);
} else
{ reject('error'); }
}, fail: function(res)
{
reject(res);
wx.showToast({ title: '系统错误' })
}, complete: () => { } //complete接口执行后的回调函数,无论成功失败都会调用
}) } else
{
reject("error");
}}
})
})}
.Net WebApi 请求用户信息接口:

640?wx_fmt=png

640?wx_fmt=png

原文链接:https://www.cnblogs.com/Can-daydayup/p/11437754.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

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

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

相关文章

自由源自于自律 及其他三则分享

Office 365 官方公众号的新创深度内容推荐竹板这么一打呀,别的咱不夸,单说我们的Office 365官方公众号(“微软Office365”),近一段时间来在内容创作上面有一些新的突破——推出了一个关于探讨大脑及思维运作的专题。请…

2019-03-11-算法-进化(求众数)

题目描述 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在众数。 示例 1: 输入: [3,2,3] 输出: 3示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2思路&#xff1a…

淘宝商品数据库设计的一些经验

前言这几个月都在做一个通过淘宝API线下管理淘宝店的系统,学习了很多东西,这里想对淘宝商品表设计用自己的想法表现出来,如果你觉得很扯淡,可以写下自己的看法.OK,切入正题.淘宝的商品这块的复杂程度,是我见…

2019-03-11-算法-进化(搜索二维矩阵II)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列每列的元素从上到下升序排列 示例: 现有矩阵 matrix 如下: [[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9…

A and B and Lecture Rooms

A and B and Lecture Rooms 题意要求我们找有多少个点iii满足dis(i,x),dis(i,y)dis(i, x), dis(i, y)dis(i,x),dis(i,y),输出点iii的数量即可。 首先特判无解的情况就是dis(x,y)dis(x, y)dis(x,y)为奇数时,接下来我们讨论有解的情况,大致分…

DevOps之持续集成SonarQube代码质量扫描

SonarQube是一个用于代码质量检测管理的开放平台,可以集成不同的检测工具,代码分析工具,以及持续集成工具。SonarQube 并不是简单地把不同的代码检查工具结果直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理&a…

变量(网络流模型)

变量 首先最终答案的形式一定是每个变量前面对应一个系数,然后加上一些绝对值,由于每个变量只有两种取法,所以我们考虑使用最小割处理,对于每个变量建一个点分别连到S和T,然后表示选择取哪个,然后会有一边是…

使用VS Code 开发.NET CORE 程序指南

1. 前言近两年来,很多前端的同学都开始将 VSCode 作为前端主力开发工具,其丰富的扩展给程序开发尤其是前端开发带来了很多便利,但是作为微软主力语言的 .NET,却由于有宇宙第一IDE Visual Studio存在,很少有看到有后端同…

用pythonnet为计算机视觉做图像整理

中国的.NETer是国内技术的另类,当他们强调.NET也可以做啥啥时都会给别的技术藐视,毕竟主流都不用.NET。本人这几年其实花在.NET时间也少,都投入在Python/Go社区。可我还是有点工作外的寄托,就是让.NET也有一个很好的推广&#xff…

ABP虚拟文件系统(VirtualFileSystem)实例------定制菜单栏显示用户姓名

ABP默认的MVC启动模板在登录后, 右上角显示的是用户名:如果想让它显示用户的姓名该如何做呢?这就需要用到ABP一个非常强大的功能------虚拟文件系统.前期准备使用ABP CLI创建一个名为AbpStudy的ASP.NET MVC项目:abp new AbpStudy关于MVC的启动模板可以看文档, 这里就不赘述.虚…

.NET中国峰会 参与意愿调查

2014年微软组织成立.NET基金会,微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会, 仅在平台项目中,.NET平台上有87%贡献者其实不在Microsoft工作。将.NET基金会变成一个更加多样化和成员驱动的组…

听我的!美国科技公司这样做Code Review

Code Review,在当代的软件开发中占有重要的一环。虽然国内各大主流公司都已经参照国外同行设立了比较严格的Code Review机制,但是还是有好多大型软件公司以及中小型软件公司还未推行这一重要制度。那么在美国的科技企业中,Code Review推行的怎…

程序员过关斩将--互联网人必备知识cookie和session认证

菜菜,上次你说的cookie和session的文章,我觉得不太具体那你想怎么样具体呢?我自己从网上查了一下,很多关于cookie和session认证的,能不能给我讲讲用户认证呀,可以呀这样我下次再去面试,有可能会…

2019-03-15-算法-进化(有效的数独)

题目描述 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。 数独…

net core WebApi——尝试企业微信来开发企业内部应用

前言这几天忙活着别的东西,耽误了很长时间,从文件操作完了之后就在考虑着下一步鼓捣点儿啥,因为最开始的业务开发就是企业微信相关的,这刚好来做个内部应用的小例子玩玩。企业微信前身是企业号,当时微信主推的还是公众…

微软发布了开发社区采用.NET Standard的最新信息

最近,微软发布了开发社区当前采用.NET Standard的最新信息。.NET Standard是API的正式规范,现有.NET实现在不同平台的是通用的(从而允许跨平台开发)。当前规范(版本2.0)在两年前发布,在.NET Cor…

卓语言对泛型类的使用

上次发了中文编程语言卓语言《小卓.NET中文编程特点介绍》。这篇文章来看下卓语言对泛型类的使用。泛型是现代编程语言很重要的功能。C#语言可以完全定义和使用泛型类型。卓语言是面向广大非专业人员的,为了减低编程难度,没有实现定义泛型类型&#xff0…

AT2675 [AGC018F] Two Trees(欧拉回路)

AT2675 [AGC018F] Two Trees 首先我们看到1或-1,那么就是限制差距在1以内,然后我们可以想到构造一些东西来满足这种东西,然后我们经常利用的就是欧拉回路。 首先这是两个树,然后我们可以根据儿子个数来判断当前点的奇偶性&#x…

.netcore 分布式事务CAP2.6之控制台使用

上一编.netcore 分布式事务CAP2.6 快速入门 讲了cap2.6的快速入门,这次我们来讲讲在控制台中如何使用cap2.6。因为cap2.6的内存模式目前已经可以使用了,相关组件已经更新,所以这次我们以简单的内存模式为例。1:创建项目创建一个名…

TestinPro应用与DevOps之路

文 | 中国农业银行软件研发中心 系统支持部 王晓昕 程伟静 胡莉莉Testin Pro(云测平台)是一款移动端自动化测试平台工具,帮助用户实现移动端测试自动化,是一套设备统一调配、软硬件一体化的移动端测试方案。Testin Pro具有在线录制…