1. 程式人生 > >微信公眾號開發之傳送模板訊息

微信公眾號開發之傳送模板訊息

在我們做微信公眾號開發時,傳送模板訊息往往是必不可少的功能。今天我們就來說說吧!

1、申請模板訊息

首先我們應該知道,模板訊息是需要申請的。這個申請就其本身來說是很easy的(我前一天晚上申請的,顯示需要2--3個工作日,結果第二天早上就發現已經開通了,所以說騰訊官方還是比較給力的哈)。

但是我們在申請時還是有一些東西要注意,這個在官方的文件有非常詳細的說明。

這個我建議你好好看看。選擇行業的時候可要謹慎些,因為這個一個月只可以修改一次。

那麼,我們來看看在哪裡申請?

這裡我已經申請過了。

申請之後就耐心等待,稽核通過之後再功能這一欄裡就會出現模板訊息的選單。你可以看看我上面的截圖,就在第三項。

2、新增模板訊息

稽核通過之後,我們就可以新增模板訊息,進行開發了。

這個很簡單:

我們點選模板訊息進入後,直接在模板庫中選擇你需要的訊息模板新增就可以了,新增之後就會在我的模板中。會有一個模板id,這個模板id在我們傳送訊息的時候會用到。

3、訊息傳送功能開發

接下來我們就看看如何傳送模板訊息:

這個是官方文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

我呢,也來說說我的實現吧。為了更方便,我會直接將相關程式碼貼出來。

文件中我們可以看到介面地址如下:

http請求方式: POST
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資料示例如下:

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

引數說明

引數 是否必填 說明
touser 接收者openid
template_id 模板ID
url 模板跳轉連結(海外帳號沒有跳轉能力)
miniprogram 跳小程式所需資料,不需跳小程式可不用傳該資料
appid 所需跳轉到的小程式appid(該小程式appid必須與發模板訊息的公眾號是繫結關聯關係,暫不支援小遊戲)
pagepath 所需跳轉到小程式的具體頁面路徑,支援帶引數,(示例index?foo=bar),暫不支援小遊戲
data 模板資料
color 模板內容字型顏色,不填預設為黑色

注:url和miniprogram都是非必填欄位,若都不傳則模板無跳轉;若都傳,會優先跳轉至小程式。開發者可根據實際需要選擇其中一種跳轉方式即可。當用戶的微信客戶端版本不支援跳小程式時,將會跳轉至url。

返回碼說明

在呼叫模板訊息介面後,會返回JSON資料包。正常時的返回JSON資料包示例:

    {
           "errcode":0,
           "errmsg":"ok",
           "msgid":200228332
       }

相信看完以上文件,基本上沒有什麼問題了。

以下是我的部分程式碼:

// 獲取token
        String token = saveAndFlushAccessTokenUtil.getToken();

        String postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("touser", "傳送到使用者的openid");   // openid
        jsonObject.put("template_id", "你的模板id");
        jsonObject.put("url", "http://www.baidu.com");

        JSONObject data = new JSONObject();
        JSONObject first = new JSONObject();
        first.put("value", "hello");
        first.put("color", "#173177");
        JSONObject keyword1 = new JSONObject();
        keyword1.put("value", "hello");
        keyword1.put("color", "#173177");
        JSONObject keyword2 = new JSONObject();
        keyword2.put("value", "hello");
        keyword2.put("color", "#173177");
        JSONObject keyword3 = new JSONObject();
        keyword3.put("value", "hello");
        keyword3.put("color", "#173177");
        JSONObject remark = new JSONObject();
        remark.put("value", "hello");
        remark.put("color", "#173177");
        
        data.put("first",first);
        data.put("keyword1",keyword1);
        data.put("keyword2",keyword2);
        data.put("keyword3",keyword3);
        data.put("remark",remark);

        jsonObject.put("data", data);

        String string = HttpClientUtils.sendPostJsonStr(postUrl, jsonObject.toJSONString());
        JSONObject result = JSON.parseObject(string);
        int errcode = result.getIntValue("errcode");
        if(errcode == 0){
            // 傳送成功
            System.out.println("傳送成功");
        } else {
            // 傳送失敗
            System.out.println("傳送失敗");
        }

下面是http請求工具類:

package car.repair.common.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * @author zhuzhe
 * @date 2017/12/11
 * HttpClient工具類
 */
@Slf4j
public class HttpClientUtils {

    /**
     * 以jsonString形式傳送HttpPost的Json請求,String形式返回響應結果
     *
     * @param url
     * @param jsonString
     * @return
     */
    public static String sendPostJsonStr(String url, String jsonString) throws IOException {
        if (jsonString == null || jsonString.isEmpty()) {
            return sendPost(url);
        }
        String resp = "";
        StringEntity entityStr = new StringEntity(jsonString,
                ContentType.create("text/plain", "UTF-8"));
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(entityStr);
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            resp = EntityUtils.toString(entity, "UTF-8");
            EntityUtils.consume(entity);
        } catch (ClientProtocolException e) {
            log.error(e.getMessage());
        } catch (IOException e) {
            log.error(e.getMessage());
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
        if (resp == null || resp.equals("")) {
            return "";
        }
        return resp;
    }

    /**
     * 傳送不帶引數的HttpPost請求
     *
     * @param url
     * @return
     */
    public static String sendPost(String url) throws IOException {
        // 1.獲得一個httpclient物件
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 2.生成一個post請求
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        try {
            // 3.執行get請求並返回結果
            response = httpclient.execute(httppost);
        } catch (IOException e) {
            log.error(e.getMessage());
        }
        // 4.處理結果,這裡將結果返回為字串
        HttpEntity entity = response.getEntity();
        String result = null;
        try {
            result = EntityUtils.toString(entity);
        } catch (ParseException | IOException e) {
            log.error(e.getMessage());
        }
        return result;
    }
}

 

收到訊息,我就不自己弄圖了。這裡附上官方圖片一張:

 

轉載請務必保留此出處(原作者):https://blog.csdn.net/zhuzhezhuzhe1/article/details/83927016

 

版權宣告:本文為原創文章,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本宣告。

https://blog.csdn.net/zhuzhezhuzhe1