国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

微信公眾號測試賬號-消息管理/事件推送

2019-11-09 16:51:29
字體:
來源:轉載
供稿:網友

記錄一下微信公眾號開發的時候的一些過程。。。 首先注冊一個微信公眾測試賬號,雖然個人注冊的訂閱號也有此功能,但是卻沒有用戶管理功能,所以這里就先拿測試賬號開發微信公眾號。。。 申請微信測試號在這里http://mp.weixin.QQ.com/debug/cgi-bin/sandbox?t=sandbox/login 這里寫圖片描述

成功申請之后會有自己的APPID和appsecret。。。 微信開發者文檔在這里 。。。 http://mp.weixin.qq.com/wiki/home/index.html

開發人員可以根據該文檔對微信公眾號進行接口的開發。。。

簡單的申請完之后。。。嘗試配置接口配置信息需要填寫公網可以訪問的鏈接地址以及TOKEN,以確定微信可以訪問你的程序。。。 公網能訪問的鏈接地址不一定是特意去申請的域名或者買服務器,可以用國內已有的一些網絡映射工具,這里我用的是Sunny-Ngrok啟動工具,也可以用花生殼。。。

根據這些映射工具,可以在公網上訪問該網址。。。這樣微信也可以訪問我的程序來調用相應的服務。。。 這里寫圖片描述

package org.ssm.maven.test1.controller;import java.security.MessageDigest;import java.util.Arrays;import javax.servlet.http.HttpServletRequest;import org.sPRingframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;@Controller@RequestMapping("/wechat")public class WechatValidToken { public static final String TOKEN = "ivy"; private static char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; @RequestMapping(value="/valid", method = RequestMethod.GET) @ResponseBody public String validToken( HttpServletRequest request) { String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); String[] paramStr = new String[] { TOKEN, timestamp, nonce }; Arrays.sort(paramStr); String str=""; for(String s : paramStr){ str += s; } String afterSha1 = sha1(str); if (afterSha1.equals(signature)) return echostr; else return "null"; } private static String sha1(String source) { if ((source == null) || source.isEmpty()) { return source; } try { MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); byte[] sha1Bytes = sha1.digest(source.getBytes()); return toHexArray(sha1Bytes); } catch (Exception e) { // do nothing } return source; } private static String toHexArray(byte[] array) { char[] resultCharArray = new char[array.length * 2]; int index = 0; for (byte b : array) { resultCharArray[index++] = hexDigits[b >>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b & 0xf]; } return new String(resultCharArray); }}

該代碼用于微信校驗是否接收到信息的功能。。。

我的微信公眾號的后臺是基于ssm的java企業級的程序,關于ssm的配置文件在網上隨便百度都可以找得到。。。 對于訂閱號的消息管理,微信公眾平臺提供了簡單的對于消息管理的功能。。。對于不是開發人員來說該功能已經能滿足普通微信公眾號的需求。。。 但是對于需求不僅滿足于普通的信息管理的系統而言,這只是冰山一角。。。

對于消息信息管理分為以下幾類:

1 文本消息2 圖片消息3 語音消息4 視頻消息5 小視頻消息6 地理位置消息7 鏈接消息

當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的xml數據包到開發者填寫的URL上。。。

文本消息

package org.ssm.maven.test1.controller;import java.io.IOException;import java.io.PrintWriter;import java.util.Date;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.ssm.maven.test1.model.TextMessage;import org.ssm.maven.test1.util.MessageType;import org.ssm.maven.test1.util.MessageUtil;@Controller@RequestMapping("/wechat")public class WechatController { @RequestMapping(value = "/valid", method = RequestMethod.POST) @ResponseBody public String accpetMessage(HttpServletRequest request) throws IOException { request.setCharacterEncoding("utf-8"); Map<String, String> param = MessageUtil.xmlToMap(request); String fromUserName = param.get("FromUserName"); String toUserName = param.get("ToUserName"); String msgType = param.get("MsgType"); String content = param.get("Content"); Long createTime = Long.valueOf(param.get("CreateTime")); Long msgId = Long.valueOf(param.get("MsgId") ); System.out.println("--------->" + param); String message = null; if (MessageType.TEXT.equals(msgType)) { if ("1".equals(content)) { message = MessageUtil.initText(MessageUtil.firstMenu(), createTime, fromUserName, toUserName, msgId); } else if ("2".equals(content)) { message = MessageUtil.initNewsMessage(toUserName, fromUserName); } else if ("?".equals(content)) { message = MessageUtil.initText(MessageUtil.menuText(), createTime, fromUserName, toUserName, msgId); } else { TextMessage text = new TextMessage(); text.setContent("the message is:" + content); text.setCreateTime(createTime); text.setToUserName(fromUserName); text.setFromUserName(toUserName); text.setMsgType("text"); message = MessageUtil.textMessageToXml(text); System.out.println("message--------->" + message); } // StringBuffer sb = new StringBuffer(); // sb.append("<xml>"); // sb.append("<ToUserName><![CDATA[" + fromUserName + // "]]></ToUserName>"); // sb.append("<FromUserName><![CDATA[" + toUserName + // "]]></FromUserName>"); // sb.append("<CreateTime>" + new Date().getTime() + // "</CreateTime>"); // sb.append("<MsgType><![CDATA[text]]></MsgType>"); // sb.append("<Content><![CDATA[this is a test]]></Content>"); // sb.append("<MsgId>1234567890123456</MsgId>"); // sb.append("</xml>"); // response.getWriter().write(message); } else if (MessageType.EVENT.equals(msgType)) { String event = param.get("Event"); if (MessageType.SUBSCRIBE.equals(event)) { message = MessageUtil.initText(MessageUtil.menuText(), createTime, fromUserName, toUserName, msgId); } else if (MessageType.CLICK.equals(event)) { message = MessageUtil.initText(MessageUtil.menuText(), createTime, fromUserName, toUserName, msgId); } else if (MessageType.VIEW.equals(event)) { message = MessageUtil.initText(param.get("EventKey"), createTime, fromUserName, toUserName, msgId); } else if (MessageType.SCANCODE.equals(event)) { message = MessageUtil.initText(param.get("EventKey"), createTime, fromUserName, toUserName, msgId); } } else if (MessageType.LOCATION.equals(msgType)) { message = MessageUtil.initText(param.get("Label"), createTime, fromUserName, toUserName, msgId); } return message; }}

消息類型主要分為

package org.ssm.maven.test1.util;public class MessageType { public static final String TEXT = "text"; public static final String NEWS = "news"; public static final String IMAGE = "image"; public static final String VOICE = "voice"; public static final String VIDEO = "video"; public static final String SHORTVIDEO = "shortvideo"; public static final String LINK = "link"; public static final String LOCATION = "location"; public static final String EVENT = "event"; public static final String SUBSCRIBE = "subscribe";//event public static final String UNSUBSCRIBE = "unsubscribe";//event public static final String CLICK = "CLICK";//event public static final String VIEW = "VIEW";//event public static final String SCANCODE = "scancode_push";//event}

大致用到的分為這幾類,subscribe,unsubscribe,CLICK,VIEW,scancode_push為event下

程序入口沿用了之間接收消息接口的名稱。。。

這里附上轉化成xml的代碼以及初始化消息返回的代碼。。。

package org.ssm.maven.test1.util;import java.io.IOException;import java.io.InputStream;import java.io.Writer;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.ssm.maven.test1.controller.WechatController;import org.ssm.maven.test1.model.TextMessage;import org.ssm.maven.test1.model.WechatNews;import org.ssm.maven.test1.model.WechatNewsMessage;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.core.util.QuickWriter;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import com.thoughtworks.xstream.io.xml.DomDriver;import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;public class MessageUtil { protected static String PREFIX_CDATA = "<![CDATA["; protected static String SUFFIX_CDATA = "]]>"; /** * xml to map???? * @param request * @return */ public static Map<String, String> xmlToMap(HttpServletRequest request){ Map<String, String> map = new HashMap<String, String>(); SAXReader reader = new SAXReader(); try { InputStream ins = request.getInputStream(); Document doc = reader.read(ins); Element root = doc.getRootElement(); List<Element> list = root.elements(); for (Element element : list) { map.put(element.getName(), element.getText()); } ins.close(); } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } return map; } public static String textMessageToXml(TextMessage textMessage){ XStream xstream = new XStream(); xstream.alias("xml", textMessage.getClass()); return xstream.toXML(textMessage); } public static String newsMessageToXml(WechatNewsMessage wechatNewsMessage){ XStream xstream = new XStream(); xstream.alias("xml", wechatNewsMessage.getClass()); xstream.alias("item", new WechatNews().getClass()); return xstream.toXML(wechatNewsMessage); } /*初始化文本消息*/ public static String initText(String content, Long createTime, String fromUserName, String toUserName, Long msgId){ String message = ""; TextMessage text = new TextMessage(); text.setContent("the message is:"+content); text.setCreateTime(createTime); text.setToUserName(fromUserName); text.setFromUserName(toUserName); text.setMsgType(MessageType.TEXT); text.setMsgId(msgId); message = MessageUtil.textMessageToXml(text); System.out.println("message--------->" + message); return message; } /*初始化圖文消息*/ public static String initNewsMessage(String toUserName, String fromUserName){ String message = ""; WechatNewsMessage wechatNewsMessage = new WechatNewsMessage(); WechatNews wechatNews = new WechatNews(); WechatNews wechatNews1 = new WechatNews(); List<WechatNews> wechatNewss = new ArrayList<WechatNews>(); wechatNews.setTitle("ivy's descr
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通山县| 云龙县| 南召县| 海南省| 乌海市| 怀仁县| 郴州市| 桂阳县| 岳阳县| 泽库县| 枞阳县| 德江县| 龙口市| 博湖县| 濉溪县| 镇原县| 宣化县| 苏州市| 五大连池市| 广宁县| 毕节市| 郑州市| 台前县| 依兰县| 阿尔山市| 博兴县| 石首市| 义乌市| 藁城市| 连州市| 高碑店市| 青川县| 迁西县| 普陀区| 遂宁市| 泾阳县| 钦州市| 延寿县| 永靖县| 资中县| 安新县|