微信模板消息开发

2017/11/26 posted in  微信开发

参考资源

前期准备

  1. 需要一个开通了模板消息的微信公众账号
  2. 添加消息模板。可以从模板库中选择添加;也可以新增,新增的模板需要通过微信审核,规则可以查看上面的模板消息运营规则 0F836621-5A44-4017-A8FC-E16EE778054E

开发

模板消息的开发比较简单,主要就是根据官方的POST数据格式构造消息数据,提交到 https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN 这个地址就行了。

数据格式

{
    "touser": "OPENID",
    "template_id": "ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
    "url": "http://weixin.qq.com/download",
    "miniprogram": {
        "appid": "xiaochengxuappid12345",
        "pagepath": "index?foo=bar"
    },
    "data": {
        "first": {
            "value": "恭喜你购买成功!",
            "color": "#173177"
        },
        "keynote1": {
            "value": "巧克力",
            "color": "#173177"
        },
        "keynote2": {
            "value": "39.8元",
            "color": "#173177"
        },
        "keynote3": {
            "value": "2014年9月22日",
            "color": "#173177"
        },
        "remark": {
            "value": "欢迎再次购买!",
            "color": "#173177"
        }
    }
}

参数说明
08434871-7C04-4FEA-9D63-D56D9597B099

提示:

  • ACCESS_TOKEN 是通过获取access_token接口获得
  • 提交参数中touser是接收者的openid。这个openid经测试通过微信浏览器里的网页授权获取的openid有效,但通过公开平台中的微信授权登录获取的openid无效

代码示例

/// <summary>模板消息
/// </summary>
public class TemplateMessage
{
    private static string GetMessageJson(TemplateMessageInfo messageInfo)
    {
        JObject result = new JObject
        {
            ["touser"] = messageInfo.OpenId,
            ["template_id"] = messageInfo.TemplateId
        };
        if (messageInfo.Url.IsNotEmpty())
            result["url"] = messageInfo.Url.ToStr();

        if (messageInfo.AppId.IsNotEmpty())
        {
            result["miniprogram"] = new JObject
            {
                ["appid"] = messageInfo.AppId,
                ["pagepath"] = messageInfo.PagePath
            };
        }


        JObject o = new JObject();
        foreach (var item in messageInfo.Datas)
        {

            JObject dataItem = new JObject
            {
                ["value"] = item.KeywordValue
            };

            if (item.Color.IsNotEmpty())
                dataItem["color"] = item.Color;

            o[item.KeywordName] = dataItem;
        }

        result["data"] = o;
        return result.ToString();
    }
        
    public static AjaxResult SendMessage(string appId, string appSecret, TemplateMessageInfo messageInfo)
    {
        if (messageInfo == null) return new AjaxResult("");
        if (messageInfo.OpenId.IsEmpty()) return new AjaxResult("消息接受者不能为空");
        if (messageInfo.TemplateId.IsEmpty()) return new AjaxResult("发送消息模板ID不能为空");

        WxMpConfig config = Mp.GetWpConfig(appId, appSecret);
        string sendUrl = string.Format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}", config.Token);
        string postdata = GetMessageJson(messageInfo);
        string result = HttpHelper.PostUrl(sendUrl, postdata);
        if (result.IsEmpty()) return new AjaxResult("发送消息无返回值");

        JObject oResult = JObject.Parse(result);
        if (oResult == null) return new AjaxResult
        {
            IsSuccess = false,
            Message = "消息返回解析失败",
            ResponseData = result
        };

        if (oResult["errcode"].ToInt(-1) != 0) return new AjaxResult(oResult["errmsg"].ToStr());

        return new AjaxResult(true, "发送成功");
    }
}


public class TemplateMessageInfo
{
    /// <summary>接收用户的微信OpenId,必填
    /// </summary>
    public string OpenId { get; set; }

    /// <summary>模板Id,必填
    /// </summary>
    public string TemplateId { get; set; }

    /// <summary>模板跳转链接
    /// </summary>
    public string Url { get; set; }

    /// <summary>模板内容字体颜色,不填默认为黑色
    /// </summary>
    public string TopColor { get; set; }

    /// <summary>模板数据
    /// </summary>
    public List<TemplateMessageData> Datas { get; set; }

    /// <summary>
    /// 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,并且小程序要求是已发布的)
    /// </summary>
    public string AppId { get; set; }

    /// <summary>
    /// 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
    /// </summary>
    public string PagePath { get; set; }
}

public class TemplateMessageData
{
    /// <summary>占位符名称
    /// </summary>
    public string KeywordName { get; set; }

    /// <summary>占位符值
    /// </summary>
    public string KeywordValue { get; set; }

    /// <summary>颜色
    /// </summary>
    public string Color { get; set; }
}

调用

TemplateMessage.SendMessage("*****", "*****",
new TemplateMessageInfo
{
    OpenId = user.WxUid,
    TemplateId = "*****",
    Datas = new List<TemplateMessageData>
    {
       new TemplateMessageData
       {
           KeywordName = "first",
           KeywordValue = "您提交的服务申请已收到,请保持手机畅通,稍后会有服务工程师与您联系服务时间。"
       },
       new TemplateMessageData
       {
           KeywordName = "keynote1",
           KeywordValue = "已申请"
       },
       new TemplateMessageData
       {
           KeywordName = "keynote2",
           KeywordValue = DateTime.Now.ToString("yyyy年MM月dd日 HH:mm")
       },
       new TemplateMessageData
       {
           KeywordName = "remark",
           KeywordValue = "感谢您选择我们的服务"
       }
    }
});

以上就是我自己的微信模板消息开发总结,如有不对,欢迎来信指正。