小程序模板消息--发送模板消息
接口地址:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
HTTP请求方式:post
POST参数说明
参数 | 必填 | 说明 |
---|---|---|
touser | 是 | 接收者(用户)的 openid |
template_id | 是 | 所需下发的模板消息的id |
page | 否 | 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 |
form_id | 是 | 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id |
data | 是 | 模板内容,不填则下发空模板 |
color | 否 | 模板内容字体的颜色,不填默认黑色 |
emphasis_keyword | 否 | 模板需要放大的关键词,不填则默认无放大 |
本实例的form_id参数为支付场景下的prepay_id
自己封装的模板消息发送接口:(C# WebApi)
自己封装的post的接口参数:
#region 发送模板消息 public class PostSendTemplete { /// <summary> /// 加密的 /// </summary> public string shopid { get; set; } /// <summary> /// 付款成功通知 AT0005 /// 付款失败通知 AT0006 /// 待付款提醒 AT0008 /// 退款通知 AT0036 /// </summary> public string temptype { get; set; } /// <summary> /// 接收者(用户)的 openid /// </summary> public string openid { get; set; } /// <summary> /// 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 /// </summary> public string page { get; set; } /// <summary> /// 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id /// </summary> public string form_id { get; set; } /// <summary> /// 内容 /// </summary> public string content { get; set; } /// <summary> /// 模板需要放大的关键词,不填则默认无放大 /// </summary> public string emphasis_keyword { get; set; } } #endregion
封装的post的小程序接口参数
/// <summary> /// 小程序模板消息模板 /// </summary> public class WxaTempleteModel { /// <summary> /// 是 接收者(用户)的 openid /// </summary> public string touser { get; set; } /// <summary> /// 是 所需下发的模板消息的id /// </summary> public string template_id { get; set; } /// <summary> /// 否 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。 /// </summary> public string page { get; set; } /// <summary> /// 是 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id /// </summary> public string form_id { get; set; } /// <summary> /// 是 模板内容,不填则下发空模板 /// </summary> public object data { get; set; } /// <summary> /// 否 模板内容字体的颜色,不填默认黑色 /// </summary> public string color { get; set; } /// <summary> /// 否 模板需要放大的关键词,不填则默认无放大 /// </summary> public string emphasis_keyword { get; set; } } #region 付款成功通知 AT0005 /// <summary> /// //付款成功通知 //{"keyword_id":13,"name":"商家名称","example":"早安豆浆店"}{"keyword_id":16,"name":"门店","example":"汽车4s店"} {"keyword_id":22,"name":"订单编号","example":"123658635455"} {"keyword_id":27,"name":"商品信息","example":"鱼香肉丝"}, {"keyword_id":3,"name":"付款金额","example":"8元"} /// </summary> public class PaySuccessTemplete { /// <summary> /// {"keyword_id":13,"name":"商家名称","example":"早安豆浆店"} /// </summary> public TempleteItemData keyword1 { get; set; } /// <summary> /// {"keyword_id":16,"name":"门店","example":"汽车4s店"} /// </summary> public TempleteItemData keyword2 { get; set; } /// <summary> /// {"keyword_id":22,"name":"订单编号","example":"123658635455"} /// </summary> public TempleteItemData keyword3 { get; set; } /// <summary> /// {"keyword_id":27,"name":"商品信息","example":"鱼香肉丝"} /// </summary> public TempleteItemData keyword4 { get; set; } /// <summary> /// {"keyword_id":3,"name":"付款金额","example":"8元"} /// </summary> public TempleteItemData keyword5 { get; set; } } #endregion
后台接口代码
#region 发送模板消息 [HttpPost] public Result SendTemplete(PostSendTemplete model) { Logger.Debug("发送模板接口:3" + JsonConvert.SerializeObject(model)); if (string.IsNullOrWhiteSpace(model.shopid)) { _result.success = false; _result.message = "商户号为空"; return _result; } if (string.IsNullOrWhiteSpace(model.form_id)) { _result.success = false; _result.message = "form_id为空"; return _result; } if (string.IsNullOrWhiteSpace(model.openid)) { _result.success = false; _result.message = "微信ID为空"; return _result; } if (string.IsNullOrWhiteSpace(model.temptype)) { _result.success = false; _result.message = "模板类别为空"; return _result; } try { var shopid = DESEncrypt.Decrypt(model.shopid); var wxAppSet = _wxAppSetService.GetFromCache(shopid); var wxaTemplete = new t_wxa_templete(); if (_wxaTempleteService.Exists(a => a.shopid == shopid && a.templete_type == model.temptype)) { wxaTemplete = _wxaTempleteService.Get(a => a.shopid == shopid && a.templete_type == model.temptype); } else { var componentToken2 = Senparc.Weixin.MP.Sample.CommonService.Custom.TokenHelper.GetComponentAccessToken(component_AppId, component_Secret).component_access_token; var authToken2 = Senparc.Weixin.MP.Sample.CommonService.Custom.TokenHelper.GetAuthorizerAccessToken(component_AppId, componentToken2, wxAppSet.appid, wxAppSet.authorizer_refresh_token).authorizer_access_token; // var data = Senparc.Weixin.WxOpen.AdvancedAPIs.Template.TemplateApi.Add(authToken, temptype, intKws); var url2 = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=" + authToken2; var obj2 = new PostAddTemplete(); obj2.id = model.temptype; switch (model.temptype) { case "AT0005"://付款成功通知 obj2.keyword_id_list = new int[5] { 13, 16, 22, 27, 3 }; break; case "AT0006"://付款失败通知 obj2.keyword_id_list = new int[4] { 10, 11, 20, 2 }; break; case "AT0008"://待付款提醒 obj2.keyword_id_list = new int[5] { 8, 33, 6, 9, 4 }; break; case "AT0036"://退款通知 obj2.keyword_id_list = new int[5] { 14, 65, 4, 35, 5 }; break; default: _result.success = false; _result.message = "未知模板类型"; return _result; break; } var data2 = JsonConvert.DeserializeObject<AddTempleteResult>(SissO2O.Framework.Common.NetHelper.WxAppHttpPost(url2, obj2, SerializationType.Json)); Logger.Debug("data=" + JsonConvert.SerializeObject(data2)); if (data2.errcode == 0) { var templete = new t_wxa_templete(); templete = new t_wxa_templete(); templete.operdate = DateTime.Now; templete.shopid = shopid; templete.templete_id = data2.template_id; templete.templete_type = model.temptype; templete.keyword_id_list = obj2.keyword_id_list.ToList().ToString(); _wxaTempleteService.Add(templete); _wxaTempleteService.Commit(); } else { _result.message = "错误代码:" + data2.errcode + " " + data2.errmsg; _result.success = false; } } Logger.Debug("wxaTemplete=" + JsonConvert.SerializeObject(wxaTemplete)); var temppleteModel = new WxaTempleteModel(); temppleteModel.template_id = wxaTemplete.templete_id; temppleteModel.page = model.page; temppleteModel.color = "#173177"; temppleteModel.emphasis_keyword = model.emphasis_keyword; temppleteModel.form_id = model.form_id; temppleteModel.touser = model.openid; switch (model.temptype) { case "AT0005"://付款成功通知 temppleteModel.data = JsonConvert.DeserializeObject<PaySuccessTemplete>(model.content); break; case "AT0006"://付款失败通知 temppleteModel.data = JsonConvert.DeserializeObject<PayFailTemplete>(model.content); break; case "AT0008"://待付款提醒 temppleteModel.data = JsonConvert.DeserializeObject<PayWaitTemplete>(model.content); break; case "AT0036"://退款通知 temppleteModel.data = JsonConvert.DeserializeObject<PayRefundTemplete>(model.content); break; default: _result.success = false; _result.message = "未知模板类型"; return _result; break; } Logger.Debug("temppleteModel=" + JsonConvert.SerializeObject(temppleteModel)); var componentToken = Senparc.Weixin.MP.Sample.CommonService.Custom.TokenHelper.GetComponentAccessToken(component_AppId, component_Secret).component_access_token; Logger.Debug("componentToken=" + componentToken); var authToken = Senparc.Weixin.MP.Sample.CommonService.Custom.TokenHelper.GetAuthorizerAccessToken(component_AppId, componentToken, wxAppSet.appid, wxAppSet.authorizer_refresh_token).authorizer_access_token; Logger.Debug("authToken=" + authToken); var url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + authToken; Logger.Debug("url2333=" + url); var result = Senparc.Weixin.CommonAPIs.CommonJsonSend.Send<BaseWxResult>(authToken, url, temppleteModel); // var strResult = SissO2O.Framework.Common.NetHelper.WxAppHttpPost(url, temppleteModel, SerializationType.Json); // var strResult = SissO2O.Framework.Common.PostDataToUrl.PostData(url, JsonConvert.SerializeObject(temppleteModel)); Logger.Debug("strResult=" + JsonConvert.SerializeObject(result)); // var result = JsonConvert.DeserializeObject<BaseWxResult>(strResult); if (result.errcode != 0) { _result.message = "错误代码:" + result.errcode + " " + result.errmsg; _result.success = false; Logger.Error("商户:" + shopid + "小程序发布模板消息出错" + "错误代码:" + result.errcode + " " + result.errmsg); } } catch (Exception ex) { _result.message = ex.Message; _result.success = false; Logger.Error("商户:" + JsonConvert.SerializeObject(model) + "小程序发布模板消息出错,因为:" + ex.Message + "错误代码:" + ex.StackTrace); } return _result; } #endregion
后台调用接口的代码
//测试发送模板消息 var postSendTemplete = new PostSendTemplete(); postSendTemplete.form_id = order.form_id; postSendTemplete.openid = order.openid; postSendTemplete.page = ""; postSendTemplete.shopid = model.shopid; postSendTemplete.temptype = "AT0005"; postSendTemplete.content = Common.Common.PaySuccessTempleteContentToString(shopInfoModel.shopname, order.branchname, model.orderno, order.orderdesc, order.amt); Logger.Debug("发送模板消息接口1:" + JsonConvert.SerializeObject(postSendTemplete)); var tempUrl = "http://wxapp.sissyun.com.cn/api/WxAppApi/SendTemplete"; var tempResult = SissO2O.Framework.Common.NetHelper.WxAppHttpPost(tempUrl, postSendTemplete, SerializationType.Json);
此处的keyword关键字,命名从1开始,
/// <summary> /// 获取支付成功的模板消息内容 /// </summary> /// <param name="shopname">商家名称</param> /// <param name="branchname">门店名称</param> /// <param name="orderno">订单编号</param> /// <param name="productinfo">商品信息</param> /// <param name="amt">付款金额 </param> /// <returns></returns> public static string PaySuccessTempleteContentToString(string shopname, string branchname, string orderno, string productinfo, decimal amt) { var model = new PaySuccessTemplete() { keyword1 = new TempleteItemData() { value = shopname, }, keyword2 = new TempleteItemData() { value = branchname, }, keyword3 = new TempleteItemData() { value = orderno, }, keyword4 = new TempleteItemData() { value = productinfo, }, keyword5 = new TempleteItemData() { value = amt.ToString("0.00") + "元" } }; return JsonConvert.SerializeObject(model); }
效果
效果 第一条的关键字排列错误,第二条为正确的关键字组合 ,关键字组合有数量限制