文档章节

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

陆朋
 陆朋
发布于 2014/04/23 16:23
字数 451
阅读 408
收藏 21
点赞 0
评论 0
  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
博文 30
码字总数 29925
作品 0
深圳
后端工程师
《成神之路-基础篇》JVM——垃圾回收(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 ...

⋅ 05/05 ⋅ 0

JavaWeb项目对接微信扫码支付

项目地址:wxpay github repo 当我接到对接微信支付的开发任务时,我的第一反应是查看官方文档,但是官方文档并不是十分简洁易读(可能是我能力有限),且可能由于开发者习惯不同或业务场景不同...

可乐味儿的白衬衫 ⋅ 05/29 ⋅ 0

《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

⋅ 05/05 ⋅ 0

一大波编程视频资料赠送(亲自整理)

为了感恩大家长久以来的关注和支持,小编准备了一些福利,整理了包含前端,Java,产品经理,微信小程序,Python,网站源码,Android应用视频教程,微信公众平台开发教程及材料等资源合集大放...

祈澈姑娘 ⋅ 05/08 ⋅ 0

《成神之路-基础篇》JVM——JVM内存结构(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是《成神之路系列文章》的第一篇,主要是关于JVM的一些介绍。 持续更新中 参考文章: Java虚拟机的内存组成以及堆内存介绍 Java堆和栈...

⋅ 05/05 ⋅ 0

轻量级支付整合轻松嵌入任何系统 - pay-java-parent

轻量级支付模块集成(微信支付,友店扫码,支付宝,富友,银联, payoneer皮卡 )支付整合,app,扫码,即时到帐刷卡付条码付、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实...

egzosn ⋅ 2017/02/17 ⋅ 8

Java虚拟机标准(第10版)第一章(节选)翻译与评注

英文原文链接:https://docs.oracle.com/javase/specs/jvms/se10/html/jvms-1.html 评注是括在鱼尾号之间的文字,其余均为翻译 Java虚拟机是Java平台的基石,这种技术实现了诸如跨平台、生成...

Jelif ⋅ 06/03 ⋅ 0

RMI:Java中的分布式计算框架

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实...

qq_39521554 ⋅ 05/15 ⋅ 0

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

微信小程序开发实战1:通过shareTicket获取分享群的OpenGId

玩过微信小程序的都知道,如果有群排行就必然要获取群的唯一id(OpenGId)。 但是OpenGId的获取必须通过加密数据:encryptedData、加密向量iv获取,对于encryptedData的解密微信官方提供了P...

qicong88 ⋅ 05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 8分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 12分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 25分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 44分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部