using Senparc.NeuChar; using Senparc.Weixin; using Senparc.Weixin.CommonAPIs; using Senparc.Weixin.Entities.TemplateMessage; using Senparc.Weixin.MP; using Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage; using System.Threading.Tasks; namespace Znyc.Cloudcar.Admin.WeChat.CommonService.TemplateMessage { /// <summary> /// 模板消息接口 /// </summary> public static class TemplateApi { /// <summary> /// 获取URL:一次性订阅消息,第一步引导用户打开链接进行授权 /// 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB /// </summary> /// <param name="appId">公众号的唯一标识</param> /// <param name="scene">重定向后会带上scene参数,开发者可以填0-10000的整形值,用来标识订阅场景值</param> /// <param name="templateId">订阅消息模板ID,登录公众平台后台,在接口权限列表处可查看订阅模板ID</param> /// <param name="redirectUrl">授权后重定向的回调地址,请使用UrlEncode对链接进行处理。注:要求redirect_url的域名要跟登记的业务域名一致,且业务域名不能带路径</param> /// <param name="reserved">(非必填)用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验,开发者可以填写a-zA-Z0-9的参数值,最多128字节</param> /// <param name="action">直接填get_confirm即可,保留默认值</param> /// <returns></returns> [ApiBind(Senparc.NeuChar.PlatformType.WeChat_OfficialAccount, "TemplateApi.GetSubscribeMsgUrl", true)] public static string GetSubscribeMsgUrl(string appId, int scene, string templateId, string redirectUrl, string reserved = null, string action = "get_confirm") { //无论直接打开还是做页面302重定向时,必须带#wechat_redirect参数 return string.Format("https://mp.weixin.qq.com/mp/subscribemsg?action={0}&appid={1}&scene={2}&template_id={3}&redirect_url={4}&reserved={5}#wechat_redirect", action, appId, scene, templateId, redirectUrl, reserved); } /// <summary> /// 模板消息接口 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="openId">填接收消息的用户openid</param> /// <param name="templateId">订阅消息模板ID</param> /// <param name="url">(非必须)点击消息跳转的链接,需要有ICP备案</param> /// <param name="data">消息正文,value为消息内容文本(200字以内),没有固定格式,可用\n换行,color为整段消息内容的字体颜色(目前仅支持整段消息为一种颜色)</param> /// <param name="miniProgram">(非必须)跳小程序所需数据,不需跳小程序可不用传该数据</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> [ApiBind(Senparc.NeuChar.PlatformType.WeChat_OfficialAccount, "TemplateApi.SendTemplateMessage", true)] public static SendTemplateMessageResult SendTemplateMessage(string accessTokenOrAppId, string openId, string templateId, string url, object data, TemplateModel_MiniProgram miniProgram = null, int timeOut = Config.TIME_OUT) { //文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB return ApiHandlerWapper.TryCommonApi(accessToken => { string urlFormat = Config.ApiMpHost + "/cgi-bin/message/template/send?access_token={0}"; var msgData = new TemplateModel() { touser = openId, template_id = templateId, // topcolor = topcolor, url = url, miniprogram = miniProgram, data = data, }; return CommonJsonSend.Send<SendTemplateMessageResult>(accessToken, urlFormat, msgData, timeOut: timeOut); }, accessTokenOrAppId); } /// <summary> /// 模板消息接口 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="openId"></param> /// <param name="templateMessageData"></param> /// <param name="miniProgram">跳小程序所需数据,不需跳小程序可不用传该数据</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> [ApiBind(Senparc.NeuChar.PlatformType.WeChat_OfficialAccount, "TemplateApi.SendTemplateMessage", true)] public static SendTemplateMessageResult SendTemplateMessage(string accessTokenOrAppId, string openId, ITemplateMessageBase templateMessageData, TemplateModel_MiniProgram miniProgram = null, int timeOut = Config.TIME_OUT) { return SendTemplateMessage(accessTokenOrAppId, openId, templateMessageData.TemplateId, templateMessageData.Url, templateMessageData, miniProgram, timeOut); } /// <summary> /// 【异步方法】模板消息接口 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="openId">填接收消息的用户openid</param> /// <param name="templateId">订阅消息模板ID</param> /// <param name="url">(非必须)点击消息跳转的链接,需要有ICP备案</param> /// <param name="data">消息正文,value为消息内容文本(200字以内),没有固定格式,可用\n换行,color为整段消息内容的字体颜色(目前仅支持整段消息为一种颜色)</param> /// <param name="miniProgram">(非必须)跳小程序所需数据,不需跳小程序可不用传该数据</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> /// <returns></returns> [ApiBind(Senparc.NeuChar.PlatformType.WeChat_OfficialAccount, "TemplateApi.SendTemplateMessageAsync", true)] public static async Task<SendTemplateMessageResult> SendTemplateMessageAsync(string accessTokenOrAppId, string openId, string templateId, string url, object data, TemplateModel_MiniProgram miniProgram = null, int timeOut = Config.TIME_OUT) { return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { string urlFormat = Config.ApiMpHost + "/cgi-bin/message/template/send?access_token={0}"; var msgData = new TemplateModel() { touser = openId, template_id = templateId, // topcolor = topcolor, url = url, miniprogram = miniProgram, data = data, }; return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync<SendTemplateMessageResult>(accessToken, urlFormat, msgData, timeOut: timeOut).ConfigureAwait(false); }, accessTokenOrAppId).ConfigureAwait(false); } /// <summary> /// 【异步方法】模板消息接口 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param> /// <param name="openId"></param> /// <param name="miniProgram">跳小程序所需数据,不需跳小程序可不用传该数据</param> /// <param name="templateMessageData"></param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> [ApiBind(Senparc.NeuChar.PlatformType.WeChat_OfficialAccount, "TemplateApi.SendTemplateMessageAsync", true)] public static async Task<SendTemplateMessageResult> SendTemplateMessageAsync(string accessTokenOrAppId, string openId, ITemplateMessageBase templateMessageData, TemplateModel_MiniProgram miniProgram = null, int timeOut = Config.TIME_OUT) { return await SendTemplateMessageAsync(accessTokenOrAppId, openId, templateMessageData.TemplateId, templateMessageData.Url, templateMessageData, miniProgram, timeOut).ConfigureAwait(false); } } }