Java微信公众平台开发模式+自定义按钮源码

2019-03-02 00:45|来源: 网路

首先,想用开放模式需要先成为开发者。成为开发者有两种写法。

  一是:通过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 slz

  * 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 slz

  * 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 = "您好,欢迎关注我!";

  }

  }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>绑定账户</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 = "";

  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;

  }

  }

  以上方法用到的jar包:jdom.jar


转自:http://www.cnblogs.com/zhanganju/p/3718902

相关问答

更多
  • JAVA的WEB开发、数据库开发等,,,,,,,,,,具体要看需求、构架等
  • 不是访问你自己的服务么?追问是自己的服务器,感觉自定义菜单是应该在微信的服务器里运行才可以回答自定义的菜单 微信里只是一个链接 调用的是你自己的服务 你要自己部署一个服务器 有对外的访问ip追问那是菜单设置完成后考虑的事,链接,公网ip我都有,现在只差这个菜单设置了回答哦 终于搞懂了 那个是微信提供了一个管理的界面啊 可以设置菜单名称 链接之类的追问怪我没说明白,我现在有接口代码,问题是不知道怎么让它部署运行回答tomcat部署服务?是少这个么追问不是,微信公众平台开发者模式首先需要接口来链接你自己的服务器 ...
  • 能使用的!微信 在安卓手机里可以使用,安装是用java 开发的,所以 可以用java开发
  • JAVA的WEB开发、数据库开发等,,,,,,,,,,具体要看需求、构架等
  • 首先订阅号要通过微信认证才可以成为拥有自定义菜单不通过验证成为开发者也无法获得自定义菜单其次成为开发者要有个能够公网访问的URL也就是通常使用的网址现常用的有新浪的sae平台或者百度的开发者平台然后在该网.址下部署微信提供的接口文件修改接口文件中的token然后在token一栏中填写修改过后的token即可。‘动拇指’的团队做的,需要的话可以问.问去
  • 微信公众平台开发注意事项: 一、微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请前往微信开放平台接入。 二、在申请到认证公众号之前,你可以先通过测试号申请系统,快速申请一个接口测试号,立即开始接口测试开发。 三、在开发过程中,可以使用接口调试工具来在线调试某些接口。 四、每个接口都有每日接口调用频次限制,可以在公众平台官网-开发者中心处查看具体频次。 五、在开发出现问题时,可以通过接口调用的返回码,以及报警排查指引(在公众平台 ...
  • 太多太多了,这么说吧,微信公众平台只有最简单的图片文字和视频,而且大小都是有限制的,如果你想更多的功能必须用开发模式。看这个视频,绑定第三方平台,就能开发了。
  • 新版微信公众平台去除了编辑模式和开发模式,让普通用户更方便地使用公众号,开发者也可以在开发者中心中,统一管理开发资源、权限和配置。微信公众平台开发者中心功能的使用方便了更多的微信用户,也方便了我们的生活。
  • 二次开发多费事 有现成的 而且开发都不愿意二次开发
  • 好多技术员就靠这个吃饭呢。。小猪cms的挺好哒。