最近在搞微信公众平台开发,需求是发送模板消息,相关的接口在开发者文档中有很详细的说明,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这种方式。