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);
}
}
}