公眾號開發筆記

程式設計師哆啦A夢發表於2020-11-06

標題圖

前言

微信公眾平臺開發模板訊息,用於公眾號向使用者傳送服務通知,如學生進校門,用校卡滴,就可以在公眾號接收服務通知,表明學生進校.在公眾號內申請功能,新增模板訊息.

只有認證後的服務號才能申請模板訊息,需要選擇2個行業,MP(維基百科,自由的百科全書),模板訊息需要模板的ID,和模板中各種引數,內容以".DATA"結尾,否則視為保留字,模板保留符號"{{ }}".

設定行業可以在公眾平臺後臺完成,介面呼叫:

這個步驟需要access_token

// 請求方式: POST https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN

資料:

{ "industry_id1":"1", "industry_id2":"4" }

引數說明

| 引數 | 說明 | | ------ | ------ | | access_token | 介面呼叫憑證 | | industry_id1 | 行業編號 | | industry_id2 | 行業編號 |

行業程式碼查詢:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

獲取設定的行業資訊:

// 請求方式:GET https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=ACCESS_TOKEN

需要access_token介面呼叫憑證,返回示例:

{ "primary_industry":{"first_class":"運輸與倉儲","second_class":"快遞"}, "secondary_industry":{"first_class":"IT科技","second_class":"網際網路|電子商務"} }

primary_industry: 主營行業 secondary_industry: 副營行業

獲取模板ID: 可以在公眾平臺後獲取模板ID:

// 請求方式: POST https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN

需要access_token

post後的資料:

{ "template_id_short":"TM00015" }

template_id_short: 是模板庫中模板的編號.

返回模板訊息的介面,獲取json資料:

{ "errcode":0, "errmsg":"ok", "template_id":"Doclyl5uP7Aciu-qZ7mJNPtWkbkYnWBWVja26EGbNyk" }

獲取模板列表

獲取帳號下所有模板資訊:

提供的介面:

// 請求方式:GET https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN

返回的資料:

圖1

呼叫介面進行刪除某賬號下的模板:

``` // 請求方式:POST

https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=ACCESS_TOKEN

POST資料說明如下:

{ "template_id" : "Dyvp3-Ff0cnail_CDSzk1fIc6-9lOkxsQE7exTJbwUE" } ```

template_id: 模板訊息ID

刪除成功:

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

傳送模板訊息

呼叫介面:

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

圖2

需要:

OPENID template_id url miniprogram

圖3

呼叫模板訊息介面成功:

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

事件推送

訊息模板傳送成功到公眾號,微信伺服器會將是否傳送成功作為通知到開發者中心的伺服器配置地址中.

推送xml程式碼:

圖4

圖5

圖6

模版訊息介面文件

https://www.cnblogs.com/jiqing9006/p/5220571.html

對模板進行檢視詳情:

圖7

# 可向指定openID群發

https://segmentfault.com/a/1190000012828138

php的實現

https://www.cnblogs.com/jiqing9006/p/5220571.html

  1. 例項化 --> 獲取appid,appsecret
  2. 獲取access_token
  3. 傳送模板訊息
  4. 組合訊息資料
  5. 獲取openid, 併傳送訊息

傳送模板訊息的介面:

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

傳送模板的方法:

//傳送模板訊息的介面 public static final String SEND_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; /** * 傳送模板 * */ public static void sendTemplate(String data){ String result = HttpUtil.post(SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", getAccessToken()),data); System.out.println(result); }

getAccessToken的方法:

驗證接入

圖8

微信公眾平臺介面測試帳號申請

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

公眾號開發:

appidappsecret

配置引數: URL(自己的伺服器地址)和Token(可任意填寫)

圖9

使用java語言,SpringMVC+Spring+MyBatis框架

保證url的有效性:

圖10

圖11

程式碼示例:

@Controller public class WeChatController { /** * 微信URL接入驗證 * @param signature * @param timestamp * @param nonce * @param echostr * @return */ @RequestMapping(value="/weChat",method= RequestMethod.GET) @ResponseBody public String validate(String signature,String timestamp,String nonce,String echostr){ //1. 將token、timestamp、nonce三個引數進行字典序排序 String[] arr = {timestamp,nonce,WeChatUtil.TOKEN}; Arrays.sort(arr); //2. 將三個引數字串拼接成一個字串進行sha1加密 StringBuilder sb = new StringBuilder(); for (String temp : arr) { sb.append(temp); } //3. 開發者獲得加密後的字串可與signature對比,標識該請求來源於微信 if(SecurityUtil.SHA1(sb.toString()).equals(signature)){ //接入成功 return echostr; } //接入失敗 return null; } }

WeChatUtil.TOKEN是常量要與填入的token值相同 SecurityUtil是工具類,提供sha1加密方法

獲取access_token

``` public class WeChatUtil { //URL驗證時使用的token public static final String TOKEN = "wolfcode"; //appid public static final String APPID = "wx59687be81dd3d388"; //secret public static final String SECRET = "d4624c36b6795d1d99dcf0547af5443d"; //建立選單介面地址 public static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN"; //獲取access_token的介面地址 public static final String GET_ACCESSTOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; //快取的access_token private static String accessToken; //access_token的失效時間 private static long expiresTime;

/**
 * 獲取accessToken
 * @return
 */
public static String getAccessToken(){
    //判斷accessToken是否已經過期,如果過期需要重新獲取
    if(accessToken==null||expiresTime < new Date().getTime()){
        //發起請求獲取accessToken
        String result = HttpUtil.get(GET_ACCESSTOKEN_URL.replace("APPID", APPID).replace("APPSECRET", SECRET));
        //把json字串轉換為json物件
        JSONObject json = JSON.parseObject(result);
        //快取accessToken
        accessToken = json.getString("access_token");
        //設定accessToken的失效時間
        long expires_in = json.getLong("expires_in");
        //失效時間 = 當前時間 + 有效期(提前一分鐘)
        expiresTime = new Date().getTime()+ (expires_in-60) * 1000;
    }
    return accessToken;
}

} ```

HttpUtil是發起http請求的工具類

https://blog.csdn.net/frankcheng5143/article/details/50070591

官方文件中的示例:

//1.獲得一個httpclient物件 CloseableHttpClient httpclient = HttpClients.createDefault(); //2.生成一個get請求 HttpGet httpget = new HttpGet("http://localhost/"); //3.執行get請求並返回結果 CloseableHttpResponse response = httpclient.execute(httpget); try { //4.處理結果 } finally { response.close(); }

HttpGetHttpPost

傳送HttpGet

/** * 傳送HttpGet請求 * @param url * @return */ public static String sendGet(String url) { //1.獲得一個httpclient物件 CloseableHttpClient httpclient = HttpClients.createDefault(); //2.生成一個get請求 HttpGet httpget = new HttpGet(url); CloseableHttpResponse response = null; try { //3.執行get請求並返回結果 response = httpclient.execute(httpget); } catch (IOException e1) { e1.printStackTrace(); } String result = null; try { //4.處理結果,這裡將結果返回為字串 HttpEntity entity = response.getEntity(); if (entity != null) { result = EntityUtils.toString(entity); } } catch (ParseException | IOException e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return result; }

傳送HttpPost

/** * 傳送不帶引數的HttpPost請求 * @param url * @return */ public static String sendPost(String url) { //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) { e.printStackTrace(); } //4.處理結果,這裡將結果返回為字串 HttpEntity entity = response.getEntity(); String result = null; try { result = EntityUtils.toString(entity); } catch (ParseException | IOException e) { e.printStackTrace(); } return result; }

HttpClient通過UrlEncodedFormEntity提交帶引數的請求

圖12

使用apacheHttpClient傳送post請求

https://blog.csdn.net/xiaoyaoyulinger/article/details/77315694

JAVA http請求工具類http-request

https://www.jianshu.com/p/e955b01e2e16

獲取微信使用者資訊

https://blog.csdn.net/wolfcode_cn/article/details/80755359

圖13

兩種scope授權作用域 配置授權域名

引導使用者開啟授權介面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

圖14

code來獲取網頁授權專用的access_token憑據

地址:

https://blog.csdn.net/wolfcode_cn/article/details/80755359

結語

  • 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關注
  • 小禮物走一走 or 點贊

相關文章