前言

微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。

微信网页授权是通过OAuth2.0机制实现的,所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。

开发流程

1、新建一个.net core webapi 项目。在NuGet中查找并安装 AspNetCore.Authentication.WeChat 包。

2、修改 appsettings.json 配置文件,增加以下配置:

 "Authentication": {
"WeChat": {
"AppId": "微信AppID",
"AppSecret": "微信AppSecret"
}
},
"Logging": {
"LogLevel": {
"Default": "Debug", //日志级别从低到高,依次为:Debug,Information,Warning,Error,None
"Microsoft.EntityFrameworkCore": "Error",
"System": "Error"
}
}

3、修改 Startup

         services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthentication()
.AddWeChat(wechatOptions =>
{
wechatOptions.AppId = Configuration["Authentication:WeChat:AppId"];
wechatOptions.AppSecret = Configuration["Authentication:WeChat:AppSecret"];
wechatOptions.UseCachedStateDataFormat = true;
});

4、新增 AccountController

     [Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private const string LoginProviderKey = "LoginProvider";
private const string Provider_WeChat = "WeChat";
private readonly ILogger _logger;
private readonly IHttpContextAccessor _contextAccessor; public AccountController(ILogger<AccountController> logger,
IHttpContextAccessor contextAccessor)
{
_logger = logger;
_contextAccessor = contextAccessor;
}
/// <summary>
/// 微信登录
/// </summary>
/// <param name="redirectUrl">授权成功后的跳转地址</param>
/// <returns></returns>
[HttpGet("LoginByWeChat")]
public IActionResult LoginByWeChat(string redirectUrl)
{
var request = _contextAccessor.HttpContext.Request;
var url = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}Callback?provider={Provider_WeChat}&redirectUrl={redirectUrl}";
var properties = new AuthenticationProperties { RedirectUri = url };
properties.Items[LoginProviderKey] = Provider_WeChat;
return Challenge(properties, Provider_WeChat);
}
/// <summary>
/// 微信授权成功后自动回调的地址
/// </summary>
/// <param name="provider"></param>
/// <param name="redirectUrl">授权成功后的跳转地址</param>
/// <returns></returns>
[HttpGet("LoginByWeChatCallback")]
public async Task<IActionResult> LoginByWeChatCallbackAsync(string provider = null, string redirectUrl = "")
{
var authenticateResult = await _contextAccessor.HttpContext.AuthenticateAsync(provider);
if (!authenticateResult.Succeeded) return Redirect(redirectUrl);
var openIdClaim = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier);
if (openIdClaim == null || openIdClaim.Value.IsNullOrWhiteSpace())
return Redirect(redirectUrl);
//TODO 记录授权成功后的微信信息
var city = authenticateResult.Principal.FindFirst("urn:wechat:city")?.Value;
var country = authenticateResult.Principal.FindFirst(ClaimTypes.Country)?.Value;
var headimgurl = authenticateResult.Principal.FindFirst(ClaimTypes.Uri)?.Value;
var nickName = authenticateResult.Principal.FindFirst(ClaimTypes.Name)?.Value;
var openId = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var privilege = authenticateResult.Principal.FindFirst("urn:wechat:privilege")?.Value;
var province = authenticateResult.Principal.FindFirst("urn:wechat:province")?.Value;
var sexClaim = authenticateResult.Principal.FindFirst(ClaimTypes.Gender);
int sex = ;
if (sexClaim != null && !sexClaim.Value.IsNullOrWhiteSpace())
sex = int.Parse(sexClaim.Value);
var unionId = authenticateResult.Principal.FindFirst("urn:wechat:unionid")?.Value;
_logger.LogDebug($"WeChat Info=> openId: {openId},nickName: {nickName}");
return Redirect($"{redirectUrl}?openId={openIdClaim.Value}");
}
}

5、将网站发布到外网,请求

https://你的授权域名/api/account/LoginByWeChat?redirectUrl=授权成功后要跳转的页面

即可调起微信授权页面。

注意

微信授权必须使用https

微信开放平台和微信公众平台都有提供网站用微信登录的接口,前者适用于任何网站,后者只适用于微信服务号的内嵌网站

本篇相关源码地址:https://github.com/ren8179/QrF.OAuth.WeChat/tree/master

最新文章

  1. PBR
  2. java 22 - 21 多线程之多线程的代码实现方式3
  3. Yii2 rules验证规则
  4. linux访问windows共享文件夹的方法
  5. 第二篇:SOUI源码的获取及编译
  6. 为benchmarksql的PostgreSQL java驱动进行升级
  7. 下载和使用 Open XML PowerTools
  8. vbox里面的Ubuntu虚拟机与主机win7之间设置共享文件夹
  9. poj 2926 Requirements
  10. [译]Stairway to Integration Services Level 11 - 日志配置
  11. jQuery + json 实现省市区三级联动
  12. MCMC(四)Gibbs采样
  13. 【JavaScript函数】
  14. web前端UI框架
  15. phantomjs Can not connect to the Service phantomjs错误
  16. HDU 1034(传递糖果 模拟)
  17. java框架之SpringBoot(5)-SpringMVC的自动配置
  18. J - S-Nim
  19. Shell脚本交互之:自动输入密码
  20. verilog语法实例学习(8)

热门文章

  1. Maven入门-依赖管理(Jar包管理)(二)
  2. WinEdt 和 Sumatra 双向关联设置
  3. SpringBoot注册Servlet、Filter、Listener
  4. sublime3添加python编译系统
  5. mysql授权报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  6. CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解
  7. linux设备模型:扩展篇
  8. PYTHON-操作系统基础-2-练习
  9. Win7 x64 svn 服务器搭建
  10. Jmeter安装和启动和使用