1. 程式人生 > >微信公眾平臺開發-傳送模板訊息

微信公眾平臺開發-傳送模板訊息

微信公眾賬號開發-傳送模板訊息:

內容概要

本篇文章主要敘述如何在微信公眾帳號上實現傳送模板訊息開發功能。包含json的封裝與解析。

何謂模板訊息

為了保證使用者不受到騷擾,在開發者出現需要主動提醒、通知使用者時,才允許開發者在公眾平臺網站中模板訊息庫中選擇模板,選擇後獲得模板ID,再根據模板ID向用戶主動推送提醒、通知訊息。

注意:模板訊息只能開發者主動向微信使用者傳送,不能有使用者被動發起。

尋找介面(資料來源)

開發者需向微信伺服器傳送post請求,並攜帶根據模板配裝好的一個json包。

請求地址:

json格式:

參考微信介面文件https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=663979174&lang=zh_CN

開發步驟

1) 獲取模板ID

2) 構造模版訊息體並請求介面

程式碼及實現

獲取模板id:

1、具有支付能力的公眾號才可以使用模板訊息進行服務。在微信公眾平臺的後臺,依次進入“功能->新增功能外掛->模版訊息”,即可申請模版訊息。


點選申請

申請時,選擇2個和自己相關的兩個行業即可。

提交併且申請通過後,可以在模版庫中看到模版訊息列表

進入想使用的模板,點選新增

新增後就存到“我的模板庫”中了(每個賬號可以最多可以新增10個模板到“我的模板庫”中)

檢視模版的詳情,可以看到模版id及各項內容引數名。

不同的模版訊息的內容結構不一樣。這些id及欄位名將在程式中使用到。

注意:如果模板庫中沒有你想使用的模板時,可以在模板庫頁面點選“幫助我們完善模板庫”建立自己的訊息模板,建立訊息模板需要申請,稽核通過後該模板將被新增到該行業的模板庫中。每個賬號每月只能申請3個模板。

點選幫助我們完善模板庫

 

程式碼實現(java,建議將程式碼複製到Eclipse編輯器,看起來效果就不凌亂了):

1、構造模板體(json包),以交易提醒模板為例,這裡封裝成一個TradingNotice類。構造該類時需傳入接收者微信的openid、模板id、模板主體顏色、使用者名稱。程式碼中採用LinkedHashMap是為了保證資料是以存入的順序排序,從而保證json格式的結構不被打亂。

import java.util.LinkedHashMap;

import java.util.Map;

public classTradingNotice {

   privateMap<String,Object>map;

   privateMap<String,Object>data;

   public TradingNotice(Stringtouser, String template_id, Stringurl, String topcolor,Stringuser) {

      map=newLinkedHashMap<String, Object>();

      data=newLinkedHashMap<String, Object>();

      LinkedHashMap<String,String>first=newLinkedHashMap<String,String>();

      first.put("value","尊敬的" +user + "\n\n您尾號為0426的招商銀行卡最近有一筆交易(測試)");

      first.put("color","#743A3A");

      data.put("first",first);

      LinkedHashMap<String,String>keyword1=newLinkedHashMap<String,String>();

      keyword1.put("value","YXJ134953845");

      keyword1.put("color","#FF0000");

      data.put("keyword1",keyword1);

      LinkedHashMap<String,String>keyword2=newLinkedHashMap<String,String>();

      keyword2.put("value","2014/08/18 13:18");

      keyword2.put("color","#C4C400");

      data.put("keyword2",keyword2);

      LinkedHashMap<String,String>keyword3=newLinkedHashMap<String,String>();

      keyword3.put("value","1888888888");

      keyword3.put("color","#0000FF");

      data.put("keyword3",keyword3);

      LinkedHashMap<String,String>keyword4=newLinkedHashMap<String,String>();

      keyword4.put("value","消費");

      keyword4.put("color","#008000");

      data.put("keyword4",keyword4);

      LinkedHashMap<String,String>keyword5=newLinkedHashMap<String,String>();

      keyword5.put("value","26萬元");

      keyword5.put("color","#008000");

      data.put("keyword5",keyword5);

      LinkedHashMap<String,String>remark=newLinkedHashMap<String,String>();

      remark.put("value","\n\n截止2014/08/18 13:18您招商信用賬戶可用餘額未20000");

      remark.put("color","#000000");

      data.put("remark",remark);

      map.put("touser",touser);

      map.put("template_id",template_id);

      map.put("url",url);

      map.put("topcolor",topcolor);

      map.put("data",data);

   }

   public Map<String,Object> getMap() {

      return map;

   }

   public void setMap(Map<String,Object> map){

      this.map =map;

   }

   public Map<String,Object> getDate() {

      return data;

   }

   public void setDate(Map<String,Object> date){

      this.data =date;

   }

}

2、方法create_TN_Json用來構造json包,方法getUserData用來獲取關注者暱稱,需傳入客戶的openid。方法getUserList用來獲取微信關注者列表,將所有關注者的openid儲存在一個ArrayList中。由於獲取關注者列表一次只能獲取1000個微訊號,所以當關注者多餘1000的時候迴圈呼叫方法getUserJson來獲取所有關注者賬號。

方法send_Json用來發送模板訊息請求,必須採用post請求

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.Iterator;

import wx.sunl.menus.Get_Token;

import wx.sunl.template.TradingNotice;

import net.sf.json.JSONObject;

public classCreate_Json {

   //獲取交易提醒json;

   public static JSONObjectcreate_TN_Json(String touser,String user){

      JSONObjectjsonObject=null;

      //模板id

      Stringtemplate_id="15Eox4OfGsjFYaVRwk9Dbos_aaIkzveCkpG3AsnKqLA";

      //點選模板後的連結地址

      Stringurl="www.baidu.com";

      //模板的主題顏色

      Stringtopcolor="#008000";

      //構造json

      TradingNoticewn = new TradingNotice(touser,template_id,url,topcolor,user);

      jsonObject=JSONObject.fromObject(wn.getMap());

      return jsonObject;

   }

   //入口;

   public static void main(String[] args){

      //檢查access_token是否過期,如果過期重新產生

      //Get_Token.TwoDate();

      //呼叫getUserList獲取關注者列表

      ArrayList<String>users= getUserList();

      if(users!=null){

         Iterator<String>user=users.iterator();

         JSONObjectjsonObject1=null;

         Stringopen_id= null;

         StringuserName= null;

         while(user.hasNext()){

            open_id = user.next();

            //呼叫getUserData獲取關注者暱稱

            userName = getUserData(open_id);

            if(userName!=null){

                //建立交易提醒json;

                jsonObject1 = Create_Json.create_TN_Json(open_id,userName);

                //傳送交易提醒模板訊息;

                send_Json(jsonObject1.toString(),Get_Token.access_token);

            }

         }

      }

   }

   //獲取使用者基本資訊(UnionID機制);

   public static StringgetUserData(String openid){

        StringBuffer bufferRes =new StringBuffer();

        String result=null;

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + Get_Token.access_token +"&openid=" + openid+"&lang=zh_CN");

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 請求方式

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setRequestMethod("GET");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

                conn.connect();

                // 獲取URLConnection物件對應的輸入流

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 關閉連線

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

        //將返回的字串轉換成json

        JSONObject jsonObject = JSONObject.fromObject(bufferRes.toString());

        //解析json中的資料

        String subscribe = jsonObject.get("subscribe").toString();

        //等於1表示有關注者,0表示沒有關注者

        if("1".equals(subscribe.toString())){

          //解析出關注者的暱稱

          result = (String)jsonObject.get("nickname");

        }

        returnresult;

   }

   //獲取關注列表;

   @SuppressWarnings("unchecked")

   public static ArrayList<String>getUserList() {

        StringBuffer bufferRes =new StringBuffer();

        ArrayList<String> users =null;

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + Get_Token.access_token);

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 請求方式

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setRequestMethod("GET");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

                conn.connect();

                // 獲取URLConnection物件對應的輸入流

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 關閉連線

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

        //將返回的字串轉換成json

        JSONObject jsonObject = JSONObject.fromObject(bufferRes.toString());

        //解析json中表示openid的列表

        JSONObject data = (JSONObject)jsonObject.get("data");

        if(data!=null){

          //openid列表轉化成陣列儲存

          users = newArrayList<String>(data.getJSONArray("openid"));

          //獲取關注者總數

          intcount = Integer.parseInt(jsonObject.get("total").toString());

          if(count>1000){

             JSONObjectobject=jsonObject;

             Stringnext_openid=null;

             JSONObjectob_data=null;

             ArrayList<String>ob_user=null;

             //大於1000需要多次獲取,或許次數為count/1000

             for(inti=0;i<count/1000;i++){

                //解析出下次獲取的啟示openid

                next_openid = object.get("next_openid").toString();

                object = getUserJson(next_openid);

                ob_data = (JSONObject)object.get("data");

                ob_user = newArrayList<String>(ob_data.getJSONArray("openid"));

                for(Stringopen_id : ob_user){

                    //將多次獲取的openid新增到同一個陣列

                    users.add(open_id);

                }

            }

          }

        }

        returnusers;

   }

   //連續獲取關注列表;

   public static JSONObjectgetUserJson(String next_openid) {

        StringBuffer bufferRes =new StringBuffer();

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + Get_Token.access_token +"&next_openid=" + next_openid);

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 請求方式

                conn.setDoOutput(true);

               conn.setDoInput(true);

                conn.setRequestMethod("GET");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

               conn.connect();

                // 獲取URLConnection物件對應的輸入流

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 關閉連線

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

        JSONObject jsonObject = JSONObject.fromObject(bufferRes);

        returnjsonObject;

   }

   //傳送模板;

   publicstaticvoidsend_Json(Stringparams,StringaccessToken){

        StringBuffer bufferRes =new StringBuffer();

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" +accessToken);

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 請求方式

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setRequestMethod("POST");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

                conn.connect();

                // 獲取URLConnection物件對應的輸出流

                OutputStreamWriter out =new OutputStreamWriter(conn.getOutputStream(),"UTF-8");

                // 傳送請求引數

                //out.write(URLEncoder.encode(params,"UTF-8"));

                //傳送json

                out.write(params);

               out.flush();

                out.close();

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                //輸出返回的json

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 關閉連線

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

   }

}

注意:

建立json包時要根據模板內容構造。

列如:交易提醒建立的json為:

{"touser":"",

"template_id":"",

"url":"",

"topcolor":"",

"data":{

"first":{"value":"","color":""},

"keyword1":{"value":"","color":""},

"keyword2":{"value":"","color":""},

"keyword3":{"value":"","color":""},

"keyword4":{"value":"","color":""},

"keyword5":{"value":"","color":""},

"remark":{"value":"","color":""}}}

筆試通知提醒建立的json為:

{"touser":"",

"template_id":"",

"url":"",

"topcolor":"",

"data":{

"first":{"value":"","color":""},

"company":{"value":"","color":""},

"datetime":{"value":"","color":""},

"address":{"value":"","color":""},

"contact":{"value":"","color":""},

"remark":{"value":"","color":""}}}