文档章节

java 实现微信公众平台的接口

陆朋
 陆朋
发布于 2014/04/23 16:23
字数 451
阅读 408
收藏 21
  1. <%@page  import="java.util.Date"%>

  2. <%@page  import="org.dom4j.Element"%>

  3. <%@page  import="org.dom4j.DocumentHelper"%>

  4. <%@page  import="org.dom4j.Document"%>

  5. <%@page  import="java.io.IOException"%>

  6. <%@page  import="java.io.InputStreamReader"%>

  7. <%@page  import="java.io.BufferedReader"%>

  8. <%@page  import="java.io.Reader"%>

  9. <%@page  import="java.security.MessageDigest"%>

  10. <%@page  import="java.util.Arrays"%>

  11. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

  12. <%

  13. //WeiXinHandler为内部类不能使用非final类型的对象

  14. final String TOKEN="weixin";

  15. final HttpServletRequest final_request=request;

  16. final HttpServletResponse final_response=response;

  17. %>

  18. <%

  19. class WeiXinHandler{

  20. public void valid(){

  21. String echostr=final_request.getParameter("echostr");

  22. if(null==echostr||echostr.isEmpty()){

  23. responseMsg();

  24. }else{

  25. if(this.checkSignature()){

  26. this.print(echostr);

  27. }else{

  28. this.print("error");

  29. }

  30. }

  31. }

  32. //自动回复内容

  33. public void responseMsg(){

  34. String postStr=null;

  35. try{

  36. postStr=this.readStreamParameter(final_request.getInputStream());

  37. }catch(Exception e){

  38. e.printStackTrace();

  39. }

  40. //System.out.println(postStr);

  41. if (null!=postStr&&!postStr.isEmpty()){

  42. Document document=null;

  43. try{

  44. document = DocumentHelper.parseText(postStr);

  45. }catch(Exception e){

  46. e.printStackTrace();

  47. }

  48. if(null==document){

  49. this.print("");

  50. return;

  51. }

  52. Element root=document.getRootElement();

  53. String fromUsername = root.elementText("FromUserName");

  54. String toUsername = root.elementText("ToUserName");

  55. String keyword = root.elementTextTrim("Content");

  56. String time = new Date().getTime()+"";

  57. String textTpl = "<xml>"+

  58. "<ToUserName><![CDATA[%1$s]]></ToUserName>"+

  59. "<FromUserName><![CDATA[%2$s]]></FromUserName>"+

  60. "<CreateTime>%3$s</CreateTime>"+

  61. "<MsgType><![CDATA[%4$s]]></MsgType>"+

  62. "<Content><![CDATA[%5$s]]></Content>"+

  63. "<FuncFlag>0</FuncFlag>"+

  64. "</xml>";

  65.  

  66. if(null!=keyword&&!keyword.equals(""))

  67. {

  68. String msgType = "text";

  69. String contentStr = "Welcome to wechat world!";

  70. String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);

  71. this.print(resultStr);

  72. }else{

  73. this.print("Input something...");

  74. }

  75.  

  76. }else {

  77. this.print("");

  78. }

  79. }

  80. //微信接口验证

  81. public boolean checkSignature(){

  82. String signature = final_request.getParameter("signature");

  83. String timestamp = final_request.getParameter("timestamp");

  84. String nonce = final_request.getParameter("nonce");

  85. String token=TOKEN;

  86. String[] tmpArr={token,timestamp,nonce};

  87. Arrays.sort(tmpArr);

  88. String tmpStr=this.ArrayToString(tmpArr);

  89. tmpStr=this.SHA1Encode(tmpStr);

  90. if(tmpStr.equalsIgnoreCase(signature)){

  91. return true;

  92. }else{

  93. return false;

  94. }

  95. }

  96. //向请求端发送返回数据

  97. public void print(String content){

  98. try{

  99. final_response.getWriter().print(content);

  100. final_response.getWriter().flush();

  101. final_response.getWriter().close();

  102. }catch(Exception e){

  103.  

  104. }

  105. }

  106. //数组转字符串

  107. public String ArrayToString(String [] arr){

  108. StringBuffer bf = new StringBuffer();

  109. for(int i = 0; i < arr.length; i++){

  110. bf.append(arr[i]);

  111. }

  112. return bf.toString();

  113. }

  114. //sha1加密

  115. public String SHA1Encode(String sourceString) {

  116. String resultString = null;

  117. try {

  118. resultString = new String(sourceString);

  119. MessageDigest md = MessageDigest.getInstance("SHA-1");

  120. resultString = byte2hexString(md.digest(resultString.getBytes()));

  121. } catch (Exception ex) {

  122. }

  123. return resultString;

  124. }

  125. public final String byte2hexString(byte[] bytes) {

  126. StringBuffer buf = new StringBuffer(bytes.length * 2);

  127. for (int i = 0; i < bytes.length; i++) {

  128. if (((int) bytes[i] & 0xff) < 0x10) {

  129. buf.append("0");

  130. }

  131. buf.append(Long.toString((int) bytes[i] & 0xff, 16));

  132. }

  133. return buf.toString().toUpperCase();

  134. }

  135. //从输入流读取post参数

  136. public String readStreamParameter(ServletInputStream in){

  137. StringBuilder buffer = new StringBuilder();

  138. BufferedReader reader=null;

  139. try{

  140. reader = new BufferedReader(new InputStreamReader(in));

  141. String line=null;

  142. while((line = reader.readLine())!=null){

  143. buffer.append(line);

  144. }

  145. }catch(Exception e){

  146. e.printStackTrace();

  147. }finally{

  148. if(null!=reader){

  149. try {

  150. reader.close();

  151. } catch (IOException e) {

  152. e.printStackTrace();

  153. }

  154. }

  155. }

  156. return buffer.toString();

  157. }

  158. }

  159. %>

  160. <%

  161. WeiXinHandler handler=new WeiXinHandler();

  162. handler.valid();

  163. %>

© 著作权归作者所有

共有 人打赏支持
陆朋
粉丝 6
博文 37
码字总数 30045
作品 0
深圳
后端工程师
私信 提问
Java微信开发_00_资源汇总贴

1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E......

rayner
2017/08/07
0
0
微信公众帐号开发教程第4篇-消息及消息处理工具的封装

工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用。这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平...

bliver
2013/11/29
0
2
微信公众平台开发教程新手解惑40则

【编者按】由CSDN和《程序员》杂志联合主办的 2014年微信开发者大会 将于8月23日在北京举行,邀请了来自于一线的微信开发商技术负责人或资深工程师从企业应用开发高级篇、智能客服与LBS、微信...

DavidBao
2015/04/29
0
0
微信开发 Java SDK - Weixin Java Tools

微信开发 Java 开发工具包(SDK),支持包括微信支付、微信开放平台、小程序、企业号/企业微信、公众号(包括服务号和订阅号)等的后端开发。 本开发工具包基于chanjarster的同名SDK,增加了...

班纳睿
2016/12/22
0
95
在百度BAE2.0 JAVA环境下搭建属于自己的微信公众平台接口

在讲之前先唠几句,之前闲来无事接触微信搞到现在已经有一段时间了。期间折腾过很多东西。本来想在微信上搞点实质性的东西,搞着搞着就搞成娱乐的玩意了。不过也好,朋友们无聊的时候拿来当成...

using
2013/10/10
0
18

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
47分钟前
0
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
3
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
3
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部