using DotNetCore.CAP; using Mapster; using Microsoft.AspNetCore.Mvc; using Nirvana.Common; using Senparc.Weixin; using Senparc.Weixin.MP; using Senparc.Weixin.MP.AdvancedAPIs; using Senparc.Weixin.MP.AdvancedAPIs.OAuth; using Senparc.Weixin.MP.Helpers; using System; using System.Text; using System.Threading.Tasks; using System.Web; using YBDevice.Core; using YBDevice.Entity; namespace YBDevice.NApi.Controllers { public class AuthController : WebBaseController { private readonly ILoggerService _loggerService; private readonly ICapPublisher _capBus; public AuthController(ILoggerService loggerService, ICapPublisher capPublisher) { _loggerService = loggerService; _capBus = capPublisher; } /// /// 授权页面,弹出窗口 /// /// 最终要跳转的url,base64加密 /// [WeChatFilter] public IActionResult Index(string r = "") { var state = "xbpage";//用于识别请求可靠性 var redirecturl = $"{Configs.GetString("DOMAIN")}/Auth/page?r={r}"; var url = OAuthApi.GetAuthorizeUrl(appId, redirecturl, state, OAuthScope.snsapi_userinfo); return Redirect(url); } /// /// 授权页面,静默授权,只能拿到openid /// /// 最终要跳转的url,base64加密 /// [WeChatFilter] public IActionResult BIndex(string r = "") { var state = "xbpage";//用于识别请求可靠性 var redirecturl = $"{Configs.GetString("DOMAIN")}/Auth/page?r={r}"; var url = OAuthApi.GetAuthorizeUrl(appId, redirecturl, state, OAuthScope.snsapi_base); return Redirect(url); } /// /// 授权成功之后的跳转页面 /// /// /// /// /// [WeChatFilter] public async Task PageAsync(string code, string state, string r) { if (string.IsNullOrEmpty(code)) { ViewBag.message = "您拒绝了授权"; return View(nameof(Reject)); } if (state != "xbpage") { //实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证 return RedirectToAction(nameof(ErrorInfo), new { msg = "验证失败!请从正规途径进入" }); } //通过,用code换取access_token var result = OAuthApi.GetAccessToken(appId, appSecret, code); if (result.errcode != ReturnCode.请求成功) { //记录到日志中 var msg = $"授权成功之后的跳转页面,code={code},state={state},r={r},result={result.ToJson()}"; _loggerService.AddLogger(msg); return RedirectToAction(nameof(ErrorInfo), new { msg = "错误:" + result.errmsg }); } try { //已关注,可以得到详细信息 OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); //昵称会做url编码 //if (!string.IsNullOrEmpty(userInfo.nickname)) //{ // userInfo.nickname = HttpUtility.UrlEncode(userInfo.nickname, Encoding.UTF8); //} //如果没有传递url参数,则跳转到默认地址上 var data = userInfo.Adapt().ToJson(); if (string.IsNullOrEmpty(r)) { return Content(data); } //对地址进行base64解密 var url = Encoding.UTF8.GetString(Convert.FromBase64String(r)); if (url.Contains("?")) { //对data进行URL编码 data = Convert.ToBase64String(Encoding.UTF8.GetBytes(HttpUtility.UrlEncode(data))); url = $"{url}&info={data}"; } else { url = $"{url}?info={data}"; } //记录粉丝信息 await _capBus.PublishAsync("fans.service.update", new YB_WXFans { HeadImgUrl = userInfo.headimgurl.ToStr(), NickName= userInfo.nickname.ToStr(), Sex = 0, City = "", Country = "", Province = "", FansId = userInfo.unionid.ToStr(), OldOpenId = userInfo.openid.ToStr() }); return Redirect(url); } catch (Exception ex) { var msg = $"code={code},state={state},r={r}"; _loggerService.AddErrorLogger(ex, msg, "授权成功之后的跳转页面"); return RedirectToAction(nameof(ErrorInfo), new { msg = "错误:" + ex.Message }); } } /// /// 拒绝授权页面 /// /// public IActionResult Reject() { ViewData["message"] = "授权已拒绝"; return View(); } /// /// 错误页面 /// /// /// public IActionResult ErrorInfo(string msg = "") { ViewBag.message = msg; return View(); } } }