示例#1
0
        private void Send <T>(string openid, string templateCode, T data, Func <string, T, string> format,
                              string appName = null)
        {
            var wxApp = appName == null?Options.CurrentValue.GetDefaultMp() : Options.CurrentValue.Get(appName);

            if (wxApp == null || wxApp.AppType != WxAppType.MP)
            {
                throw new Exception("appName错误或微信配置异常");
            }

            var model =
                Options.CurrentValue.Templates.FirstOrDefault(r => r.Code.EqualsIgnoreCase(templateCode));

            if (model == null)
            {
                throw new Exception($"找不到微信消息模板:{templateCode}");
            }
            if (model.TemplateId.IsNullOrWhiteSpace())
            {
                // 模板id 为空则不发送
                return;
            }

            var keys = TemplateDic.GetOrDefault(model.TemplateId);

            if (keys.IsNullOrEmpty())
            {
                // 清除,重新加载
                TemplateDic.Clear();
                var res = TemplateApi.GetPrivateTemplateAsync(wxApp.AppId).GetAwaiter().GetResult();
                var reg = new Regex(@"\{\{[^\{\}]{1,}.DATA\}\}");
                // 正则匹配查找模板中的键
                foreach (var item in res.template_list)
                {
                    var matches = reg.Matches(item.content);

                    var list = new List <string>();
                    foreach (Match math in matches)
                    {
                        if (!math.Success)
                        {
                            continue;
                        }
                        var v = math.Value.AsSpan().Slice(2);
                        v = v.Slice(0, v.Length - 7);
                        list.Add(v.ToString());
                    }

                    if (list.Count == 0)
                    {
                        throw new Exception($"模板消息:{item.title},内容错误:{item.content}");
                    }

                    TemplateDic.TryAdd(item.template_id, list);
                }

                keys = TemplateDic.GetOrDefault(model.TemplateId);
            }

            if (keys.IsNullOrEmpty())
            {
                throw new Exception($"错误的模板消息配置,code:{templateCode},templateId:{model.TemplateId}");
            }

            var colorReg = new Regex("^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$");
            var dataDic  = new Dictionary <string, object>();

            for (int i = 0; i < keys.Count; i++)
            {
                string value = "";
                string color = "";
                if (model.Datas.Count >= i + 1)
                {
                    value = model.Datas[i];
                    var span = value.AsSpan();
                    if (span.StartsWith(new[] { '#' }) && span[7] == '|')
                    {
                        color = span.Slice(0, 7).ToString();
                        if (!colorReg.IsMatch(color))
                        {
                            color = "";
                        }
                        value = span.Slice(8).ToString();
                    }
                }

                if (data != null && !value.IsNullOrWhiteSpace())
                {
                    value = format(value, data);
                }
                dataDic.Add(keys[i], new { value, color });
            }

            var url = model.Url;

            if (!url.IsNullOrWhiteSpace())
            {
                url = format(url, data);
            }
            if (!string.IsNullOrEmpty(model.MiniProgramPagePath))
            {
                model.MiniProgramPagePath = format(model.MiniProgramPagePath, data);
            }

            TemplateApi.SendTemplateMessageAsync(wxApp.AppId, openid, model.TemplateId, url, dataDic,
                                                 new TemplateModel_MiniProgram
            {
                appid    = model.MiniProgramAppId,
                pagepath = model.MiniProgramPagePath
            });
        }