接口地址:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
html
HTTP請求方式:post小程序
POST參數說明api
參數 | 必填 | 說明 |
---|---|---|
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)app
本身封裝的post的接口參數: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開始,url
/// <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); }
效果
效果 第一條的關鍵字排列錯誤,第二條爲正確的關鍵字組合 ,關鍵字組合有數量限制