/// <summary>
        /// 获取jsapi_ticket
        /// </summary>
        /// <param name="channelId"></param>
        /// <returns></returns>
        public static async Task <string> GetJsapiTicketAsync(int channelId, string appId, string appSercet, WeixinType wxType)
        {
            //获取accesstoken
            var accessToken = await GetAccessTokenAsync(channelId, appId, appSercet, wxType);

            var redisKey = string.Format("JsapiTicket_{0}_{1}", channelId, appId);
            //从缓存中读取
            var jsapiTicket = await RedisHelper.StringGetAsync <string>(redisKey);

            if (string.IsNullOrEmpty(jsapiTicket))
            {
                //从api中获取
                var weixinJsapiTicketUrl = string.Empty;
                switch (wxType)
                {
                case Enums.WeixinType.WxMp:
                    weixinJsapiTicketUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", accessToken);
                    break;

                case Enums.WeixinType.WxWork:
                default:
                    weixinJsapiTicketUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token={0}", accessToken);
                    break;
                }

                var jsapiTicketDto = await HttpHelper.GetHtmlAsync <JsapiTicketResponseDTO>(weixinJsapiTicketUrl);

                if (jsapiTicketDto.errcode == 0)
                {
                    jsapiTicket = jsapiTicketDto.ticket;

                    var setResult = RedisHelper.StringSet <string>(redisKey, jsapiTicketDto.ticket, TimeSpan.FromSeconds(jsapiTicketDto.expires_in * 1.0));
                }
            }
            return(jsapiTicket);
        }
        /// <summary>
        /// 获取accesstoken
        /// </summary>
        /// <param name="channelId"></param>
        /// <returns></returns>
        public static async Task <string> GetAccessTokenAsync(int channelId, string appId, string appSercet, WeixinType wxType)
        {
            var redisKey = string.Format("AccessToken_{0}_{1}", channelId, appId);
            //从缓存中读取
            var accessToken = await RedisHelper.StringGetAsync <string>(redisKey);

            if (string.IsNullOrEmpty(accessToken))
            {
                //从api中获取
                var weixinAccessTokenUrl = string.Empty;
                switch (wxType)
                {
                case Enums.WeixinType.WxMp:
                    weixinAccessTokenUrl = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSercet);
                    break;

                case Enums.WeixinType.WxWork:
                default:
                    weixinAccessTokenUrl = string.Format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", appId, appSercet);
                    break;
                }

                var accessTokenDto = await HttpHelper.GetHtmlAsync <AccessTokenResponseDTO>(weixinAccessTokenUrl);

                if (accessTokenDto.errcode == 0)
                {
                    accessToken = accessTokenDto.access_token;

                    var setResult = RedisHelper.StringSet <string>(redisKey, accessTokenDto.access_token, TimeSpan.FromSeconds(accessTokenDto.expires_in * 1.0));
                }
            }
            return(accessToken);
        }