示例#1
0
        /// <summary>
        /// 使用异步Action测试异步模板消息接口
        /// </summary>
        /// <param name="checkcode"></param>
        /// <returns></returns>
        public async Task <ActionResult> TemplateMessageTest(string checkcode)
        {
            var openId = CustomMessageHandler.TemplateMessageCollection.ContainsKey(checkcode)
                ? CustomMessageHandler.TemplateMessageCollection[checkcode]
                : null;

            if (openId == null)
            {
                return(Content("验证码已过期或不存在!请在“盛派网络小助手”公众号输入“tm”获取验证码。"));
            }
            else
            {
                CustomMessageHandler.TemplateMessageCollection.Remove(checkcode);


                var templateId = "cCh2CTTJIbVZkcycDF08n96FP-oBwyMVrro8C2nfVo4";
                var testData   = new //TestTemplateData()
                {
                    first    = new TemplateDataItem("【异步模板消息测试】"),
                    keyword1 = new TemplateDataItem(openId),
                    keyword2 = new TemplateDataItem("网页测试"),
                    keyword3 = new TemplateDataItem(DateTime.Now.ToString("O")),
                    remark   = new TemplateDataItem("更详细信息,请到Senparc.Weixin SDK官方网站(http://zs.sasu.edu.cn)查看!")
                };

                var result = await TemplateApi.SendTemplateMessageAsync(appId, openId, templateId, null, testData);

                return(Content("异步模板消息已经发送到【盛派网络小助手】公众号,请查看。此前的验证码已失效,如需继续测试,请重新获取验证码。"));
            }
        }
        /// <summary>
        /// 发送审核通知
        /// </summary>
        /// <param name="OpenId"></param>
        /// <param name="host"></param>
        /// <param name="currentName"></param>
        /// <returns></returns>
        public async Task SendCheckMesssage(string OpenId, string host, string currentName)
        {
            try
            {
                string templateId = await _wechatappconfigRepository.GetAll().Select(v => v.TemplateIds).FirstOrDefaultAsync();

                if (templateId != null || templateId.Length != 0)
                {
                    string[] ids    = templateId.Split(',');
                    string   appId  = AppConfig.AppId;
                    string   openId = OpenId;
                    //string templateId = "qvt7CNXBY4FzfzdX54TvMUaOi9jZ3-tdsb2NRhVp0yg";//模版id
                    host = host ?? "http://ga.intcov.com";//host配置
                    string url  = host + "/GAWX/Authorization?page=302";
                    object data = new
                    {
                        first    = new TemplateDataItem("店员审核通知,请您尽快审核", "#FF0000"),
                        keyword1 = new TemplateDataItem(currentName.ToString()),
                        keyword2 = new TemplateDataItem(DateTime.Now.ToString("yyyy-MM-dd HH:mm"))
                    };
                    await TemplateApi.SendTemplateMessageAsync(appId, openId, ids[2], url, data);
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("审核通知发送失败 error:{0} Exception:{1}", ex.Message, ex);
            }
        }
示例#3
0
        public void SendTemplateMessageAsyncTest()
        {
            var openId     = base._testOpenId;
            var templateId = "cCh2CTTJIbVZkcycDF08n96FP-oBwyMVrro8C2nfVo4";

            base.TestAyncMethod(2, base._testOpenId, () =>
            {
                /*
                 * 详细内容
                 * {{first.DATA}}
                 * 用户名:{{keyword1.DATA}}
                 * 标题:{{keyword2.DATA}}
                 * 时间:{{keyword3.DATA}}
                 * {{remark.DATA}}
                 */
                var testData = new //TestTemplateData()
                {
                    first    = new TemplateDataItem(string.Format("【模板消息测试-{0}】您好,审核通过。", DateTime.Now.ToString("T"))),
                    keyword1 = new TemplateDataItem(openId),
                    keyword2 = new TemplateDataItem("单元测试"),
                    keyword3 = new TemplateDataItem(DateTime.Now.ToString("O")),
                    remark   = new TemplateDataItem("更详细信息,请到Senparc.Weixin SDK官方网站(http://zs.sasu.edu.cn)查看!\r\n运行线程:" + Thread.CurrentThread.GetHashCode())
                };

                var result = TemplateApi.SendTemplateMessageAsync(base._appId, openId, templateId, null, testData).Result;
                Console.WriteLine("线程{0},结果:{1}", Thread.CurrentThread.GetHashCode(), result.errmsg);

                base.AsyncThreadsCollection.Remove(Thread.CurrentThread);//必须要加
            });
        }
        private async Task PurchaseSendWXMesssageToShopKeeper(string OpenId, string host, string memberBarCode, int?finalIntegral, int?integral)
        {
            try
            {
                string templateId = await _wechatappconfigRepository.GetAll().Select(v => v.TemplateIds).FirstOrDefaultAsync();

                if (templateId != null || templateId.Length != 0)
                {
                    string[] ids = templateId.Split(',');
                    //发送微信模板通知-店铺管理员
                    string appId  = AppConfig.AppId;
                    string openId = OpenId;
                    //string templateId = "3Dgkz89yi8e0jXtwBUhdMSgHeZwPvHi2gz8WrD-CUA4";//模版id
                    host = host ?? "http://ga.intcov.com";//host配置
                    string url  = host + "/GAWX/Authorization?page=301";
                    object data = new
                    {
                        keyword1 = new TemplateDataItem(memberBarCode.ToString()),
                        keyword2 = new TemplateDataItem(finalIntegral.ToString() + "积分"),
                        keyword3 = new TemplateDataItem(integral.ToString() + "积分"),
                        keyword4 = new TemplateDataItem(DateTime.Now.ToString("yyyy-MM-dd HH:mm"))
                    };
                    await TemplateApi.SendTemplateMessageAsync(appId, openId, ids[0], url, data);
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("店铺管理员发送消息通知失败 error:{0} Exception:{1}", ex.Message, ex);
            }
        }
示例#5
0
        /// <summary>
        /// 使用异步Action测试异步模板消息接口
        /// </summary>
        /// <param name="checkcode"></param>
        /// <returns></returns>
        public async Task <ActionResult> TemplateMessageTest(string checkcode)
        {
            var currentCache = CacheStrategyFactory.GetObjectCacheStrategyInstance();
            var cacheKey     = $"TestCheckCode:{checkcode}";
            var openId       = await currentCache.GetAsync(cacheKey) as string;//使用缓存,如果多台服务器可以使用分布式缓存共享

            if (openId.IsNullOrEmpty())
            {
                return(Content("验证码已过期或不存在!请在“盛派网络小助手”公众号输入“tm”获取验证码。"));
            }
            else
            {
                await currentCache.RemoveFromCacheAsync(cacheKey);

                var templateId = "cCh2CTTJIbVZkcycDF08n96FP-oBwyMVrro8C2nfVo4";
                var testData   = new //TestTemplateData()
                {
                    first    = new TemplateDataItem("【异步模板消息测试】"),
                    keyword1 = new TemplateDataItem(openId),
                    keyword2 = new TemplateDataItem("网页测试"),
                    keyword3 = new TemplateDataItem(SystemTime.Now.ToString("O")),
                    remark   = new TemplateDataItem("更详细信息,请到Senparc.Weixin SDK官方网站(http://sdk.weixin.senparc.com)查看!")
                };

                var miniProgram = new TemplateModel_MiniProgram()
                {
                    appid    = "wxfcb0a0031394a51c",//【盛派互动(BookHelper)】小程序
                    pagepath = "pages/index/index"
                };

                var result = await TemplateApi.SendTemplateMessageAsync(appId, openId, templateId, null, testData, miniProgram);

                return(Content("异步模板消息已经发送到【盛派网络小助手】公众号,请查看。此前的验证码已失效,如需继续测试,请重新获取验证码。"));
            }
        }
示例#6
0
        public void AsyncSendTemplateMessageTestForBookOptmize()
        {
            WxJsonResult finalResult = null;

            Task.Factory.StartNew(async() =>
            {
                var openId = "olPjZjsXuQPJoV0HlruZkNzKc91E";//消息目标用户的OpenId

                //实际生产环境中,用户信息应该从数据库或缓存中读取
                var userInfo = await UserApi.InfoAsync(_appId, openId);

                var data = new TemplateMessage_PaySuccessNotice(
                    "您的订单已经支付", userInfo.nickname,
                    "1234567890", 88.ToString("c"),
                    "模板消息测试商品",
                    "更详细信息,请到Senparc.Weixin SDK官方网站(http://zs.sasu.edu.cn)查看!\r\n这条消息使用的是优化过的方法,且不带Url参数。使用异步方法。");

                var result = await TemplateApi.SendTemplateMessageAsync(_appId, openId, data);

                //调用客服接口显示msgId
                finalResult = await CustomApi.SendTextAsync(_appId, openId, "上一条模板消息的MsgID:" + result.msgid);

                Assert.AreEqual(ReturnCode.请求成功, result.errcode);
            });
            while (finalResult == null)
            {
            }
        }
示例#7
0
        public Task Execute(IJobExecutionContext context)
        {
            IPagedList <User> users = userService.GetUsers(string.Empty, 1, int.MaxValue);

            List <Task> templateMessageTasks = new List <Task>();

            foreach (var user in users.Where(u => !string.IsNullOrWhiteSpace(u.WeChatOpenID)))
            {
                var templateDatas = new
                {
                    first    = new TemplateDataItem("你好,检测到异常报警设备"),
                    keyword1 = new TemplateDataItem(DateTime.Now.ToString("yyyy-MM-dd HH:mm")),
                    keyword2 = new TemplateDataItem("零度云平台"),
                    keyword3 = new TemplateDataItem("传感器参数异常"),
                    remark   = new TemplateDataItem("请尽快查看相关设备状态。")
                };

                var url = string.Format("http://www.xcode.me/{0}", encryptionService.Encrypt(user.WeChatOpenID, appSecret));

                AccessTokenContainer.Register(appId, appSecret);
                var task = TemplateApi.SendTemplateMessageAsync(appId, user.WeChatOpenID, templateId, url, templateDatas);
                templateMessageTasks.Add(task);
            }

            return(Task.WhenAll(templateMessageTasks));
        }
示例#8
0
        /// <summary>
        /// 发送模板消息
        /// </summary>
        /// <param name="openId"></param>
        /// <param name="templateId"></param>
        /// <param name="modelData">一个匿名对象,其中的属性作为模板参数,如下所示:
        ///  new
        ///        {
        ///           nickname = new TemplateDataItem("daiwei"),
        ///           date = new TemplateDataItem("2018-06-12"),
        ///           mobile = new TemplateDataItem("13610239726"),
        ///           money = new TemplateDataItem("5.00")
        ///       }</param>
        /// <param name="detailUrl"></param>
        public Task <SendTemplateMessageResult> SendTemplateMessageAsync(string openId, string templateId, object modelData, string detailUrl)
        {
            //var obj = new ExpandoObject() as IDictionary<string, Object>;
            //foreach (var pair in modelData)
            //{
            //    obj[pair.Key] = new TemplateDataItem(pair.Value);
            //}

            //TemplateApi.SendTemplateMessage(this.AccessToken, openId, )
            return(TemplateApi.SendTemplateMessageAsync(this.Config.AppId, openId, templateId, detailUrl, modelData));
        }
示例#9
0
 /// <summary>
 /// 资金到账提醒
 /// </summary>
 public void SendMoneyToWalletTemplateMessage(string openId, string dateTime, string amount, string finallyValue, string remark, string url)
 {
     Task.Factory.StartNew(async() =>
     {
         var templateMessage = new TemplateMessage.MoneyToWalletTemplateMessage(dateTime, amount, finallyValue, remark, url);
         var accessToken     = AccessToken();
         if (!string.IsNullOrEmpty(openId) && !string.IsNullOrEmpty(accessToken))
         {
             var result = await TemplateApi.SendTemplateMessageAsync(accessToken, openId, templateMessage.TemplateId,
                                                                     templateMessage.Url, templateMessage);
         }
     });
     return;
 }
示例#10
0
 /// <summary>
 /// 修改支付密码通知
 /// </summary>
 public void SendChangePayPasswordTemplateMessage(string openId, string userName, string payPassword, string shopName, string url)
 {
     Task.Factory.StartNew(async() =>
     {
         var templateMessage = new TemplateMessage.ChangePayPasswordTemplateMessage(userName, payPassword, shopName, url);
         var accessToken     = AccessToken();
         if (!string.IsNullOrEmpty(openId) && !string.IsNullOrEmpty(accessToken))
         {
             var result = await TemplateApi.SendTemplateMessageAsync(accessToken, openId, templateMessage.TemplateId,
                                                                     templateMessage.Url, templateMessage);
         }
     });
     return;
 }
示例#11
0
 /// <summary>
 /// 发生服务器错误模板消息
 /// </summary>
 public void SendExTemplateMessage(string openId, string err, string errMessage, string url)
 {
     Task.Factory.StartNew(async() =>
     {
         var templateMessage = new TemplateMessage.ExceptionAlertTemplateMessage(err, errMessage, url);
         var accessToken     = AccessToken();
         if (!string.IsNullOrEmpty(openId) && !string.IsNullOrEmpty(accessToken))
         {
             var result = await TemplateApi.SendTemplateMessageAsync(accessToken, openId, templateMessage.TemplateId,
                                                                     templateMessage.Url, templateMessage);
         }
     });
     return;
 }
示例#12
0
 /// <summary>
 /// 发送新订单提醒
 /// </summary>
 /// <param name="openId"></param>
 /// <param name="number"></param>
 /// <param name="goodsName"></param>
 /// <param name="customerName"></param>
 /// <param name="customerMobile"></param>
 /// <param name="expressAddress"></param>
 /// <param name="url"></param>
 public void SendNewOrderTemplateMessage(string openId, string number, string goodsName, string customerName, string customerMobile, string expressAddress, string url)
 {
     Task.Factory.StartNew(async() =>
     {
         var templateMessage = new TemplateMessage.NewOrderTemplateMessage(number,
                                                                           goodsName, customerName, customerMobile, expressAddress, url);
         var accessToken = AccessToken();
         if (!string.IsNullOrEmpty(openId) && !string.IsNullOrEmpty(accessToken))
         {
             var result = await TemplateApi.SendTemplateMessageAsync(accessToken, openId, templateMessage.TemplateId,
                                                                     templateMessage.Url, templateMessage);
         }
     });
     return;
 }
示例#13
0
        public void CreateAsyncTest()
        {
            var openId = base._testOpenId;

            base.TestAyncMethod(1, openId, () =>
            {
                var result = QrCodeApi.CreateAsync(base._appId, 100, 999999, QrCode_ActionName.QR_SCENE, "QrTest").Result;
                //Assert.AreEqual(ReturnCode.请求成功,result.errcode);

                Console.WriteLine("Result(T-{0}):{1}", Thread.CurrentThread.GetHashCode(), result.ToString());

                //发送消息通知生成状态
                var testData = new //TestTemplateData()
                {
                    first    = new TemplateDataItem(string.Format("【测试-{0}】QrCode单元测试完成一个线程。", SystemTime.Now.ToString("T"))),
                    keyword1 = new TemplateDataItem(openId),
                    keyword2 = new TemplateDataItem("QrCode测试"),
                    keyword3 = new TemplateDataItem(SystemTime.Now.Ticks.ToString("O")),
                    remark   = new TemplateDataItem("结果:" + result.errcode.ToString())
                };

                var tmResult = TemplateApi.SendTemplateMessageAsync(base._appId, openId, "cCh2CTTJIbVZkcycDF08n96FP-oBwyMVrro8C2nfVo4",
                                                                    (result.url)
                                                                    , testData).Result;

                if (result.errcode == ReturnCode.请求成功)
                {
                    //下载并获得二维码
                    try
                    {
                        var fileName = Path.Combine(System.Environment.CurrentDirectory, "..\\", string.Format("qrcode-{0}.jpg", SystemTime.Now.ToString("yyyy-MM-dd HH_mm_ss")));
                        using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
                        {
                            QrCodeApi.ShowQrCode(result.ticket, fs);//下载二维码
                        }

                        //下载之后,文件储存在\src\Senparc.Weixin.MP\Senparc.Weixin.MP.Test\bin目录下,
                        //打开.jpg文件之后,使用微信扫一扫查看效果。
                    }
                    catch
                    {
                    }
                }

                base.AsyncThreadsCollection.Remove(Thread.CurrentThread);//必须要加
            });
        }
示例#14
0
        public async Task <Result> Index([FromBody] TemplateMessage templateMessage)
        {
            var template = new WeixinTemplate(templateMessage.Url, templateMessage.TemplateId, "");
            var count    = templateMessage.Contents.Count;

            template.first = !string.IsNullOrEmpty(templateMessage.First)
                ? new TemplateDataItem(templateMessage.First)
                : null;
            template.remark = !string.IsNullOrEmpty(templateMessage.Remark)
                ? new TemplateDataItem(templateMessage.Remark)
                : null;
            //利用反射赋值 WeixinTemplate 的 keyword1, keyword2 等属性。
            //有没有更好的写法呢 ??
            for (var i = 0; i < count; i++)
            {
                var property = template.GetType().GetProperty($"keyword{i + 1}");
                property.SetValue(template, new TemplateDataItem(templateMessage.Contents[i]));
            }

            try
            {
                var taskList = new List <Task <SendTemplateMessageResult> >();
                foreach (var openId in templateMessage.OpenIds)
                {
                    var task = TemplateApi.SendTemplateMessageAsync(WeixinSetting.WeixinAppId, openId, template);
                    taskList.Add(task);
                }

                var results = await Task.WhenAll(taskList);

                //获取发送模板失败的用户List
                return(new SuccessResult
                {
                    Lists = results.Where(sendResult => sendResult.ErrorCodeValue != 0).ToList()
                });
            }
            catch (Exception)
            {
                return(new ErrorResult
                {
                    Lists = new List <SendTemplateMessageResult>()
                });
            }
        }
示例#15
0
        /// <summary>
        /// 使用异步Action测试异步模板消息接口
        /// </summary>
        /// <param name="checkcode"></param>
        /// <returns></returns>
        public async Task <ActionResult> TemplateMessageTest(string checkcode)
        {
            var openId = CustomMessageHandler.TemplateMessageCollection.ContainsKey(checkcode)
                ? CustomMessageHandler.TemplateMessageCollection[checkcode]
                : null;

            if (openId == null)
            {
                return(Content("验证码已过期或不存在!请在“盛派网络小助手”公众号输入“tm”获取验证码。"));
            }
            else
            {
                CustomMessageHandler.TemplateMessageCollection.Remove(checkcode);


                var templateId = "cCh2CTTJIbVZkcycDF08n96FP-oBwyMVrro8C2nfVo4";
                var testData   = new //TestTemplateData()
                {
                    first    = new TemplateDataItem("【异步模板消息测试】"),
                    keyword1 = new TemplateDataItem(openId),
                    keyword2 = new TemplateDataItem("网页测试"),
                    keyword3 = new TemplateDataItem(DateTime.Now.ToString("O")),
                    remark   = new TemplateDataItem("更详细信息,请到Senparc.Weixin SDK官方网站(http://sdk.weixin.senparc.com)查看!")
                };

                var miniProgram = new TempleteModel_MiniProgram()
                {
                    appid    = "wxfcb0a0031394a51c",//【盛派互动(BookHelper)】小程序
                    pagepath = "pages/index/index"
                };

                var result = await TemplateApi.SendTemplateMessageAsync(appId, openId, templateId, null, testData, miniProgram);

                return(Content("异步模板消息已经发送到【盛派网络小助手】公众号,请查看。此前的验证码已失效,如需继续测试,请重新获取验证码。"));
            }
        }
示例#16
0
        /// <summary>
        /// 批量发送模板消息
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="openIds"></param>
        /// <param name="templateId"></param>
        /// <param name="data"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        public async Task <int> SendTemplateMessagesAsync(string appId, string[] openIds, string templateId,
                                                          Dictionary <string, TemplateDataItem> data, string url = null)
        {
            int errorCount = 0;

            foreach (var openId in openIds)
            {
                try
                {
                    var result = await TemplateApi.SendTemplateMessageAsync(appId, openId, templateId, url, data);

                    if (result.errcode != ReturnCode.请求成功)
                    {
                        errorCount++;
                    }
                }
                catch (Exception ex)
                {
                    errorCount++;
                }
            }

            return(errorCount);
        }
示例#17
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
            });
        }
 private Task <SendTemplateMessageResult> Send(WeixinTemplate_PaySuccess templateData, string t) => TemplateApi.SendTemplateMessageAsync(WeixinSetting.WeixinAppId, t, templateData);