using DotNetCore.CAP; using Furion; using Furion.DistributedIDGenerator; using Microsoft.AspNetCore.Mvc; using Nirvana.Common; using Senparc.Weixin.MP; using Senparc.Weixin.MP.AdvancedAPIs; using Senparc.Weixin.MP.AdvancedAPIs.OAuth; using Senparc.Weixin.MP.Helpers; using System.Text; using System.Web; using YBDevice.Body.BodyFatHelper; using YBDevice.Entity; namespace YBDevice.NApi.Controllers { /// /// 扫码流程处理 /// public class QrController : WebBaseController { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IOrderService _orderService; private readonly IDeviceService _deviceService; private readonly INoticeService _noticeService; private readonly IMPService _mPService; private readonly ICapPublisher _capBus; public QrController(IHttpContextAccessor httpContextAccessor, IOrderService orderService, IDeviceService deviceService, INoticeService noticeService, IMPService mPService, ICapPublisher capPublisher) { _httpContextAccessor = httpContextAccessor; _orderService = orderService; _deviceService = deviceService; _noticeService = noticeService; _mPService = mPService; _capBus = capPublisher; } #region 固定贴纸处理 /// /// 扫码主入口,针对固定的贴纸二维码,即可跳转到小程序又可关注公众号也可跳转链接 /// /// 产品序列号 /// public async Task r(string sn) { //sn过滤空格 sn = sn.ToStr(); if (sn == "L228000103") { return Redirect($"https://ijt.pcxbc.com/qr/r/MA==?t=7"); } //是否跳转到新平台 if (await _orderService.IsNewPlatformAsync(sn)) { return Redirect($"{App.Configuration["CustomSetting:NewPltUrl"]}/qr/r?sn={sn}"); } //对参数进行base64编码 var data = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{sn}")); var url = $"{Configs.GetString("APIURL")}/Qr/e?data={data}"; //对url进行base64编码 url = Convert.ToBase64String(Encoding.UTF8.GetBytes(url)); //跳转授权页面 var state = "xbpage";//用于识别请求可靠性 var redirecturl = $"{Configs.GetString("APIURL")}/Auth/page?r={url}"; var rurl = OAuthApi.GetAuthorizeUrl(appId, redirecturl, state, OAuthScope.snsapi_userinfo); return Redirect(rurl); } /// /// 固定贴纸处理流程 /// /// public async Task eAsync(string data, string info) { var ua = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString(); //对data进行base64解密 var facecode = Encoding.UTF8.GetString(Convert.FromBase64String(data)); //对info进行base64解密,然后urldecode解码 info = HttpUtility.UrlDecode(Encoding.UTF8.GetString(Convert.FromBase64String(info))); UserBaseInfoS2SDto userInfo = info.ToObject(); Guid eid = Guid.Empty;//错误代码 #region 检查设备 var equ = await _deviceService.GetDeviceAsync(facecode); if (equ == null) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{facecode}", FromInfo = "固定贴纸,设备未找到", UA = ua }); //设备未找到 return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.devnotfound, eid = eid }); } //判断设备是否可用 if (equ.Status == (int)DeviceStatus.Stop) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{facecode}", FromInfo = "固定贴纸,设备已停止运行", UA = ua }); return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.deverror, eid = eid }); } //判断设备是否激活 if (!equ.ActiveTime.HasValue || equ.Status == DeviceStatus.UnActive) { await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = IDGen.NextID(), Info = $"参数:{facecode}", FromInfo = "固定贴纸,设备未激活", UA = ua }); //跳转到打开设备管理小程序的页面 //获取设备绑定的设备管理小程序 var order = await _orderService.GetDevMagOrderAsync(equ, userInfo); return RedirectToAction("bmini", new { sn = order.appid, page = order.content, n = order.NickName, h = order.HeadImg }); } #endregion 检查设备 //根据设备绑定的订单,跳转到不同的页面 var orderinfo = await _orderService.GetOrderByStickerAsync(equ, userInfo, 2); if (orderinfo == null) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{facecode}", FromInfo = "固定贴纸,未找到可用的订单", UA = ua }); return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.NoOrder, eid = eid }); } //订单信息有误 if (orderinfo.code > 0) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{facecode},返回:{orderinfo.code}", FromInfo = "固定贴纸,获取订单失败", UA = ua }); return RedirectToAction("error", new { msg = orderinfo.code, eid = eid }); } //保存记录 await _orderService.InsertResultAsync(equ, userInfo, orderinfo); var jsondata = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{orderinfo.ToJson()}")); return RedirectToAction("f", new { info = jsondata }); } /// /// 二维码展示页面 /// /// /// public async Task fAsync(string info = "") { var str = Encoding.UTF8.GetString(Convert.FromBase64String(info)); var orderinfo = str.ToObject(); //针对小程序,跳转路径携带fid参数表示用户粉丝唯一标识 if (orderinfo.officetype == (int)OfficeType.MINI) { orderinfo.content = orderinfo.content.Contains("?") ? $"{orderinfo.content}&fid={orderinfo.WxFansId}" : $"{orderinfo.content}?fid={orderinfo.WxFansId}"; } ViewData["orderinfo"] = orderinfo; //根据设备类型跳转到不同的页面 string url = Request.AbsoluteUri(); JsSdkUiPackage jssdkpackage = await _mPService.GetJsSdkUiPackageAsync(url); return View(jssdkpackage); } #endregion 固定贴纸处理 #region 八电极绑定,暂时不用,20210904 /// /// 绑定入口 /// /// 设备机器码 /// 设备类型 /// [WeChatFilter] public IActionResult b(string sn, string t = "2") { //对参数进行base64编码 var data = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{sn},{t}")); var url = $"{Configs.GetString("APIURL")}/Qr/body?data={data}"; //对url进行base64编码 url = Convert.ToBase64String(Encoding.UTF8.GetBytes(url)); //跳转授权页面 var state = "xbpage";//用于识别请求可靠性 var redirecturl = $"{Configs.GetString("APIURL")}/Auth/page?r={url}"; var rurl = OAuthApi.GetAuthorizeUrl(appId, redirecturl, state, OAuthScope.snsapi_userinfo); return Redirect(rurl); } /// /// 设备绑定页面,只针对wifi绑定版 /// /// /// /// [WeChatFilter] public async Task BodyAsync(string data, string info) { var ua = _httpContextAccessor.HttpContext.Request.Headers["User-Agent"].ToString(); //对data进行base64解密 var resultdata = Encoding.UTF8.GetString(Convert.FromBase64String(data)); var arr = resultdata.Split(','); //数据格式不正确 if (arr.Length != 2) { return View(); } //内容为sn,t //二维码生成规格则:http://ybapi.ybhdmob.com/qr/b?sn=设备码&t=2 //示例:http://ybapi.ybhdmob.com/qr/b?sn=b00001&t=2 var ecode = arr[0];//格式:设备机器码 var type = arr[1];//默认为2 //对info进行base64解密,然后urldecode解码 info = HttpUtility.UrlDecode(Encoding.UTF8.GetString(Convert.FromBase64String(info))); OAuthUserInfo userInfo = info.ToObject(); Guid eid = Guid.Empty;//错误代码 #region 检查设备 var equ = await _deviceService.GetDeviceByEcodeAsync(ecode); if (equ == null) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{resultdata}", FromInfo = "八电极绑定页面,设备未找到", UA = ua }); //设备未找到 return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.devnotfound, eid = eid }); } //判断设备是否激活 if (!equ.ActiveTime.HasValue //|| equ.EndTime < DateTime.Now || equ.Status == DeviceStatus.UnActive) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{resultdata}", FromInfo = "八电极绑定页面,设备未激活", UA = ua }); return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.devnotactive, eid = eid }); //跳转到设备激活页面 //return Redirect($"/Device/Active?ecode={ecode}&type={type}"); } //判断设备是否可用 if (equ.Status == (int)DeviceStatus.Stop) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{resultdata}", FromInfo = "八电极绑定页面,设备已停止运行", UA = ua }); return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.deverror, eid = eid }); } #endregion 检查设备 #region 生成要展示的公众号 var order = await _orderService.GetAsync(equ, userInfo, 1, true); if (order == null || order.code != 0) { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{resultdata}", FromInfo = "八电极绑定页面,获取订单失败", UA = ua }); //跳转到未找到可用公众号的错误页面 return RedirectToAction("error", new { msg = order != null ? order.code : (int)ErrorInfoDesc.NoOrder, eid = eid }); } //如果是关注公众号 if (order.type == OrderType.Office) { //记录结果,返回二维码信息 ViewData["ercode"] = order.content; ViewData["vrcode"] = order.vrcode; ViewData["officetype"] = order.officetype; } //如果是链接地址 else if (order.type == OrderType.URL) { //直接跳转页面,要进行计费,待完善,20210317 return Redirect(order.content); } else { eid = IDGen.NextID(); await _capBus.PublishAsync("system.service.insertnoticelogger", new YB_NoticeLogger { UserInfo = info, Id = eid, Info = $"参数:{resultdata}", FromInfo = "八电极绑定页面,此订单类型不支持", UA = ua }); //跳转到此功能只能开发中 return RedirectToAction("error", new { msg = (int)ErrorInfoDesc.develop, eid = eid }); } #endregion 生成要展示的公众号 return View(); } /// /// 八电极数据结果展示 /// /// /// sn|weight|height|lefthandimp|righthandimp|leftfootimp|rightfootimp|bodyimp /// /// [WeChatFilter] public async Task brAsync(string d) { var arr = d.Split('|'); int code = 0; if (arr.Length != 9) { code = 1; } else { string sn = arr[0]; decimal weight = arr[1].ToDecimal(); decimal height = arr[2].ToDecimal(); int age = 20; GenderType sex = GenderType.Male; decimal lefthandimp = arr[3].ToDecimal(); decimal righthandimp = arr[4].ToDecimal(); decimal leftfootimp = arr[5].ToDecimal(); decimal rightfootimp = arr[6].ToDecimal(); decimal bodyimp = arr[7].ToDecimal(); var bodyService = App.GetService(); var bodyresult = await bodyService.CalcBody120FatAsync(weight, height, age, sex, lefthandimp, righthandimp, leftfootimp, rightfootimp, bodyimp); ViewData["sn"] = sn; ViewData["weight"] = weight; ViewData["height"] = height; ViewData["lefthandimp"] = lefthandimp; ViewData["righthandimp"] = righthandimp; ViewData["leftfootimp"] = leftfootimp; ViewData["rightfootimp"] = rightfootimp; ViewData["bodyimp"] = bodyimp; ViewData["age"] = age; ViewData["sex"] = sex == GenderType.Male ? "男" : "女"; ViewData["bodyresult"] = bodyresult; } return View(code); } #endregion 八电极绑定,暂时不用,20210904 /// /// 信息错误页面 /// /// 错误信息代码 /// 错误代码ID /// [WeChatFilter] public IActionResult Error(int msg, string eid) { var errmsg = EnumHelper.GetEnumDictionary().FirstOrDefault(x => x.Key == msg).Value; ViewData["code"] = $"YBERROR-{eid}"; ViewData["message"] = $"{errmsg}"; return View(); } /// /// 跳转到商户端小程序页面 /// /// /// 小程序路径 /// 小程序昵称 /// 小程序头像 /// [WeChatFilter] public async Task BMiniAsync(string sn, string page = "pages/index/index", string n = "", string h = "") { string url = Request.AbsoluteUri(); var jssdkpackage = await _mPService.GetJsSdkUiPackageAsync(url); ViewData["username"] = sn; ViewData["page"] = page; ViewData["nickname"] = n; ViewData["headimg"] = h; return View(jssdkpackage); } /// /// 跳转到出入境小程序 /// /// [WeChatFilter] public async Task crj() { string url = Request.AbsoluteUri(); var jssdkpackage = await _mPService.GetJsSdkUiPackageAsync(url); //var jssdkpackage = new JsSdkUiPackage("", "", "", ""); return View(jssdkpackage); } /// /// 测量二维码关注公众号之后的图文跳转页面 /// /// 用户openid,base64加密 /// 用户appdi,base64加密 /// 用户wxfansid /// /// 1-认证的服务号关注事件,2-认证的服务号扫码事件,3-非认证关注事件,4-回复关键字,5-第一次打开落地页,6-非认证扫码事件 /// /// 记录ID /// [WeChatFilter] public async Task sAsync(string openid, string aid, string fansid, int type, Guid? rid) { string url = Request.AbsoluteUri(); string appid = Encoding.UTF8.GetString(Convert.FromBase64String(aid)); string oid = Encoding.UTF8.GetString(Convert.FromBase64String(openid)); //取绑定的小程序 var orderinfo = await _orderService.HandlerResultSubscribeAsync(appid, oid, type, fansid, rid); var jssdkpackage = await _mPService.GetJsSdkUiPackageAsync(url); ViewData["username"] = orderinfo.appid; ViewData["page"] = orderinfo.content; ViewData["nickname"] = orderinfo.NickName; ViewData["headimg"] = orderinfo.HeadImg; return View(jssdkpackage); } /// /// 固定贴纸关注公众号之后的图文跳转页面 /// /// 用户openid,base64加密 /// 用户appdi,base64加密 /// 用户wxfansid /// /// 1-认证的服务号关注事件,2-认证的服务号扫码事件,3-非认证关注事件,4-回复关键字,5-第一次打开落地页,6-非认证扫码事件 /// /// 测量记录ID /// [WeChatFilter] public async Task tAsync(string openid, string aid, string fansid, int type, Guid? rid) { string url = Request.AbsoluteUri(); string appid = Encoding.UTF8.GetString(Convert.FromBase64String(aid)); string oid = Encoding.UTF8.GetString(Convert.FromBase64String(openid)); var orderinfo = await _orderService.HandlerStickySubscribeAsync(appid, oid, type, fansid, rid); var jssdkpackage = await _mPService.GetJsSdkUiPackageAsync(url); ViewData["username"] = orderinfo.appid; ViewData["page"] = orderinfo.content; ViewData["nickname"] = orderinfo.NickName; ViewData["headimg"] = orderinfo.HeadImg; return View(jssdkpackage); } } }