public async Task <IActionResult> ContentWxAppletQrCode([FromBody] ContentPlayBillModel info)
        {
            CommonResult      result            = new CommonResult();
            YuebonCacheHelper yuebonCacheHelper = new YuebonCacheHelper();

            try
            {
                if (info == null)
                {
                    return(ToJsonContent(result));
                }
                string page  = info.Page;   //此接口不可以带参数,如果需要加参数,必须加到scene中
                string scene = info.Scene;; //id=xxxxxx,scene最多允许32个字符
                int    width = string.IsNullOrEmpty(info.Width.ToString()) ? 480 : info.Width.ToInt();

                //图片名称
                string picname       = "ref" + width + GuidUtils.CreateNo() + ".png";
                var    _tempfilepath = "/upload/contentqrcode/";
                var    uploadPath    = _filePath + _tempfilepath;
                if (!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }
                string       qrcodePicPath = uploadPath + picname;//小程序二维码图片
                MemoryStream ms            = new MemoryStream();
                if (!System.IO.File.Exists(qrcodePicPath))
                {
                    var resultImg = await WxAppApi.GetWxaCodeUnlimitAsync(WxOpenAppId, qrcodePicPath, scene, page, width, false, null, true);

                    if (resultImg.errcode == ReturnCode.请求成功)
                    {
                        result.Success = true;
                        result.ErrCode = ErrCode.successCode;
                        result.ResData = _tempfilepath + picname;
                    }
                    else
                    {
                        result.ErrCode = resultImg.errcode.ToString();
                        result.ErrMsg  = resultImg.errmsg;
                    }
                }
                else
                {
                    result.ErrCode = ErrCode.successCode;
                    result.ErrMsg  = _tempfilepath + picname;
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.Error("代码生成异常", ex);
                result.ErrMsg  = "代码生成异常:" + ex.Message;
                result.ErrCode = ErrCode.failCode;
            }
            return(ToJsonContent(result));
        }
        public async Task <IActionResult> ContentWxAppletQrCodeRes([FromQuery] ContentPlayBillModel info)
        {
            CommonResult      result            = new CommonResult();
            YuebonCacheHelper yuebonCacheHelper = new YuebonCacheHelper();
            MemoryStream      ms = new MemoryStream();

            try
            {
                if (info == null)
                {
                    return(ToJsonContent(result));
                }
                string page      = info.Page;   //此接口不可以带参数,如果需要加参数,必须加到scene中
                string scene     = info.Scene;; //id=xxxxxx,scene最多允许32个字符
                int    width     = string.IsNullOrEmpty(info.Width.ToString()) ? 480 : info.Width.ToInt();
                var    resultImg = await WxAppApi.GetWxaCodeUnlimitAsync(WxOpenAppId, ms, scene, page, width);

                ms.Position = 0;
                if (resultImg.errcode == ReturnCode.请求成功)
                {
                    var imgBase64 = Convert.ToBase64String(ms.GetBuffer());
                    result.Success = true;
                    result.ErrCode = ErrCode.successCode;
                    result.ResData = imgBase64;
                }
                else
                {
                    result.ErrCode = resultImg.errcode.ToString();
                    result.ErrMsg  = resultImg.errmsg;
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.Error("代码生成异常", ex);
                result.ErrMsg  = "代码生成异常:" + ex.Message;
                result.ErrCode = ErrCode.failCode;
            }
            finally{
                ms.Dispose();
            }
            return(ToJsonContent(result));
        }
        public async Task <IActionResult> GetQrCode(string sessionId, string useBase64, string codeType = "1")
        {
            var sessionBag = SessionContainer.GetSession(sessionId);

            if (sessionBag == null)
            {
                return(Json(new { success = false, msg = "请先登录!" }));
            }

            MemoryStream ms        = new MemoryStream();
            var          openId    = sessionBag.OpenId;
            var          page      = "pages/QrCode/QrCode";                                                 //此接口不可以带参数,如果需要加参数,必须加到scene中
            var          scene     = $"OpenIdSuffix:{openId.Substring(openId.Length - 10, 10)}#{codeType}"; //储存OpenId后缀,以及codeType。scene最多允许32个字符
            LineColor    lineColor = null;                                                                  //线条颜色

            if (codeType == "2")
            {
                lineColor = new LineColor(221, 51, 238);
            }

            var result = await WxAppApi.GetWxaCodeUnlimitAsync(WxOpenAppId, ms, scene, page, lineColor : lineColor);

            ms.Position = 0;

            if (!useBase64.IsNullOrEmpty())
            {
                //转base64
                var imgBase64 = Convert.ToBase64String(ms.GetBuffer());
                return(Json(new { success = true, msg = imgBase64, page = page }));
            }
            else
            {
                //返回文件流
                return(File(ms, "image/jpeg"));
            }
        }
        public async Task <IActionResult> ContentPlayBillQrCode(ContentPlayBillModel info)
        {
            CommonResult      result            = new CommonResult();
            YuebonCacheHelper yuebonCacheHelper = new YuebonCacheHelper();
            MemoryStream      ms = new MemoryStream();

            try
            {
                if (info == null)
                {
                    return(ToJsonContent(result));
                }
                string page  = info.Page;   //此接口不可以带参数,如果需要加参数,必须加到scene中
                string scene = info.Scene;; //id=xxxxxx,scene最多允许32个字符

                //图片名称
                string picname       = "ref_" + GuidUtils.CreateNo() + ".jpg";
                var    _tempfilepath = "/upload/" + scene + "/contentqrcode/";
                var    uploadPath    = _filePath + _tempfilepath;
                if (!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }
                string qrcodePicPath = uploadPath + picname;//小程序二维码图片
                var    resultImg     = await WxAppApi.GetWxaCodeUnlimitAsync(WxOpenAppId, qrcodePicPath, scene, page, 280);

                if (resultImg.errcode == ReturnCode.请求成功)
                {
                    string picnameh = "c_" + GuidUtils.CreateNo() + ".jpg";
                    var    sor      = _filePath + "/images/";
                    string qrcodebg = "share_content_bg.jpg";

                    Bitmap   cardbmp = new Bitmap(460, 736);
                    Graphics g       = Graphics.FromImage(cardbmp);
                    g.SmoothingMode      = SmoothingMode.HighQuality;; //抗锯齿
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    g.InterpolationMode  = InterpolationMode.High;
                    g.Clear(System.Drawing.Color.White); //白色填充

                    Bitmap bgimg = new Bitmap(460, 736);
                    //如果背景图片存在,
                    bgimg = (Bitmap)Image.FromFile(qrcodebg); //如果存在,读取背景图片
                    g.DrawImage(bgimg, 0, 0, 460, 736);
                    //合成二维码
                    Bitmap productImg = new Bitmap(128, 128);
                    productImg = (Bitmap)Image.FromFile(qrcodePicPath);
                    g.DrawImage(productImg, 276, 580, 128, 128);
                    //合成文字
                    Font nickName = new Font("微软雅黑", 22);
                    Font adtxt    = new Font("微软雅黑", 18);

                    StringFormat stringFormat = new StringFormat(StringFormatFlags.DisplayFormatControl);
                    Brush        fontBrush    = SystemBrushes.ControlText;
                    stringFormat.Alignment     = StringAlignment.Center;
                    stringFormat.LineAlignment = StringAlignment.Center;
                    RectangleF rectangleF = new RectangleF(40, 500, 380, 80);
                    g.DrawString(info.Title, adtxt, fontBrush, rectangleF, stringFormat);
                    cardbmp.Save(uploadPath + picnameh, ImageFormat.Jpeg);
                    cardbmp.Dispose();
                    ms.Dispose();

                    result.ResData = _tempfilepath + picnameh;
                }
                else
                {
                    result.ErrCode = resultImg.errcode.ToString();
                    result.ErrMsg  = resultImg.errmsg;
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.Error("代码生成异常", ex);
                result.ErrMsg  = "代码生成异常:" + ex.Message;
                result.ErrCode = ErrCode.failCode;
            }
            finally
            {
                ms.Dispose();
            }
            return(ToJsonContent(result));
        }
        public async Task <IActionResult> GetReferralQrCode()
        {
            CommonResult result = new CommonResult();

            try
            {
                MemoryStream ms    = new MemoryStream();
                string       page  = "pages/index/index";         //此接口不可以带参数,如果需要加参数,必须加到scene中
                string       scene = "Ref=" + CurrentUser.UserId; //储存OpenId后缀,以及codeType。scene最多允许32个字符

                //图片名称
                string picname       = "ref_" + GuidUtils.CreateNo() + ".jpg";
                var    _tempfilepath = "/upload/" + CurrentUser.UserId + "/qrcode/";
                var    uploadPath    = _filePath + _tempfilepath;
                if (!Directory.Exists(uploadPath))
                {
                    Directory.CreateDirectory(uploadPath);
                }
                string qrcodePicPath = uploadPath + picname;//小程序二维码图片
                var    resultImg     = await WxAppApi.GetWxaCodeUnlimitAsync(WxOpenAppId, qrcodePicPath, scene, page, 280);

                if (resultImg.errcode == ReturnCode.请求成功)
                {
                    string picnameh = "refs_" + CurrentUser.UserId + ".jpg";
                    var    sor      = _filePath + "/images/";
                    string qrcodebg = "share_bg2.jpg";

                    Bitmap   cardbmp = new Bitmap(1080, 1926);
                    Graphics g       = Graphics.FromImage(cardbmp);
                    g.SmoothingMode      = SmoothingMode.HighQuality;; //抗锯齿
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    g.InterpolationMode  = InterpolationMode.High;
                    g.Clear(System.Drawing.Color.White); //白色填充

                    Bitmap bgimg = new Bitmap(1080, 1926);
                    //如果背景图片存在,
                    bgimg = (Bitmap)System.Drawing.Image.FromFile(sor + qrcodebg); //如果存在,读取背景图片
                    g.DrawImage(bgimg, 0, 0, 1080, 1926);
                    //合成二维码
                    Bitmap productImg = new Bitmap(280, 280);
                    productImg = (Bitmap)System.Drawing.Image.FromFile(qrcodePicPath);
                    g.DrawImage(productImg, 713, 1570, 280, 280);
                    //合成头像
                    Bitmap headerimg = new Bitmap(110, 110);
                    if (CurrentUser.HeadIcon.Contains("wx.qlogo.cn"))
                    {
                        headerimg = ImgHelper.GetNetImg(CurrentUser.HeadIcon);
                    }
                    else
                    {
                        headerimg = ImgHelper.GetNetImg(CurrentUser.HeadIcon);
                        //headerimg = (Bitmap)System.Drawing.Image.FromFile(_filePath + CurrentUser.HeadIcon);
                    }
                    headerimg = ImgHelper.CutEllipse(headerimg, new Rectangle(0, 0, 110, 110), new Size(110, 110));
                    g.DrawImage(headerimg, 100, 1505, 110, 110);

                    //合成文字
                    Font nickName = new Font("微软雅黑", 22);
                    Font adtxt    = new Font("微软雅黑", 26);

                    StringFormat StringFormat = new StringFormat(StringFormatFlags.DisplayFormatControl);
                    g.DrawString(CurrentUser.NickName, nickName, new SolidBrush(System.Drawing.Color.LightGray), 100, 1630, StringFormat);
                    g.DrawString("推荐你一个超棒的汽车工程师圈子”", adtxt, new SolidBrush(System.Drawing.Color.Black), 100, 1680, StringFormat);

                    cardbmp.Save(uploadPath + picnameh, ImageFormat.Jpeg);
                    cardbmp.Dispose();

                    result.ResData = _tempfilepath + picnameh;
                }
                else
                {
                    result.ErrCode = resultImg.errcode.ToString();
                    result.ErrMsg  = resultImg.errmsg;
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.Error("代码生成异常", ex);
                result.ErrMsg  = "代码生成异常:" + ex.Message;
                result.ErrCode = ErrCode.failCode;
            }
            return(ToJsonContent(result));
        }
        public async Task <Result> QRCode()
        {
            var user = await _customerManager.GetUserAsync();

            var appId = WechatService.WxOpenAppId;
            var scene = $"id={user.Id}";
            var page  = "pages/index/index";

            try
            {
                var myShareCodePath = Path.Combine("images", "sharecodes", user.Id + ".png");
                var physicalPath    = Path.Combine(_enviromenet.WebRootPath, myShareCodePath);
                var httpPath        = Request.GetHostUrl() + "/" + myShareCodePath.Replace(@"\", "/");
                if (System.IO.File.Exists(physicalPath))
                {
                    return(Result.Ok(httpPath));
                }

                Image  backgroundImg = null;
                string sharePath     = Path.Combine(_enviromenet.WebRootPath, "images/20210107152422.png");
                // var qrCodeImgDemo = Path.Combine(_enviromenet.WebRootPath, "images/qrcode_example.png");
                if (System.IO.File.Exists(sharePath))
                {
                    backgroundImg = Image.Load(sharePath);
                }

                using (var stream = new MemoryStream())
                {
                    var wxResult = await WxAppApi.GetWxaCodeUnlimitAsync(appId, stream, scene, page);

                    if (wxResult.errcode == 0 && stream.Length > 1024)
                    {
                        Image qrCodeImg = Image.Load <Rgba32>(stream.GetBuffer());

                        if (!string.IsNullOrEmpty(user.AvatarUrl))
                        {
                            using (var httpClient = _httpFactory.CreateClient())
                            {
                                var response = await httpClient.GetAsync(user.AvatarUrl);

                                if (response.IsSuccessStatusCode)
                                {
                                    var avatarStream = await response.Content.ReadAsStreamAsync();

                                    var avatarPoint = 120;
                                    var avatarSize  = 190;
                                    var avatarImg   = Image.Load <Rgba32>(avatarStream).Clone(e => e.ConvertToAvatar(new Size(avatarSize, avatarSize), avatarSize / 2));
                                    qrCodeImg.Mutate(e =>
                                    {
                                        e.DrawImage(avatarImg, new Point(avatarPoint, avatarPoint), 1);
                                    });
                                }
                            }
                        }

                        var qrSize  = 211;
                        var qrPoint = new Point(270, 620);
                        qrCodeImg = qrCodeImg.Clone(e => e.Resize(qrSize, qrSize));
                        backgroundImg.Mutate(e =>
                        {
                            e.DrawImage(qrCodeImg, qrPoint, 1);
                        });
                        using (var ms = new MemoryStream())
                        {
                            backgroundImg.Save(physicalPath, new PngEncoder());
                            // backgroundImg.SaveAsPng(ms);
                            // string base64String = $"data:image/png;base64,{Convert.ToBase64String(ms.ToArray())}";
                            // return Result.Ok(base64String);
                        }
                        return(Result.Ok(httpPath));
                    }
                }
            }
            catch (Exception ex)
            {
                return(Result.Fail(ResultCodes.SysError, ex.Message));
            }
            return(Result.Fail(ResultCodes.RequestParamError, "请求生成小程序码失败"));
        }