水晶居士 發表於 2021-7-22 10:44:00

微信公众号开发之发送模板消息

<p>&nbsp;</p>
<p>&nbsp;</p>
<p>订阅专栏<br>在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧!</p>
<p>1、申请模板消息<br>首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2--3个工作日,结果第二天早上就发现已经开通了,所以说腾讯官方还是比较给力的哈)。</p>
<p>但是我们在申请时还是有一些东西要注意,这个在官方的文档有非常详细的说明。</p>
<p>&nbsp;</p>
<p>这个我建议你好好看看。选择行业的时候可要谨慎些,因为这个一个月只可以修改一次。</p>
<p>那么,我们来看看在哪里申请?</p>
<p>&nbsp;</p>
<p>这里我已经申请过了。</p>
<p>申请之后就耐心等待,审核通过之后再功能这一栏里就会出现模板消息的菜单。你可以看看我上面的截图,就在第三项。</p>
<p>2、添加模板消息<br>审核通过之后,我们就可以添加模板消息,进行开发了。</p>
<p>这个很简单:</p>
<p>&nbsp;</p>
<p>我们点击模板消息进入后,直接在模板库中选择你需要的消息模板添加就可以了,添加之后就会在我的模板中。会有一个模板id,这个模板id在我们发送消息的时候会用到。</p>
<p>&nbsp;</p>
<p>3、消息发送功能开发<br>接下来我们就看看如何发送模板消息:</p>
<p>这个是官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1433751277</p>
<p>我呢,也来说说我的实现吧。为了更方便,我会直接将相关代码贴出来。</p>
<p>文档中我们可以看到接口地址如下:</p>
<p>http请求方式: POST<br>https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN<br>这里我们首先需要的就是access_token了,这个在这里就不多说了。通过你的appid和secret就可以获取。</p>
<p>【获取access_token : https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140183】</p>
<p>关于相关参数,我直接就将官方文档贴来了(文档写的很清楚):</p>
<p>POST数据示例如下:</p>
<p>      {<br>         "touser":"OPENID",<br>         "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",<br>         "url":"http://weixin.qq.com/download",<br>         "miniprogram":{<br>             "appid":"xiaochengxuappid12345",<br>             "pagepath":"index?foo=bar"<br>         },          <br>         "data":{<br>                   "first": {<br>                     "value":"恭喜你购买成功!",<br>                     "color":"#173177"<br>                   },<br>                   "keyword1":{<br>                     "value":"巧克力",<br>                     "color":"#173177"<br>                   },<br>                   "keyword2": {<br>                     "value":"39.8元",<br>                     "color":"#173177"<br>                   },<br>                   "keyword3": {<br>                     "value":"2014年9月22日",<br>                     "color":"#173177"<br>                   },<br>                   "remark":{<br>                     "value":"欢迎再次购买!",<br>                     "color":"#173177"<br>                   }<br>         }<br>       }<br>参数说明</p>
<p>参数        是否必填        说明<br>touser        是        接收者openid<br>template_id        是        模板ID<br>url        否        模板跳转链接(海外帐号没有跳转能力)<br>miniprogram        否        跳小程序所需数据,不需跳小程序可不用传该数据<br>appid        是        所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)<br>pagepath        否        所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),暂不支持小游戏<br>data        是        模板数据<br>color        否        模板内容字体颜色,不填默认为黑色<br>注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。</p>
<p>返回码说明</p>
<p>在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:</p>
<p>    {<br>         "errcode":0,<br>         "errmsg":"ok",<br>         "msgid":200228332<br>       }<br>相信看完以上文档,基本上没有什么问题了。</p>
<p>以下是我的部分代码:</p>
<p>// 获取token<br>      String token = saveAndFlushAccessTokenUtil.getToken();<br> <br>      String postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;<br> <br>      JSONObject jsonObject = new JSONObject();<br>      jsonObject.put("touser", "发送到用户的openid");   // openid<br>      jsonObject.put("template_id", "你的模板id");<br>      jsonObject.put("url", "http://www.baidu.com");<br> <br>      JSONObject data = new JSONObject();<br>      JSONObject first = new JSONObject();<br>      first.put("value", "hello");<br>      first.put("color", "#173177");<br>      JSONObject keyword1 = new JSONObject();<br>      keyword1.put("value", "hello");<br>      keyword1.put("color", "#173177");<br>      JSONObject keyword2 = new JSONObject();<br>      keyword2.put("value", "hello");<br>      keyword2.put("color", "#173177");<br>      JSONObject keyword3 = new JSONObject();<br>      keyword3.put("value", "hello");<br>      keyword3.put("color", "#173177");<br>      JSONObject remark = new JSONObject();<br>      remark.put("value", "hello");<br>      remark.put("color", "#173177");<br>      <br>      data.put("first",first);<br>      data.put("keyword1",keyword1);<br>      data.put("keyword2",keyword2);<br>      data.put("keyword3",keyword3);<br>      data.put("remark",remark);<br> <br>      jsonObject.put("data", data);<br> <br>      String string = HttpClientUtils.sendPostJsonStr(postUrl, jsonObject.toJSONString());<br>      JSONObject result = JSON.parseObject(string);<br>      int errcode = result.getIntValue("errcode");<br>      if(errcode == 0){<br>            // 发送成功<br>            System.out.println("发送成功");<br>      } else {<br>            // 发送失败<br>            System.out.println("发送失败");<br>      }<br>下面是http请求工具类:</p>
<p>package car.repair.common.util;<br> <br>import lombok.extern.slf4j.Slf4j;<br>import org.apache.http.HttpEntity;<br>import org.apache.http.ParseException;<br>import org.apache.http.client.ClientProtocolException;<br>import org.apache.http.client.methods.CloseableHttpResponse;<br>import org.apache.http.client.methods.HttpPost;<br>import org.apache.http.entity.ContentType;<br>import org.apache.http.entity.StringEntity;<br>import org.apache.http.impl.client.CloseableHttpClient;<br>import org.apache.http.impl.client.HttpClients;<br>import org.apache.http.util.EntityUtils;<br> <br>import java.io.IOException;<br> <br>/**<br> * @author zhuzhe<br> * @date 2017/12/11<br> * HttpClient工具类<br> */<br>@Slf4j<br>public class HttpClientUtils {<br> <br>    /**<br>   * 以jsonString形式发送HttpPost的Json请求,String形式返回响应结果<br>   *<br>   * @param url<br>   * @param jsonString<br>   * @return<br>   */<br>    public static String sendPostJsonStr(String url, String jsonString) throws IOException {<br>      if (jsonString == null || jsonString.isEmpty()) {<br>            return sendPost(url);<br>      }<br>      String resp = "";<br>      StringEntity entityStr = new StringEntity(jsonString,<br>                ContentType.create("text/plain", "UTF-8"));<br>      CloseableHttpClient httpClient = HttpClients.createDefault();<br>      HttpPost httpPost = new HttpPost(url);<br>      httpPost.setEntity(entityStr);<br>      CloseableHttpResponse response = null;<br>      try {<br>            response = httpClient.execute(httpPost);<br>            HttpEntity entity = response.getEntity();<br>            resp = EntityUtils.toString(entity, "UTF-8");<br>            EntityUtils.consume(entity);<br>      } catch (ClientProtocolException e) {<br>            log.error(e.getMessage());<br>      } catch (IOException e) {<br>            log.error(e.getMessage());<br>      } finally {<br>            if (response != null) {<br>                try {<br>                  response.close();<br>                } catch (IOException e) {<br>                  log.error(e.getMessage());<br>                }<br>            }<br>      }<br>      if (resp == null || resp.equals("")) {<br>            return "";<br>      }<br>      return resp;<br>    }<br> <br>    /**<br>   * 发送不带参数的HttpPost请求<br>   *<br>   * @param url<br>   * @return<br>   */<br>    public static String sendPost(String url) throws IOException {<br>      // 1.获得一个httpclient对象<br>      CloseableHttpClient httpclient = HttpClients.createDefault();<br>      // 2.生成一个post请求<br>      HttpPost httppost = new HttpPost(url);<br>      CloseableHttpResponse response = null;<br>      try {<br>            // 3.执行get请求并返回结果<br>            response = httpclient.execute(httppost);<br>      } catch (IOException e) {<br>            log.error(e.getMessage());<br>      }<br>      // 4.处理结果,这里将结果返回为字符串<br>      HttpEntity entity = response.getEntity();<br>      String result = null;<br>      try {<br>            result = EntityUtils.toString(entity);<br>      } catch (ParseException | IOException e) {<br>            log.error(e.getMessage());<br>      }<br>      return result;<br>    }<br>}<br> <br> </p>
<p>收到消息,我就不自己弄图了。这里附上官方图片一张:</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/onesea/p/15042994.html
頁: [1]
查看完整版本: 微信公众号开发之发送模板消息