【微信公众平台开发】发送模板消息

最近在搞微信公众平台开发,需求是发送模板消息,相关的接口在开发者文档中有很详细的说明,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277。

下面我们来看看具体怎么实现自己的需求:
一、点击以上链接,我们看到有7个接口,我们要用的就是第六个,发送模板消息,其他接口可根据自己业务需求来实现。
在这里插入图片描述
二、发送模板消息接口:
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

post数据示例如下:

{
       "touser":"OPENID",
       "template_id":"TEMPLATEID",
       "data":{
               "first": {
                   "value":"恭喜你购买成功!",
                   "color":"#173177"
               },
               "product":{
                   "value":"巧克力",
                   "color":"#173177"
               },
               "amount": {
                   "value":"39.8元",
                   "color":"#173177"
               },
               "time": {
                   "value":"2014年9月22日",
                   "color":"#173177"
               },
               "remark":{
                   "value":"欢迎再次购买!",
                   "color":"#173177"
               }
       }
}

但是template_id和openid怎么获取呢
三、微信公众平台提供了公众平台测试账号,有权限限制的接口都可以在这里测试
在这里插入图片描述
1、接口测试号申请:
在这里插入图片描述
URL是启动你自己的项目后某个接口的请求地址,但要是外网的地址;Token是自己随意写的。
URL如果没有自己的地址,没关系,可以使用nettools,做内网穿透,映射到本地80端口即可:
在这里插入图片描述
2、扫描关注二维码,模拟用户,微信号为用户openid:
在这里插入图片描述
3、添加模板
在这里插入图片描述
模板内容有填写规则:
在这里插入图片描述
填写后如下示例:
在这里插入图片描述
好了,到现在openid和templateid都有了,我们开始测试。
在这里插入图片描述
返回成功!
测试环境跑通,我们只要将需要传的参数带上,请求腾讯的接口,就可以完成一次模板消息的发送。

java后端代码,我们需要封装实体:

@Data
public class WxTemplateDomain implements Serializable {
    private String toUser;
    private String templateId;
    private String url;
    private Map<String, TemplateParam> data;
}
@Data
public class TemplateParam {
    private String  value;
    private String  color;
}

然后在逻辑处理service层调用腾讯接口:

public static final String TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";

/**
     * 发送模板消息
     * @param wxTemplateDomain
     * @return
     */
    public JSONObject getTemplate(WxTemplateDomain wxTemplateDomain,String token){
        //发送模板消息
        String domain = JSONSerializer.toJSON(wxTemplateDomain).toString();
        String result = HttpUtils.postJson(TEMPLATE_URL+token,domain);
        JSONObject object = JSONObject.parseObject(result);
        if (object != null) {
            int errcode = object.getIntValue("errcode");
            if (errcode != 0) {
                throw new ApiException(1, object.getString("errmsg"));
            }
        }
        return object;
    }

在发post请求调用腾讯接口的时候,原来我用的是post(String url,Map<String,?>requestParam),但每次到这里都报错47001,JSON/xml解析错误,网上查了多种解答,试过后无效,所以干脆用了postjson这种方式。