微信公众号模板消息推送

在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧!

1、申请模板消息

首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2--3个工作日,结果第二天早上就发现已经开通了,所以说腾讯官方还是比较给力的哈)。

但是我们在申请时还是有一些东西要注意,这个在官方的文档有非常详细的说明。

这个我建议你好好看看。选择行业的时候可要谨慎些,因为这个一个月只可以修改一次。

那么,我们来看看在哪里申请?

这里我已经申请过了。

申请之后就耐心等待,审核通过之后再功能这一栏里就会出现模板消息的菜单。你可以看看我上面的截图,就在第三项。

2、添加模板消息

审核通过之后,我们就可以添加模板消息,进行开发了。

这个很简单:

我们点击模板消息进入后,直接在模板库中选择你需要的消息模板添加就可以了,添加之后就会在我的模板中。会有一个模板id,这个模板id在我们发送消息的时候会用到。

3、消息发送功能开发

接下来我们就看看如何发送模板消息:

这个是官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

我呢,也来说说我的实现吧。为了更方便,我会直接将相关代码贴出来。

文档中我们可以看到接口地址如下:


 
 
  1. http请求方式: POST
  2. https: //api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

这里我们首先需要的就是access_token了,这个在这里就不多说了。通过你的appid和secret就可以获取。

【获取access_token : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

关于相关参数,我直接就将官方文档贴来了(文档写的很清楚):

POST数据示例如下:


 
 
  1. {
  2. "touser": "OPENID",
  3. "template_id": "ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
  4. "url": "http://weixin.qq.com/download",
  5. "miniprogram":{
  6. "appid": "xiaochengxuappid12345",
  7. "pagepath": "index?foo=bar"
  8. },
  9. "data":{
  10. "first": {
  11. "value": "恭喜你购买成功!",
  12. "color": "#173177"
  13. },
  14. "keyword1":{
  15. "value": "巧克力",
  16. "color": "#173177"
  17. },
  18. "keyword2": {
  19. "value": "39.8元",
  20. "color": "#173177"
  21. },
  22. "keyword3": {
  23. "value": "2014年9月22日",
  24. "color": "#173177"
  25. },
  26. "remark":{
  27. "value": "欢迎再次购买!",
  28. "color": "#173177"
  29. }
  30. }
  31. }

参数说明

参数是否必填说明
touser接收者openid
template_id模板ID
url模板跳转链接(海外帐号没有跳转能力)
miniprogram跳小程序所需数据,不需跳小程序可不用传该数据
appid所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
pagepath所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),暂不支持小游戏
data模板数据
color模板内容字体颜色,不填默认为黑色

注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。

返回码说明

在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:


 
 
  1. {
  2. "errcode": 0,
  3. "errmsg": "ok",
  4. "msgid": 200228332
  5. }

相信看完以上文档,基本上没有什么问题了。

以下是我的部分代码:


 
 
  1. // 获取token
  2. String token = saveAndFlushAccessTokenUtil.getToken();
  3. String postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;
  4. JSONObject jsonObject = new JSONObject();
  5. jsonObject.put( "touser", "发送到用户的openid"); // openid
  6. jsonObject.put( "template_id", "你的模板id");
  7. jsonObject.put( "url", "http://www.baidu.com");
  8. JSONObject data = new JSONObject();
  9. JSONObject first = new JSONObject();
  10. first.put( "value", "hello");
  11. first.put( "color", "#173177");
  12. JSONObject keyword1 = new JSONObject();
  13. keyword1.put( "value", "hello");
  14. keyword1.put( "color", "#173177");
  15. JSONObject keyword2 = new JSONObject();
  16. keyword2.put( "value", "hello");
  17. keyword2.put( "color", "#173177");
  18. JSONObject keyword3 = new JSONObject();
  19. keyword3.put( "value", "hello");
  20. keyword3.put( "color", "#173177");
  21. JSONObject remark = new JSONObject();
  22. remark.put( "value", "hello");
  23. remark.put( "color", "#173177");
  24. data.put( "first",first);
  25. data.put( "keyword1",keyword1);
  26. data.put( "keyword2",keyword2);
  27. data.put( "keyword3",keyword3);
  28. data.put( "remark",remark);
  29. jsonObject.put( "data", data);
  30. String string = HttpClientUtils.sendPostJsonStr(postUrl, jsonObject.toJSONString());
  31. JSONObject result = JSON.parseObject( string);
  32. int errcode = result.getIntValue( "errcode");
  33. if(errcode == 0){
  34. // 发送成功
  35. System.out. println( "发送成功");
  36. } else {
  37. // 发送失败
  38. System.out. println( "发送失败");
  39. }

下面是http请求工具类:


 
 
  1. package car.repair.common.util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.http.HttpEntity;
  4. import org.apache.http.ParseException;
  5. import org.apache.http.client.ClientProtocolException;
  6. import org.apache.http.client.methods.CloseableHttpResponse;
  7. import org.apache.http.client.methods.HttpPost;
  8. import org.apache.http.entity.ContentType;
  9. import org.apache.http.entity.StringEntity;
  10. import org.apache.http.impl.client.CloseableHttpClient;
  11. import org.apache.http.impl.client.HttpClients;
  12. import org.apache.http.util.EntityUtils;
  13. import java.io.IOException;
  14. /**
  15. * @author zhuzhe
  16. * @date 2017/12/11
  17. * HttpClient工具类
  18. */
  19. @Slf4j
  20. public class HttpClientUtils {
  21. /**
  22. * 以jsonString形式发送HttpPost的Json请求,String形式返回响应结果
  23. *
  24. * @param url
  25. * @param jsonString
  26. * @return
  27. */
  28. public static String sendPostJsonStr(String url, String jsonString) throws IOException {
  29. if (jsonString == null || jsonString.isEmpty()) {
  30. return sendPost(url);
  31. }
  32. String resp = "";
  33. StringEntity entityStr = new StringEntity(jsonString,
  34. ContentType.create( "text/plain", "UTF-8"));
  35. CloseableHttpClient httpClient = HttpClients.createDefault();
  36. HttpPost httpPost = new HttpPost(url);
  37. httpPost.setEntity(entityStr);
  38. CloseableHttpResponse response = null;
  39. try {
  40. response = httpClient.execute(httpPost);
  41. HttpEntity entity = response.getEntity();
  42. resp = EntityUtils.toString(entity, "UTF-8");
  43. EntityUtils.consume(entity);
  44. } catch (ClientProtocolException e) {
  45. log.error(e.getMessage());
  46. } catch (IOException e) {
  47. log.error(e.getMessage());
  48. } finally {
  49. if (response != null) {
  50. try {
  51. response.close();
  52. } catch (IOException e) {
  53. log.error(e.getMessage());
  54. }
  55. }
  56. }
  57. if (resp == null || resp.equals( "")) {
  58. return "";
  59. }
  60. return resp;
  61. }
  62. /**
  63. * 发送不带参数的HttpPost请求
  64. *
  65. * @param url
  66. * @return
  67. */
  68. public static String sendPost(String url) throws IOException {
  69. // 1.获得一个httpclient对象
  70. CloseableHttpClient httpclient = HttpClients.createDefault();
  71. // 2.生成一个post请求
  72. HttpPost httppost = new HttpPost(url);
  73. CloseableHttpResponse response = null;
  74. try {
  75. // 3.执行get请求并返回结果
  76. response = httpclient.execute(httppost);
  77. } catch (IOException e) {
  78. log.error(e.getMessage());
  79. }
  80. // 4.处理结果,这里将结果返回为字符串
  81. HttpEntity entity = response.getEntity();
  82. String result = null;
  83. try {
  84. result = EntityUtils.toString(entity);
  85. } catch (ParseException | IOException e) {
  86. log.error(e.getMessage());
  87. }
  88. return result;
  89. }
  90. }

 

收到消息,我就不自己弄图了。这里附上官方图片一张:

 

转载请务必保留此出处(原作者):https://blog.csdn.net/zhuzhezhuzhe1/article/details/83927016

 

版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

https://blog.csdn.net/zhuzhezhuzhe1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值