首先,想用开放模式需要先成为开发者。成为开发者有两种写法。
一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串;
二是:通过Servlet。doGet返回exhostr,给微信平台。
这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下:
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.PrintWriter;
- import java.util.Arrays;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.jdom.JDOMException;
- /**
- * 微信统一入口
- * @author 274962267()
- * 2013-7-26 上午10:17:08
- */
- public class WeixinServlet extends HttpServlet {
- public WeixinServlet() {
- super();
- }
- public void destroy() {
- super.destroy();
- }
- /**
- * 微信公众平台 成为开发者验证入口
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doPost(request, response);
- }
- /**
- * 微信公众平台 所有接口入口
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setCharacterEncoding("UTF-8");
- request.setCharacterEncoding("UTF-8");
- PrintWriter out = response.getWriter();
- String TOKEN = "sun";//Token
- String signature = request.getParameter("signature");//SHA1加密字符串
- String timestamp = request.getParameter("timestamp");//时间
- String nonce = request.getParameter("nonce");//随机数
- String echoStr = request.getParameter("echostr");//随机字符串
- if(StrUtil.isNotNull(echoStr)){
- String[] a = {TOKEN,timestamp,nonce};
- Arrays.sort(a);//数组排序
- String str = "";
- for(int i=0;i<a.length;i++){
- str += a[i];
- }
- String echo = new SHA1().getDigestOfString(str.getBytes());//SHA1加密
- if(echo.equals(signature)){
- out.print(echoStr);
- }else{
- out.print("123");
- }
- }else{
- try {
- InputStream is = request.getInputStream();
- PushManage push = new PushManage();
- String getXml = push.PushManageXml(is);
- System.out.println("getXml:"+getXml);
- out.print(getXml);
- } catch (JDOMException e) {
- out.print("");
- }
- }
- out.flush();
- out.close();
- }
- }
当我们完成第一步成为开发者后,我们就可以用微信提供给我们的接口。
大家应该也看见上面有doPost方法(微信公共平台 所有接口入口)。当我们成为开发者后,微信用户向我们的公众账号发信息都是post请求。
- //这里写法多种,怎么写就要看你这么获取微信请求时发给我们的XML
- InputStream is = request.getInputStream();
- PushManage push = new PushManage();
- String getXml = push.PushManageXml(is);
- import java.io.IOException;
- import java.io.InputStream;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.List;
- import org.jdom.Document;
- import org.jdom.Element;
- import org.jdom.JDOMException;
- import org.jdom.input.SAXBuilder;
- import org.jdom.output.XMLOutputter;
- /**
- * 微信所有接口入口
- * @author 274962267(中国编程群)
- * 2013-7-26 上午11:01:08
- */
- public class PushManage {
- public String PushManageXml(InputStream is) throws JDOMException{
- String returnStr = "";
- String toName = "";
- String FromName = "";
- String type = "";
- String content = "";
- String con = "";
- String event = "";//自定义按钮事件请求
- String eKey = "";//事件请求key值
- try {
- SAXBuilder sax = new SAXBuilder();
- Document doc = sax.build(is);
- //获得文件的根元素
- Element root = doc.getRootElement();
- //获得根元素的第一级子节点
- List list = root.getChildren();
- for(int j=0;j<list.size();j++){
- //获得结点
- Element first = (Element) list.get(j);
- if(first.getName().equals("ToUserName")){
- toName = first.getValue().trim();
- }else if(first.getName().equals("FromUserName")){
- FromName = first.getValue().trim();
- }else if(first.getName().equals("MsgType")){
- type = first.getValue().trim();
- }else if(first.getName().equals("Content")){
- con = first.getValue().trim();
- }else if(first.getName().equals("Event")){
- event = first.getValue().trim();
- }else if(first.getName().equals("EventKey")){
- eKey = first.getValue().trim();
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- if(type.equals("event")){
- if(event.equals("subscribe")){//此为关注事件
- content = "您好,欢迎关注BreezeMoon!";
- }
- }else if(type.equals("text")){
- if(con.equals("help")||con.equals("帮助")||con.equals("?")||con.equals("?")){
- content = "帮助中心\n\n";
- }else if(con.equals("bind")||con.equals("绑定")){
- content = "点击 <a target="_blank" href="\'\'">绑定账户</a>";
- }else if(con.startsWith("ck")||con.startsWith("CK")){
- String order_id = "0";
- con.toLowerCase();
- if(con.startsWith("ck")){
- order_id = con.substring(con.indexOf("ck")+2);
- }else if(con.startsWith("CK")){
- order_id = con.substring(con.indexOf("CK")+2);
- }
- if(!"".equals(order_id)){
- StringBuffer sb = new StringBuffer();
- sb.append("订单详情...\n");
- content = sb.toString();
- }else{
- content = "未查询到相应信息,请重新输入!";
- }
- }
- }
- //以下为自定义按钮事件
- if(eKey.equals("music")){//音乐请求
- returnStr = getBackXMLTypeMusic(toName, FromName, "音乐链接地址");
- }else if(eKey.equals("img")){//图片请求
- content = "网络图片地址";
- returnStr = getBackXMLTypeImg(toName, FromName, content);
- }else{//无自定义按钮返回上面的文本信息
- returnStr = getBackXMLTypeText(toName, FromName, content);
- }
- return returnStr;
- }
- public String getBackXMLTypeText(String toName, String FromName, String content){
- String returnStr = "";
- SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
- String times = format.format(new Date());
- Element rootXML = new Element("xml");
- rootXML.addContent(new Element("ToUserName").setText(FromName));
- rootXML.addContent(new Element("FromUserName").setText(toName));
- rootXML.addContent(new Element("CreateTime").setText(times));
- rootXML.addContent(new Element("MsgType").setText("text"));
- rootXML.addContent(new Element("Content").setText(content));
- Document doc = new Document(rootXML);
- XMLOutputter XMLOut = new XMLOutputter();
- returnStr = XMLOut.outputString(doc);
- return returnStr;
- }
- public String getBackXMLTypeImg(String toName, String FromName, String content){
- String returnStr = "";
- SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
- String times = format.format(new Date());
- Element rootXML = new Element("xml");
- rootXML.addContent(new Element("ToUserName").setText(FromName));
- rootXML.addContent(new Element("FromUserName").setText(toName));
- rootXML.addContent(new Element("CreateTime").setText(times));
- rootXML.addContent(new Element("MsgType").setText("news"));
- rootXML.addContent(new Element("ArticleCount").setText("3"));
- Element fXML = new Element("Articles");
- Element mXML = null;
- String url = "http://www.xmyjzzs.com";
- String ss = "";
- for(int i = 1 ;i<=3;i++){
- mXML = new Element("item");
- mXML.addContent(new Element("Title").setText("图片"+i));
- mXML.addContent(new Element("Description").setText("美女"+i));
- mXML.addContent(new Element("PicUrl").setText(ss));
- mXML.addContent(new Element("Url").setText(url));
- fXML.addContent(mXML);
- }
- rootXML.addContent(fXML);
- Document doc = new Document(rootXML);
- XMLOutputter XMLOut = new XMLOutputter();
- returnStr = XMLOut.outputString(doc);
- return returnStr;
- }
- public String getBackXMLTypeMusic(String toName, String FromName, String content){
- String returnStr = "";
- SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
- String times = format.format(new Date());
- Element rootXML = new Element("xml");
- rootXML.addContent(new Element("ToUserName").setText(FromName));
- rootXML.addContent(new Element("FromUserName").setText(toName));
- rootXML.addContent(new Element("CreateTime").setText(times));
- rootXML.addContent(new Element("MsgType").setText("music"));
- Element mXML = new Element("Music");
- mXML.addContent(new Element("Title").setText("音乐"));
- mXML.addContent(new Element("Description").setText("音乐让人心情舒畅!"));
- mXML.addContent(new Element("MusicUrl").setText(content));
- mXML.addContent(new Element("HQMusicUrl").setText(content));
- rootXML.addContent(mXML);
- Document doc = new Document(rootXML);
- XMLOutputter XMLOut = new XMLOutputter();
- returnStr = XMLOut.outputString(doc);
- return returnStr;
- }
- }
微信公众平台自定义按钮设置,在此下载 微信公众平台自定义按钮Java