/**************************************************************** * 作者:liuzl * 版权:PCXBC * 创建时间:2022/7/23 16:23:30 * 描述说明: * * 修改标识:PC-2022 * 修改描述: * *****************************************************************/ using Furion; using Mapster; using Microsoft.AspNetCore.Mvc; using Nirvana.Common; using Senparc.Weixin; using Senparc.Weixin.Open; using Senparc.Weixin.Open.OAuthAPIs; using Senparc.Weixin.Open.QRConnect; using Senparc.Weixin.Open.WxaAPIs.Sns; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using YBDevice.Entity; namespace YBDevice.Application.ThirdOpen { /// /// 网页登录处理 /// public class OpenAppService : Controller { private static string AppId = Senparc.Weixin.Config.SenparcWeixinSetting.Items["ybdeviceweb"].WeixinAppId; private static string AppSecret = Senparc.Weixin.Config.SenparcWeixinSetting.Items["ybdeviceweb"].WeixinAppSecret; private static string CDNURL = App.Configuration["CustomSetting:CDNURL"]; private static string BaseState = "ybdevicepage"; /// /// 网站二维码登录 /// /// 要跳转的地址,Base64加密 [Route("web/qr/login")] public IActionResult WebLogin(string url = "") { var redirecturl = $"{CDNURL}/web/qr/info?r={url}"; var scopes = new OAuthScope[] { OAuthScope.snsapi_login }; var result = QRConnectAPI.GetQRConnectUrl(AppId, redirecturl, BaseState, scopes); return Redirect(result); } /// /// 授权成功之后的授权处理 /// /// /// /// /// [Route("web/qr/info")] public async Task InfoAsync(string code, string state, string r = "") { if (string.IsNullOrEmpty(code)) { return Redirect("/error/reject"); } if (state != BaseState) { //实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证 return Redirect("/error/reject?msg=验证失败!请从正规途径进入"); } //通过,用code换取access_token var result = await QRConnectAPI.GetAccessTokenAsync(AppId, AppSecret, code); if (result.errcode != ReturnCode.请求成功) { return Redirect($"/error/reject?msg=错误:{result.errmsg}"); } OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); var data = userInfo.Adapt().ToJson(); if (string.IsNullOrEmpty(r)) { return Content(data); } //对地址进行base64解密 var url = HttpUtility.UrlDecode(Encoding.UTF8.GetString(Convert.FromBase64String(r))); //对data进行URL编码 data = Convert.ToBase64String(Encoding.UTF8.GetBytes(HttpUtility.UrlEncode(data))); if (!url.Contains("info=")) { if (url.Contains("?")) { url = $"{url}&info={data}"; } else { url = $"{url}?info={data}"; } } return Redirect(url); } } }