打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【申精】SAE与微信公众平台对接JAVA语言版本
微信公众平台火的已经是大红大紫,笔者所在的一个微信开发群众非常的活跃,简直可以匹敌淘宝打折的群了!微信官方给出的代码示例都是php的,所以有不少人经常问到JAVA语言的如何跟微信公众平台对接,今天在这里我就把我写的JAVA版本挑些基本功能分享给大家,希望对大家有帮助!废话不多说了给大家贴代码:
功能1:开发者身份验证和自动回复(这个功能是大家申请到公众账号都会使用到的功能),这两个功能我写到了一个类中,流程在一个函数里做判断,请详细看代码。

Java代码
  1. package cpbc.base;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.security.MessageDigest;
  6. import java.util.Arrays;
  7. import java.util.Date;
  8. import javax.servlet.ServletInputStream;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import org.dom4j.Document;
  12. import org.dom4j.DocumentHelper;
  13. import org.dom4j.Element;
  14. public class support {
  15. private String Token='';  
  16. private HttpServletRequest request=null;  
  17. private HttpServletResponse response=null;
  18. public support(String token, HttpServletRequest request,
  19. HttpServletResponse response) {
  20. super();
  21. this.Token = token;
  22. this.request = request;
  23. this.response = response;
  24. }
  25. //主流程函数
  26. public void answer(){  
  27.     String checkString=request.getParameter('echostr');  
  28.     if(null==checkString||checkString.isEmpty()){  //非验证时走自动回复流程
  29.     
  30. backMsg();  
  31.     }else{  //验证时走此流程
  32.     if(this.check()){  
  33.       this.back(checkString);  
  34.     }else{  
  35.       this.back('error');                                                                                                              
  36.     }  
  37.     }  
  38.   }  
  39.   //自动回复内容  
  40.   public void backMsg(){  
  41.     String postStr=null;  
  42.     try{  
  43.     postStr=this.readInputStreamParameter(request.getInputStream());  
  44.     }catch(Exception e){  
  45.     e.printStackTrace();  
  46.     }  
  47.     if (null!=postStr&&!postStr.isEmpty()){  
  48.     Document document=null;  
  49.     try{  
  50.       document = DocumentHelper.parseText(postStr);  
  51.     }catch(Exception e){  
  52.       e.printStackTrace();  
  53.     }  
  54.     if(null==document){  
  55.       this.back('');  
  56.       return;  
  57.     }  
  58.     Element root=document.getRootElement();  
  59.     String fromUsername = root.elementText('FromUserName');  
  60.     String toUsername = root.elementText('ToUserName');  
  61.     String keyword = root.elementTextTrim('Content');  
  62.     String time = new Date().getTime()+'';
  63.     String textTpl = ''+  
  64.         ''+  
  65.         ''+  
  66.         '%3$s'+  
  67.         ''+  
  68.         '3'+
  69.         ''+
  70.         ''+
  71.         ''+
  72.         ''+
  73.         '\'static/image/smiley/default/titter.gif\'' smilieid='\'9\'' border='\'0\'' alt='\'\''>icUrl>'+
  74.         ''+
  75.         ''+
  76.         ''+
  77.         ''+
  78.         ''+
  79.         '\'static/image/smiley/default/titter.gif\'' smilieid='\'9\'' border='\'0\'' alt='\'\''>icUrl>'+
  80.         ''+
  81.         ''+
  82.         ''+
  83.         ''+
  84.         ''+
  85.         '\'static/image/smiley/default/titter.gif\'' smilieid='\'9\'' border='\'0\'' alt='\'\''>icUrl>'+
  86.         ''+
  87.         ''+
  88.         ''+
  89.         '0'+  
  90.         '';  
  91.     if(null!=keyword&&!keyword.equals(''))  
  92.     {  
  93.       String resultStr = String.format(textTpl, fromUsername, toUsername, time);  
  94.       this.back(resultStr);  
  95.     }else{  
  96.       this.back('无请求内容...');  
  97.     }  
  98.     }else {  
  99.     this.back('');  
  100.     }  
  101.   }  
  102.   /**

    开发者通过检验signature对网址接入合法性进行校验。
    若此次GET请求原样返回echostr参数内容,则接入生效,否则接入失败。
    验证signature将结合开发者填写的token参数、timestamp参数和nonce参数等,
    加密流程:
    将token、timestamp、nonce三个参数进行字典序排序 ,
    将三个参数字符串拼接成一个字符串进行sha1加密  ,
    开发者获得加密后的字符串可与signature对比,
    标识该请求来源于微信
Java代码
  1.   */
  2.   public boolean check(){  
  3.   String token=Token;
  4.   String sn = request.getParameter('signature');  //取验证请求信息
  5.   String ts = request.getParameter('timestamp');  //取验证请求信息
  6.   String nonce = request.getParameter('nonce');  //取验证请求信息
  7.   String[] tmpArray={token,ts,nonce};  
  8.   Arrays.sort(tmpArray);  
  9.   String tmpStr=this.ArrToStr(tmpArray);//数组转字符串  
  10.   tmpStr=this.SHA1Encoding(tmpStr);  //调用sha1加密
  11.   if(tmpStr.equalsIgnoreCase(sn)){ //将加密后的信息与服务器计算完的验证信息对比
  12.     return true;  
  13.   }else{  
  14.     return false;  
  15.   }  
  16. }  
  17. //向请求端返回数据  
  18. public void back(String outPut){  
  19.   try{  
  20.     response.getWriter().print(outPut);  
  21.     response.getWriter().flush();  
  22.     response.getWriter().close();  
  23.   }catch(Exception e){  
  24.   }  
  25. }  
  26. //数组转字符串  
  27. public String ArrToStr(String [] arra){  
  28.   StringBuffer buffer = new StringBuffer();  
  29.   for(int i = 0; i < arra.length;="" i++){  ="">
  30.   buffer.append(arra);  
  31.   }  
  32.   return buffer.toString();  
  33. }  
  34. //sha1加密  
  35. public String SHA1Encoding(String str) {  
  36.   String finalString = null;  
  37.   try {  
  38.   finalString = new String(str);  
  39.   MessageDigest md = MessageDigest.getInstance('SHA-1');  
  40.   finalString = byteToString(md.digest(finalString.getBytes()));  
  41.   } catch (Exception ex) {  
  42.   }  
  43.   return finalString;  
  44. }  
  45. public final String byteToString(byte[] bytes) {  
  46.   StringBuffer buffer = new StringBuffer(bytes.length * 2);  
  47.   for (int i = 0; i < bytes.length;="" i++)="" {  ="">
  48.     if ((bytes & 0xff) <>0x10) {  
  49.     buffer.append('0');  
  50.     }  
  51.     buffer.append(Long.toString(bytes & 0xff, 16));  
  52.   }  
  53.   return buffer.toString().toUpperCase();  
  54. }  
  55. //从输入流读取参数  
  56. public String readInputStreamParameter(ServletInputStream input){  
  57.   StringBuilder inputBuffer = new StringBuilder();  
  58.   BufferedReader inputReader=null;  
  59.   try{  
  60.     inputReader = new BufferedReader(new InputStreamReader(input));  
  61.     String line=null;  
  62.     while((line = inputReader.readLine())!=null){  
  63.     inputBuffer.append(line);  
  64.     }  
  65.   }catch(Exception e){  
  66.     e.printStackTrace();  
  67.   }finally{  
  68.     if(null!=inputReader){  
  69.     try {  
  70.       inputReader.close();  
  71.     } catch (IOException e) {  
  72.       e.printStackTrace();  
  73.     }  
  74.     }  
  75.   }  
  76.   return inputBuffer.toString();  
  77. }  
  78. }

上边这个类就是验证和自动回复功能的类,只要在和微信接口对接的页面调用响应的方法就可以完成验证和自动回复功能,可以看一下我调用这个类的页面,请看下边代码:

Java代码
  1. <%@page import='java.util.Date'%>  
  2. <%@page import='java.io.IOException'%>  
  3. <%@page import='java.io.InputStreamReader'%>  
  4. <%@page import='java.io.BufferedReader'%>  
  5. <%@page import='java.io.Reader'%>  
  6. <%@page import='java.security.MessageDigest'%>  
  7. <%@page import='java.util.Arrays'%>  
  8. <%@page import='cpbc.base.support'%>  
  9. <%@ page language='java' contentType='text/html; charset=utf-8' pageEncoding='utf-8'%>  
  10. <%  
  11.   String TOKEN='weixin';
  12.   support handler=new support(TOKEN,request,response);  
  13.   handler.answer();
  14. %>  

这个页面就是调用验证和自动回复的页面,也就是跟微信公众平台对接的页面。
接下来还有......


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Struts2文件的上传和下载
Android端通过HttpURLConnection上传文件到服务器
java操作文件
LocalSocket实现进程间通信
socket1
基于SMB/JCIFS协议的共享文件上传和下载
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服