微信公众号开发 [03] 结合UEditor实现图文消息群发功能
生活随笔
收集整理的這篇文章主要介紹了
微信公众号开发 [03] 结合UEditor实现图文消息群发功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
0、寫在前面的話
如何實(shí)現(xiàn)微信平臺后臺管理中的,圖文消息發(fā)送功能?大概的過程如下:
- 通過類似表單的形式,將文章各部分內(nèi)容提交到后臺,封裝成一個(gè)實(shí)體類,并持久化到數(shù)據(jù)庫中
- 需要推送的時(shí)候,將不同的文章選擇取出交給后臺,由后臺組裝成規(guī)范化的數(shù)據(jù)結(jié)構(gòu),調(diào)用微信的圖文消息素材上傳和群發(fā)接口
- 其中文章的主體部分,我們采用UEditor富文本編輯器
本文主要針對模擬表單的圖片上傳,以及結(jié)合UEditor進(jìn)行圖文內(nèi)圖片上傳,進(jìn)行重點(diǎn)說明。細(xì)節(jié)和具體代碼流程就不再詳細(xì)展開了。
參考鏈接:
- asp.net微信開發(fā)第十篇----使用百度編輯器編輯圖文消息,上傳圖片、微信視頻
1、什么是圖文消息
所謂圖文消息,就是我們常在訂閱號中收到的如下圖所示的消息類型:從 微信開發(fā)者文檔 - 消息管理 - 發(fā)送消息 - 群發(fā)接口和原創(chuàng)校驗(yàn) - 上傳圖文消息素材 中可以看到,圖文消息就是文章的集合,每條圖文消息包含的文章不得超過8條。
我們從開發(fā)文檔中上傳圖文消息素材的POST格式來看,一個(gè)文章大概包含的內(nèi)容有:{ "articles": [{"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p","author":"xxx","title":"Happy Day","content_source_url":"www.qq.com","content":"content","digest":"digest","show_cover_pic":1},{"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p","author":"xxx","title":"Happy Day","content_source_url":"www.qq.com","content":"content","digest":"digest","show_cover_pic":0}] }221{ 2 ? "articles": [3 {4 ? ? ? ? ? ? "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",5 ? ? ? ? ? ? "author":"xxx",6 "title":"Happy Day",7 "content_source_url":"www.qq.com",8 "content":"content",9 "digest":"digest",10 ? ? ? ? ? ? "show_cover_pic":111 },12 {13 ? ? ? ? ? ? "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",14 ? ? ? ? ? ? "author":"xxx",15 "title":"Happy Day",16 "content_source_url":"www.qq.com",17 "content":"content",18 "digest":"digest",19 ? ? ? ? ? ? "show_cover_pic":020 }21 ? ]22}
| 參數(shù)? ?? | 是否必須? ?? | 說明 |
| Articles | 是 | 圖文消息,一個(gè)圖文消息支持1到8條圖文 |
| thumb_media_id | 是 | 圖文消息縮略圖的media_id,可以在基礎(chǔ)支持-上傳多媒體文件接口中獲得 |
| author | 否 | 圖文消息的作者 |
| title | 是 | 圖文消息的標(biāo)題 |
| content_source_url | 否 | 在圖文消息頁面點(diǎn)擊“閱讀原文”后的頁面,受安全限制,如需跳轉(zhuǎn)Appstore,可以使用itun.es或appsto.re的短鏈服務(wù),并在短鏈后增加 #wechat_redirect 后綴。 |
| content | 是 | 圖文消息頁面的內(nèi)容,支持HTML標(biāo)簽。具備微信支付權(quán)限的公眾號,可以使用a標(biāo)簽,其他公眾號不能使用 |
| digest | 否 | 圖文消息的描述 |
| show_cover_pic | 否 | 是否顯示封面,1為顯示,0為不顯示 |
而本篇博客要解決的,就是如何獲取上圖紅色部分的?thumb_media_id 和?content,后者主要也是闡述其內(nèi)容中的圖片上傳過程。
2、群發(fā)圖文消息的過程和UEditor使用
由微信的官方文檔可知,群發(fā)圖文消息的過程如下:我們的目標(biāo)很明確,下面就開始按步驟進(jìn)行說明。
2.1 啟用UEditor
UEditor是百度的一款富文本編輯器,用它的主要目的是因?yàn)樗渲帽容^靈活,所見即所得的友好體驗(yàn)。這里只會提供編輯器部分,其他諸如標(biāo)題作者,需要自行在網(wǎng)頁添加,此處不再闡述。簡單說來,最終我們是為了實(shí)現(xiàn)一個(gè)類似提交表單的功能,把各部分內(nèi)容最后封裝到一個(gè)實(shí)體類中,而UEditor部分就是用來封裝文章的content的。
- UEditor的官方網(wǎng)址和下載
- UEditor的官網(wǎng)文檔
UEditor的安裝和工具欄設(shè)置等不是本文的討論重點(diǎn),此處請自行谷歌,或按照官方文檔進(jìn)行部署。網(wǎng)頁上部署好以后(如下圖中的部分3),再自行添加如標(biāo)題輸入,作者輸入等input標(biāo)簽,得到效果如下:
參考鏈接:
- 官方文檔(定制工具欄圖標(biāo))
- 百度編輯器UEditor自定義工具欄Toolbars
2.2 封面和文章內(nèi)圖片上傳
2.2.1 上傳封面縮略圖永久素材
在永久圖文消息中,要求縮略圖也是永久素材類型,所以我們這里調(diào)用的接口是 “新增其他類型的永久素材的接口”,如下所示(這里type我們要用thumb):http請求方式: POST,需使用https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE調(diào)用示例(使用curl命令,用FORM表單方式新增一個(gè)其他類型的永久素材,curl命令的使用請自行查閱資料)41http請求方式: POST,需使用https2https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE34調(diào)用示例(使用curl命令,用FORM表單方式新增一個(gè)其他類型的永久素材,curl命令的使用請自行查閱資料)參數(shù)說明:
- access_token(必需)?調(diào)用接口憑證
- type(必需)?媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb)
- media(必需)?form-data中媒體文件標(biāo)識,有filename、filelength、content-type等信息
那么問題來了,為了避免接口次數(shù)的頻繁使用和浪費(fèi),我們在標(biāo)題0中提到的過程是,將文章各部分內(nèi)容提交到后臺,封裝成一個(gè)實(shí)體類,并持久化到數(shù)據(jù)庫中。需要推送的時(shí)候,再取出來調(diào)用微信接口進(jìn)行上傳和推送(而不是編輯的時(shí)候就調(diào)用微信的接口)。
也就是說,縮略圖信息,都是提前寫好并整合封裝在某個(gè)類中的(或者放在數(shù)據(jù)庫中),這意味著我們要在推送消息的時(shí)候從內(nèi)容里把需要上傳的東西抽出來再去調(diào)用接口,獲取返回值后再組裝微信格式的圖文消息發(fā)送。
而這里的接口要求使用表單的形式提交才能生效,但用這種方式,密鑰信息accessToken就暴露在頁面中,并且也獲取不到上傳成功后的媒體ID。怎么辦?
解決辦法(參考鏈接):先把文件上傳到服務(wù)器(數(shù)據(jù)庫),從服務(wù)器獲取文件,然后用HttpURLConnection同下面微信調(diào)用接口的url建立連接:public static String uploadTemp(File file, String url) throws IOException {String REQUEST_METHOD = "POST";String result = null;//請求地址URL urlObj = new URL(url);//連接HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();//設(shè)置關(guān)鍵值//POST提交表單,默認(rèn)是GETconnection.setRequestMethod(REQUEST_METHOD);connection.setDoInput(true);connection.setDoOutput(true);//POST方式無法使用緩存connection.setUseCaches(false);//設(shè)置請求頭信息connection.setRequestProperty("Connection", "Keep-Alive");connection.setRequestProperty("Charset", "UTF-8");//設(shè)置邊界String BOUNDARY = "----------" + System.currentTimeMillis();connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);//請求正文信息//part1 開頭StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("--"); // 必須多兩道線stringBuilder.append(BOUNDARY);stringBuilder.append("\r\n");stringBuilder.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n");stringBuilder.append("Content-Type:application/octet-stream\r\n\r\n");byte[] head = stringBuilder.toString().getBytes("utf-8");//獲得輸出流OutputStream out = new DataOutputStream(connection.getOutputStream());//輸出表頭out.write(head);//part2 文件正文//把文件以流文件的方式,推入到url中DataInputStream in = new DataInputStream(new FileInputStream(file));int bytes = 0;byte[] bufferOut = new byte[1024];while ((bytes = in.read(bufferOut)) != -1) {out.write(bufferOut, 0, bytes);}in.close();//part3 結(jié)尾部分byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定義最后數(shù)據(jù)分隔線out.write(foot);out.flush();out.close();StringBuffer buffer = new StringBuffer();BufferedReader reader = null;try {// 定義BufferedReader輸入流來讀取URL的響應(yīng)reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}if (result == null) {result = buffer.toString();}} catch (IOException e) {log.error("發(fā)送POST請求出現(xiàn)異常!" + e);e.printStackTrace();throw new IOException("數(shù)據(jù)讀取異常");} finally {if(reader!=null) {reader.close();}}return result; }851public static String uploadTemp(File file, String url) throws IOException {2 ? ?String REQUEST_METHOD = "POST";3 ? ?String result = null;45 ? ?//請求地址6 ? ?URL urlObj = new URL(url);78 ? ?//連接9 ? ?HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();1011 ? ?//設(shè)置關(guān)鍵值12 ? ?//POST提交表單,默認(rèn)是GET13 ? ?connection.setRequestMethod(REQUEST_METHOD);14 ? ?connection.setDoInput(true);15 ? ?connection.setDoOutput(true);16 ? ?//POST方式無法使用緩存17 ? ?connection.setUseCaches(false);1819 ? ?//設(shè)置請求頭信息20 ? ?connection.setRequestProperty("Connection", "Keep-Alive");21 ? ?connection.setRequestProperty("Charset", "UTF-8");2223 ? ?//設(shè)置邊界24 ? ?String BOUNDARY = "----------" + System.currentTimeMillis();25 ? ?connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);2627 ? ?//請求正文信息28 ? ?//part1 開頭29 ? ?StringBuilder stringBuilder = new StringBuilder();30 ? ?stringBuilder.append("--"); // 必須多兩道線31 ? ?stringBuilder.append(BOUNDARY);32 ? ?stringBuilder.append("\r\n");33 ? ?stringBuilder.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n");34 ? ?stringBuilder.append("Content-Type:application/octet-stream\r\n\r\n");3536 ? ?byte[] head = stringBuilder.toString().getBytes("utf-8");3738 ? ?//獲得輸出流39 ? ?OutputStream out = new DataOutputStream(connection.getOutputStream());40 ? ?//輸出表頭41 ? ?out.write(head);4243 ? ?//part2 文件正文44 ? ?//把文件以流文件的方式,推入到url中45 ? ?DataInputStream in = new DataInputStream(new FileInputStream(file));46 ? ?int bytes = 0;47 ? ?byte[] bufferOut = new byte[1024];48 ? ?while ((bytes = in.read(bufferOut)) != -1) {49 ? ? ? ?out.write(bufferOut, 0, bytes);50 ? }51 ? ?in.close();5253 ? ?//part3 結(jié)尾部分54 ? ?byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定義最后數(shù)據(jù)分隔線55 ? ?out.write(foot);565758 ? ?out.flush();59 ? ?out.close();606162 ? ?StringBuffer buffer = new StringBuffer();63 ? ?BufferedReader reader = null;64 ? ?try {65 ? ? ? ?// 定義BufferedReader輸入流來讀取URL的響應(yīng)66 ? ? ? ?reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));67 ? ? ? ?String line = null;68 ? ? ? ?while ((line = reader.readLine()) != null) {69 ? ? ? ? ? ?buffer.append(line);70 ? ? ? }71 ? ? ? ?if (result == null) {72 ? ? ? ? ? ?result = buffer.toString();73 ? ? ? }74 ? } catch (IOException e) {75 ? ? ? ?log.error("發(fā)送POST請求出現(xiàn)異常!" + e);76 ? ? ? ?e.printStackTrace();77 ? ? ? ?throw new IOException("數(shù)據(jù)讀取異常");78 ? } finally {79 ? ? ? ?if(reader!=null) {80 ? ? ? ? ? ?reader.close();81 ? ? ? }82 ? }8384 ? ?return result;85}
最終返回的result字符串,是一個(gè)JSON格式的微信服務(wù)器返回的值,其中我們可以提取其中的media_id。
2.2.2 結(jié)合UEditor實(shí)現(xiàn)圖文內(nèi)圖片消息的圖片上傳
上傳圖文消息內(nèi)的圖片,有專門的接口,這個(gè)接口上傳的圖片是不占用永久素材的數(shù)量限制的。調(diào)用該接口,可以獲得圖片的URL,這里的調(diào)用方式,也是和如上一樣使用表單模擬提交的方式,這里主要講解的是,如何結(jié)合UEditor。UEditor編輯器中的圖片上傳,我們需要修改其上傳后的地址,也就是說希望它把圖片以流的形式給我們自己寫的Action,再由我們的Action把文件提交給微信服務(wù)器以獲取URL,再放到文章中去。
首先,更改編輯器的上傳圖片的后臺地址,重寫其js腳本部分的getActionUrl方法,定義跳轉(zhuǎn)到自己的Action:ue = UE.getEditor("editor"); //重寫UEDITOR的getActionUrl 方法,定義自己的Action,上傳圖片保存至相應(yīng)的位置 UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl; UE.Editor.prototype.getActionUrl = function (action) {if (action == 'uploadimage' || action == 'uploadfile') {var id = $('#carInfoId').val();//修改定義自己的Actionreturn '/admin/news/do/ueditor_uploadNewsImage.q';} else {return this._bkGetActionUrl.call(this, action);} };121ue = UE.getEditor("editor");2//重寫UEDITOR的getActionUrl 方法,定義自己的Action,上傳圖片保存至相應(yīng)的位置3UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;4UE.Editor.prototype.getActionUrl = function (action) {5 ? ?if (action == 'uploadimage' || action == 'uploadfile') {6 ? ? ? ?var id = $('#carInfoId').val();7 ? ? ? ?//修改定義自己的Action8 ? ? ? ?return '/admin/news/do/ueditor_uploadNewsImage.q';9 ? } else {10 ? ? ? ?return this._bkGetActionUrl.call(this, action);11 ? }12};
由于提交過來的是tmp格式,直接調(diào)用微信接口會出現(xiàn)類型錯誤的返回值,所以在Action中我們要將圖片格式轉(zhuǎn)換一下再調(diào)用微信接口:
參考鏈接:
- 將ueditor中的圖片上傳用struts2實(shí)現(xiàn)
- UEditor官方文檔?后端請求規(guī)范 返回json格式要求
/*** ueditor編輯器上傳圖片到微信服務(wù)器* <p>該部分是使用了百度的富文本web編輯器UEditor,以及微信的圖文消息內(nèi)圖片上傳接口</p>** @throws IOException*/ public void ueditor_uploadNewsImage() throws IOException {WeChatUtil weChatUtil = new WeChatUtil();String accessToken = weChatUtil.getAccessToken();HttpServletResponse response = ServletActionContext.getResponse();//struts請求 包裝過濾器MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) ServletActionContext.getRequest();//獲取文件過濾器File tmp = wrapper.getFiles("upfile")[0];//獲得上傳的文件名String filename = wrapper.getFileNames("upfile")[0];int suffixIndex = filename.indexOf(".");//文件后綴確定if (suffixIndex == filename.lastIndexOf(".")) {String suffix = filename.substring(suffixIndex);File file = File.createTempFile("tmp", suffix);FileCopyUtils.copy(tmp, file);String imageUrl = weChatUtil.uploadImg(accessToken, file); //這里最終還是調(diào)用的表單模擬的那個(gè)方法//如果獲取到了有效的imageUrlif (imageUrl != null && imageUrl.substring(0, 4).equals("http")) {String json = "{\"state\":\"SUCCESS\", \"url\":\"%s\", \"title\":\"%s\", \"original\":\"%s\"}";json = String.format(json, imageUrl, filename, filename);log.debug("上傳圖片返回信息:" + json);response.getWriter().write(json);}} }x1/**2 * ueditor編輯器上傳圖片到微信服務(wù)器3 * <p>該部分是使用了百度的富文本web編輯器UEditor,以及微信的圖文消息內(nèi)圖片上傳接口</p>4 *5 * @throws IOException6 */7public void ueditor_uploadNewsImage() throws IOException {8 ? ?WeChatUtil weChatUtil = new WeChatUtil();9 ? ?String accessToken = weChatUtil.getAccessToken();10 ? ?HttpServletResponse response = ServletActionContext.getResponse();1112 ? ?//struts請求 包裝過濾器13 ? ?MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) ServletActionContext.getRequest();14 ? ?//獲取文件過濾器15 ? ?File tmp = wrapper.getFiles("upfile")[0];16 ? ?//獲得上傳的文件名17 ? ?String filename = wrapper.getFileNames("upfile")[0];1819 ? ?int suffixIndex = filename.indexOf(".");20 ? ?//文件后綴確定21 ? ?if (suffixIndex == filename.lastIndexOf(".")) {22 ? ? ? ?String suffix = filename.substring(suffixIndex);23 ? ? ? ?File file = File.createTempFile("tmp", suffix);24 ? ? ? ?FileCopyUtils.copy(tmp, file);2526 ? ? ? ?String imageUrl = weChatUtil.uploadImg(accessToken, file); //這里最終還是調(diào)用的表單模擬的那個(gè)方法27 ? ? ? ?//如果獲取到了有效的imageUrl28 ? ? ? ?if (imageUrl != null && imageUrl.substring(0, 4).equals("http")) {29 ? ? ? ? ? ?String json = "{\"state\":\"SUCCESS\", \"url\":\"%s\", \"title\":\"%s\", \"original\":\"%s\"}";30 ? ? ? ? ? ?json = String.format(json, imageUrl, filename, filename);31 ? ? ? ? ? ?log.debug("上傳圖片返回信息:" + json);32 ? ? ? ? ? ?response.getWriter().write(json);33 ? ? ? }34 ? }35}
另外,需要注意的是,UEditor要求后端返回固定格式的返回碼才能實(shí)現(xiàn)圖片插入到文本編輯內(nèi)容中。注意這里的json返回碼格式,內(nèi)部必須使用雙引號,使用單引號替代是無效的。
上面兩個(gè)就是該部分的核心內(nèi)容,還有一個(gè)小地方需要修改,如果使用的Struts框架,那么要注意,由于Struts2框架默認(rèn)使用Apache的Commons FileUpload組件和內(nèi)建的FileUploadInterceptor攔截器實(shí)現(xiàn)文件上傳,將request中的文件域封裝到action中的一個(gè)File類型的屬性中,并刪除request中的原有文件域,因此直接用Ueditor上傳文件會失敗。
解決的方法是自己寫一個(gè)Filter替代Struts2的Filter,排除掉ueditor的controller.jsp文件。
參考鏈接:
- Ueditor整合Struts2實(shí)現(xiàn)圖片上傳
- [J2EE]jsp項(xiàng)目中使用UEditor富文本編輯器
public class MyStrutsFilter extends StrutsPrepareAndExecuteFilter {public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;//不過濾的urlString url = request.getRequestURI();System.out.println(url);try {if (url.contains("/controller.jsp")) {System.out.println("使用自定義的過濾器");chain.doFilter(req, res);} else {System.out.println("使用默認(rèn)的過濾器");super.doFilter(req, res, chain);}} catch (Exception e) {e.printStackTrace();}} }191public class MyStrutsFilter extends StrutsPrepareAndExecuteFilter {2 ? ?public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {3 ? ? ? ?HttpServletRequest request = (HttpServletRequest) req;4 ? ? ? ?//不過濾的url5 ? ? ? ?String url = request.getRequestURI();6 ? ? ? ?System.out.println(url);7 ? ? ? ?try {8 ? ? ? ? ? ?if (url.contains("/controller.jsp")) {9 ? ? ? ? ? ? ? ?System.out.println("使用自定義的過濾器");10 ? ? ? ? ? ? ? ?chain.doFilter(req, res);11 ? ? ? ? ? } else {12 ? ? ? ? ? ? ? ?System.out.println("使用默認(rèn)的過濾器");13 ? ? ? ? ? ? ? ?super.doFilter(req, res, chain);14 ? ? ? ? ? }15 ? ? ? } catch (Exception e) {16 ? ? ? ? ? ?e.printStackTrace();17 ? ? ? }18 ? }19}
2.3 圖文素材上傳和發(fā)送
到這里,我們再來看下上傳圖文永久素材所需要的格式:{"articles": [{"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p","author":"xxx","title":"Happy Day","content_source_url":"www.qq.com","content":"content","digest":"digest","show_cover_pic":1},{"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p","author":"xxx","title":"Happy Day","content_source_url":"www.qq.com","content":"content","digest":"digest","show_cover_pic":0}] }1{2 ? "articles": [3 {4 ? ? ? ? ? ? "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",5 ? ? ? ? ? ? "author":"xxx",6 "title":"Happy Day",7 "content_source_url":"www.qq.com",8 "content":"content",9 "digest":"digest",10 ? ? ? ? ? ? "show_cover_pic":111 },12 {13 ? ? ? ? ? ? "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",14 ? ? ? ? ? ? "author":"xxx",15 "title":"Happy Day",16 "content_source_url":"www.qq.com",17 "content":"content",18 "digest":"digest",19 ? ? ? ? ? ? "show_cover_pic":020 }21 ? ]22}- thumb_media_id 上傳封面縮略圖后返回的media_id,我們已經(jīng)說明了
- author 這個(gè)寫個(gè)input就可以搞定
- title 同上
- content_source_url 非必需
- content 這里就是我們用UEditor編輯器中的內(nèi)容了,其中重點(diǎn)是圖片上傳,我們已經(jīng)說明了
- digest 摘要,加input解決
- show_cover_pic 非必需
東西都有了,調(diào)用接口也就簡單了。然后接著調(diào)用群發(fā)的接口,也就很容易了。這里主要參考文檔(微信公眾平臺技術(shù)文檔 - 消息管理 - 發(fā)送消息 - 群發(fā)接口和原創(chuàng)校驗(yàn))就行了,時(shí)間精力有限,就不再展開了。
轉(zhuǎn)載于:https://www.cnblogs.com/deng-cc/p/6868234.html
總結(jié)
以上是生活随笔為你收集整理的微信公众号开发 [03] 结合UEditor实现图文消息群发功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android WIFI信息获取
- 下一篇: hashmap,hashTable co