WebAPI 微信小程序的授权登录以及实现
这个星期最开始 ,老大扔了2个任务过来,这个是其中之一。下面直接说步骤:
1. 查阅微信开发文档
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
我将两个重要的地方列出来
a 登录流程时序图,及说明
登录流程时序

说明:
- 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
- 会话密钥
session_key是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。 - 临时登录凭证 code 只能使用一次
b. auth.code2Session 的文档说明
auth.code2Session
本接口应在服务器端调用,详细说明参见服务端API。
登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见 小程序登录。
请求地址
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| appid | string | 是 | 小程序 appId | |
| secret | string | 是 | 小程序 appSecret | |
| js_code | string | 是 | 登录时获取的 code | |
| grant_type | string | 是 | 授权类型,此处只需填写 authorization_code |
返回值
Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
|---|---|---|
| openid | string | 用户唯一标识 |
| session_key | string | 会话密钥 |
| unionid | string | 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见UnionID 机制说明。 |
| errcode | number | 错误码 |
| errmsg | string | 错误信息 |
errcode 的合法值
| 值 | 说明 | 最低版本 |
|---|---|---|
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| 0 | 请求成功 | |
| 40029 | code 无效 | |
| 45011 | 频率限制,每个用户每分钟100次 |
2. WebAPI 实现代码:主要包含三部分
第一部分:建立处理传入参数和返回参数的Model
微信小程序传入参数Model
public class WeXinLoginInModel
{
/// <summary>
/// 小程序appid
/// </summary>
public string AppId { get; set; }
/// <summary>
/// 小程序appSecret
/// </summary>
public string AppSecret { get; set; }
/// <summary>
/// 小程序code
/// </summary>
public string Code { get; set; }
}
小程序所需返回参数Model
public class WeXinLoginResultModel
{
/// <summary>
/// 用户唯一标识
/// </summary>
public string OpenId { get; set; }
/// <summary>
/// 会话密钥
/// </summary>
public string Session_Key { get; set; }
/// <summary>
/// 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见UnionID 机制说明。
/// </summary>
public string Unionid { get; set; }
/// <summary>
/// 错误码
/// </summary>
public int ErrCode { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string ErrMsg { get; set; }
/// <summary>
/// Redis里面OpenId值所对应的键OpenIdKey
/// </summary>
public string OpenIdKey { get; set; }
/// <summary>
/// Redis里面Session_Key值所对应的键SessionKey
/// </summary>
public string SessionKey { get; set; }
}
第二部分:WebAPI里面写方法,
调用 auth.code2Session里面的请求地址,然后将返回结果中的OpenId、Session_Key以键值对的形式存储起来,而且将键名称相关的信息返回给微信端。
[HttpGet("~/api/WeiXinLogin", Name = "WeiXinLogin")]
public async Task<IActionResult> WeiXinLogin(string js_code)
{
WeXinLoginInModel weixin = new WeXinLoginInModel();
weixin.AppId = "wx30a387595dafb442"; //固定值,请参照小程序参数说明
weixin.AppSecret = "4e24cab02422082b11a406595dacee76";///固定值,请参照小程序参数说明
weixin.Code = js_code; //不固定
string param = $"?appid={weixin.AppId}&secret={weixin.AppSecret}&js_code={weixin.Code}&grant_type=authorization_code";
; string url = "https://api.weixin.qq.com/sns/jscode2session"+param;
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
using (var http = new HttpClient(handler))
{
//await异步等待回应
var response = await http.GetAsync(url);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
var a= response.StatusCode;
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
string responseContent= await response.Content.ReadAsStringAsync();
var resultModel= JsonConvert.DeserializeObject<WeXinLoginResultModel>(responseContent);
if(!string.IsNullOrEmpty(resultModel.OpenId) && !string.IsNullOrEmpty(resultModel.Session_Key))
{
//将openid,session_key存入到Redis缓存中;
string openIdKey = "openIdKey_" + Guid.NewGuid().ToString();
string sessionKey = "sessionKey_" + Guid.NewGuid().ToString();
_redisCacheManager.Set(openIdKey, resultModel.OpenId, TimeSpan.FromDays());
_redisCacheManager.Set(sessionKey, resultModel.Session_Key, TimeSpan.FromDays());
resultModel.OpenIdKey = openIdKey;
resultModel.SessionKey = sessionKey;
}
//返回结果
return Ok(resultModel);
}
}
第三部分:微信端将键名称存入storage值,
方便下次发起业务请求时带上这个Storage值,去后端验证OpenId、Session_Key是否有值,若有值,返回业务数据。
公司老大说他用Token, 后面我没做了,过程省略。现提供后续思路如下:Storage值里面取出openIdKey、SessionKey——Redis 缓存里面根据openIdKey、SessionKey 取出openId、Session_Key——如果openId、Session_Key里面有值,说明该用户前面登录过,有权进行接下来的业务操作
WebAPI 微信小程序的授权登录以及实现的更多相关文章
- 微信小程序第三方授权登录
登录流程时序图: 1.调用uni.getProvider()获取服务供应商,参数service确定是选择对应的什么操作,此处选择授权登录oauth 代码如下: 2.调用登录接口uni.login(), ...
- 关于微信小程序拒绝授权后,重新授权并获取用户信息
最近公司做了一些有关微信小程序的项目,涉及到授权获取用户基本信息,但是在拒绝授权之后就不会再出现授权窗口: 看网上也有很多人遇到了同样的问题,所以记录下来我的处理方法,供大家和自己学习和记录: 当调用 ...
- 微信小程序拒绝授权后重新拉起授权窗口
问题: 在首次进入小程序时,我们常常会收到一些获取权限的申请,比如「获取地理位置权限」.需要微信登录时请求「获得你的公开信息(昵称.头像等)」.对于这些权限申请,开发者当然希望获得所有权限,而用户拒绝 ...
- 微信小程序+php 授权登陆,完整代码
先上图 实现流程: 1.授权登陆按钮和正文信息放到了同一个页面,未授权的时候显示登陆按钮,已授权的时候隐藏登陆按钮,显示正文信息,当然也可以授权和正文分开成两个页面,在授权页面的onlo ...
- 微信小程序实现与登录
一.小程序的实现原理 在小程序中,渲染层和逻辑层是分开的,双线程同时运行,渲染层和逻辑层这两个通信主体之间的通讯以及通讯主体与第三方服务器之间的通信,都是通过微信客户端进行转发.小程序启动运行两种情况 ...
- 微信小程序中用户登录和登录态维护
提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...
- 微信小程序button授权页面,用户拒绝后仍可再次授权
微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js 中的 onLaunch或onShow中加如下代 ...
- 微信小程序API~检查登录状态
wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...
- Python 实现微信小程序的用户登录
小程序可以通过官方提供的登录能力来获取用户身份的标示,具体文档可以参考 这里,通过流程时序可以看到,对于需要和前端配合的服务端开发,主要实现的就是通过小程序提供的 code 换取用户的 openid ...
随机推荐
- 【原创】Android adb错误“'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件。”处理方法
才刚刚接触Android没多久,现在使用adb命令的时候出现错误“'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件.”,如下图所示: 这个问题一般有两种可能: 1.就是没有配置环境变量, ...
- echarts更改坐标轴文字颜色及大小
xAxis: { data: anameArr, axisLabel: { show: true, textStyle: { color: '#c3dbff', //更改坐标轴文字颜色 fontSiz ...
- 机器学习——提升方法AdaBoost算法,推导过程
0提升的基本方法 对于分类的问题,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类的分类规则(强分类器)容易的多.提升的方法就是从弱分类器算法出发,反复学习,得到一系列弱分类器(又 ...
- 奇葩的Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
启动springboot的时候莫名其妙出现这个错误,我properties里面也没配置数据源啥的,但就是出现这个错误 解决方法: 在启动类上加@SpringBootApplication(exclud ...
- L1-006 连续因子 (20分)
题意分析 题目中已经将意思说的很清楚了,就是输出一个数的最长连续因子的个数,并且输出是哪几个因子相乘.可以将题目从这两个角度进行分析: N为素数时,最长连续因子的个数为1,即它自己. N不为素数时,即 ...
- EasyExcel 自定义单元格式的问题。
最近在做一个关于性能测试管理系统,一个新的需求,需要导出测试报告,直接使用了ali的封装的EasyExcel,但是在复杂头与一些样式,就缺少了自定义的灵活性,在官方demo中没有找到很好的解决方法. ...
- [分块][bitset][RMQ]区间
源自 ditoly 大爷的 FJ 省队集训模拟赛题 Statement 给定一个长度为 \(n\) 的序列 \(a\) ,有 \(m\) 次询问 每次询问给出一个 \(k\) ,再给出 \(k\) 个 ...
- MySQL日志及索引
MySQL物理结构: MySQL它是通过文件系统对数据进行储存和管理,从物理结构上分为日志文件和数据文件 日志文件: 日志文件记录了数据库操作的信息和一些错误信息,我们常用的日志文件有:错误日志.二进 ...
- LeetCode 858 镜面反射
题目 有一个特殊的正方形房间,每面墙上都有一面镜子.除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2. 正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接 ...
- CSS-07-CSS文本设置
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...